2011年4月27日水曜日

SQL Server 2008 Express インストール

最近は、データベースもコストダウンの対象になり
無償版を利用することが多くなった。

SQL Server 2008 R2 Expressは、データベースサイズの上限が
10Gbytesまで拡大されたため、活用できる範囲が多いと感じる。

以下の手順は、稼働中のWindows 2003 Serverへ導入した記録である。
ネットにつなげない環境であったため、事前にインストーラーを
準備してからセットアップを開始した。

■インストールが必要なもの
Windows インストーラ 4.5 (再起動が必要です)
Windows PowerShell 1.0
Microsoft .Net Framework 3.5 SP1
Microsoft .Net Framework 3.5 Langpack
SQL Server 2008 Express with Advanced Services
(Management Studioを含む)

※OSのバージョンによっては、インストール物が上記と
異なる場合があるため、事前に確認すること

※ネットにつなげない環境の場合
Frameworkをインストールする場合、コマンドプロンプトから
「dotnetfx35.exe /lang:enu」のオプションでスキップ可能

■インストール時の選択内容
「SQL Server 2008 Express with Advanced Services」
機能
・データベースエンジンサービス
・管理ツールー基本
・SQLクライアント接続SDK
インスタンス構成
・規定のインスタンス
サービスアカウント
・サーバのログイン名、パスワード入力
認証モード
・混合モード
・管理者の指定
administratorを選択

■データベースメモリ設定
「max server memory」を設定します
物理メモリより小さくし、いくらか空きメモリは残すこと

■データベースの作成
データベース名を入力

■モード設定
ALTER DATABASE データベース名
SET READ_COMMITTED_SNAPSHOT ON
これは、必要に応じて設定します

■ユーザー設定
USE データベース名
CREATE LOGIN ログイン名 WITH PASSWORD = 'パスワード文字列' , DEFAULT_DATABASE = データベース名
CREATE USER ユーザー名 FOR LOGIN ログイン名 WITH DEFAULT_SCHEMA = dbo
※ログイン名、パスワード文字列、ユーザー名に任意の名称をセット

■権限の設定
Management Studio→セキュリティ→ログイン→作成したユーザー名を選択
サーバーロールを選択
以下の項目にチェックを入れる
「serveradmin」
「sysadmin」

■ネットワーク設定
構成マネージャを起動
SQL Serverのネットワーク構成を選択
プロトコルを選択
TCP/IPを選択し、右クリックで「有効」選択
名前つきインスタンスの場合、「IPALL」のTCPポートを1433にセット
SQL Serverのサービスを再起動する
※Expressエディションは、名前付きインスタンスのため、上記設定が必要

■ポート設定
TCP アクセス用に Windows ファイアウォールのポートを開く
Windows ファイアウォール→例外→ポート追加
ポート番号:1433
TCPが選択されていること

以上を設定後、ネットワーク越しにDBに接続できるか確認すること
※データベースに個人情報などを入れる場合は、セキュリティ機器を設置したり
データを暗号化するなど十分な対策を講じること

2011年4月23日土曜日

SQLServerで独立トランザクション

SQLServerは、ログを取りたいのだが、最後にロールバックされると
すべて戻ってしまう。これでは、トラブルの原因を調べる際にとても不便だ。

オラクルでは、「PRAGMA AUTONOMOUS_TRANSACTION」句で
独立トランザクションが簡単に実現できる。

SQLServerでも、同じ事ができないか?
SQLServer2008だと可能である。手順は以下の通り

■ループバックを設定
USE MASTER
GO
EXEC sp_addlinkedserver @server = N'loopback',@srvproduct = N' ',@provider = N'SQLNCLI', @datasrc = @@SERVERNAME
GO
EXEC sp_serveroption loopback,N'remote proc transaction promotion','FALSE'
EXEC sp_serveroption loopback,N'RPC OUT','TRUE' -- Enable RPC to the given server.
GO

■使い方
EXECUTE [loopback].[DB名].[dbo].[独立して実行したいストアド名]

これで、最後に「ROLLBACK TRANSACTION 」が実行されたとしても
ロールバックされずに済む。

■欠点
パフォーマンスが良くない。
ただ、ループ内などで連続で呼んだりしなければ、実用に耐える。
気になる方は、実験してから利用することを勧める。

SQLServer リソースプールinternalのメモリ不足です

■原因について
「max server memory」を指定していない場合、
物理メモリをすべて食い尽くし、SQLServer自体で
利用するメモリが不足するためと考えられる。
SQLServerの仕様のようだが、本番で発生すると痛い。

■対処法
   「max server memory」を設定して下さい。
物理メモリより当然少なくし、OSが利用する分、
SQLServerが利用する分を差し引いた残りを設定する。
トラブル時で時間がないときは、とりあえずサーバ再起動が早道

■詳細
「max server memory」の既定値は2,147,483,647Mbytes
となっている。既定値のままだとどんどんメモリを食う。
消費したメモリは、どこに使われたかというと
「バッファキャッシュ」という所に割り当てられている。
これは、あらかじめディスクから読み込んだデータを
メモリ上に展開しておき、次回から高速に応答できるようにしている。

SQLServerのバッファキャッシュが解放される条件は、
内部的に空き容量(Free Pages)の状態かつ
1)コンピュータを再起動した場合
2)他のアプリケーションからのメモリ要求が発生した場合
だそうだ。

「DBCC DROPCLEANBUFFERS」というコマンドがあるが
これは、物理的にメモリを解放せず、メモリ使用量は減らない。

2011年4月14日木曜日

SQLServer2008 ログファイルサイズを縮小する

デフォルト自動拡張がONになっていて、ディスク容量を
食いつぶした場合に有効な方法

■バックアップを取る

--USBメモリなどにとりあえずバックアップ
USE MASTER
BACKUP LOG DB名 TO DISK = 'D:\backup.bak'

定期的にバックアップをバッチで取る場合は、
BACKUP LOG DB名 TO DISK = 'D:\backup.bak' WITH INIT
として、バックアップが1つだけ残るようにする

■論理名を取得

USE DB名
SELECT name FROM sys.database_files

■ログファイルを圧縮

DBCC SHRINKFILE (取得した論理名, サイズMB)

■自動拡張の上限をセット

対象のDBを選択してプロパティを表示
ファイルを選択し、自動拡張の欄で最大サイズを入力

■最後に
ディスクの空き容量を確認して、増えていればOK

2011年4月13日水曜日

Windows7 64bit + Oracle + Access2007 でリンクテーブル

■ODBCの設定をする
C:\Windows\SysWOW64\odbcad32.exe を起動する
※64bitOS特有の起動手順

ユーザーDSNを選択
Microsoft ODBC for Oracleを選択
データソース名は任意
ユーザー名は、DBのユーザー名
サーバーは、サーバ名:1521/DB名
※DB名はTNS名ではなくSIDを指定する
※1521はポート番号でデフォルトこの値で問題ない

■リンクテーブルを張る
外部データの取込→ODBCデータベースを選択
リンクテーブルを作成してソースデータにリンクするを選択
コンピュータデータソースのタブを選択
先ほど作成したデータソース名をクリック
パスワードを入力して、リンクしたいテーブルを選択する

☆ リンクテーブルで全角文字などが「?」のように文字化けした場合
SQLPLUSで以下を確認する
SQL> select parameter ,value from nls_database_parameters where parameter like  '%CHARACTERSET';
  
コマンドプロンプトから「regedit」起動
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx の NLS_LANGを確認する

マイコンピュータのプロパティから
設定の変更→詳細設定→環境変数→ユーザー環境変数
NLS_LANGを新規登録し、値は先ほどの2カ所と一致している値をセットする
(例: JAPANESE_JAPAN.JA16SJISTILDE)

リンクテーブルを開きなおすと全角文字が正しく表示される

2011年4月4日月曜日

ブログ開始

今日からブログを開始しました
とりあえずメモ代わりに使おう