2.5 動的キャッシュ割り当て
SQL Anywhereでは、必要に応じて、メモリ上のキャッシュサイズが動的に変更される。通常1分間隔で見直され、キャッシュが増減する。ただし、起動直後や急激にデータが増加した直後は、見直し間隔が短縮されて5秒ごとになり、これが30秒間持続する。変動しすぎることを避けるため、大幅に増減させる必要がある場合でも徐々に変わるようになっている。キャッシュの増減にあたっては、システムの負荷状況を参照し、ほかのプロセスがメモリを必要とするようであればSQL Anywhereで使用するキャッシュの割り当てサイズは控えめになる。
ただし、Linux上では、キャッシュの「動的割り当て」の意味が若干異なる。物理メモリとスワップ領域の合計をここではシステムリソースと呼ぶことにすると、SQL Anywhereは起動時に、システムリソースに対して一定量を確保する。この量は変化しないが、物理メモリとスワップ領域との構成比は動的に変わる。これが「動的割り当て」の意味である。
なお、Windows CEでは、キャッシュを動的に割り当てる機能はない。
キャッシュサイズの指定
キャッシュに割り当てられる初期値や最大値は、デフォルトでは、物理メモリの量やデータベースサイズなどから算出される。ここで注意すべき点は、デフォルトの最大値が次のように決まっている点だ。
プラットフォーム | キャッシュサイズの最大値 |
Windows | 256MB |
Windows CE | 600KB |
Linux | 256MB |
そのため、大きなキャッシュサイズが必要な場合は、初期値や最大値を指定したり、キャッシュサイズを固定したりするとよい。キャッシュに割り当てる初期値は-cオプションで指定する。最大値・最小値は、それぞれ -ch・-clオプションで指定する。
$ dbsrv9 -c 100M -ch 500M -cl 50MB asademo.db
キャッシュサイズを固定するには、-caオプションでゼロ(0)を指定する。
$ dbsrv9 -ca 0 -c 400M asademo.db
キャッシュサイズを指定する際には、G(ギガバイト)・M(メガバイト)・K(キロバイト)という単位を使用できる。さらに、物理メモリに対する百分率で指定することも可能で、単位にPを用いる。
どのくらい割り当てるべきか
キャッシュサイズの見当をつけるには、次のように実験してみるとよい。まず、できるだけ大きなサイズ[A](たとえば物理メモリ量)を最大値として、データベースを起動し、アプリケーションを実行するなどして負荷をかける。しばらく様子を見てから、どの程度のキャッシュが実際に割り当てられたかを確認する。それには、PeakCacheSizeデータベースオプションで、割り当てられた最大値[B]を調べる。次のコマンドを実行する。
SELECT property ( 'PeakCacheSize' )
BがAよりも小さい場合は、B程度のキャッシュがあれば十分なので、それを初期値や最大値としてデータベースを運用する。BがAと同程度のときは、B(=A)程度のキャッシュを設定するしかないが、物理メモリが不足している可能性がある。すなわち、もっとキャッシュがあれば、パフォーマンスの向上が望めるので、メモリの増設を検討するとよい。
AWEによるメモリ割り当て
Windows 2000/XPやWindows Server 2003では、大容量のメモリを使用するためにAWE(Address Windowing Extensions)という機能がある。たとえば、Windows Server 2003 Enterprise Editionでは、OSとして32GBのメモリをサポートするが、AWEを使わない場合、2.7GBまでしかデータベースサーバに割り当てられない。
-cwオプションを指定すると、AWEによるメモリの割り当てが行われ、大きなサイズを確保することができる。ただし、キャッシュサイズの動的な割り当ては行われず、初期値で指定した量に固定される。
$ dbsrv9 -c 20G -cw asademo.db
2.5.1 Cache Warming機能
データベース起動直後のキャッシュにはデータがなく、データが保存され、安定したパフォーマンスが出るまで多少の時間がかかる。この問題に対処するのがCache Warming機能だ。これにより、データベース終了時点などで、キャッシュの状態がデータベースに保存され、次回起動時に再利用される。そのため、起動直後からキャッシュヒットを期待できる。
Cache Warming機能はデフォルトでオンになっている。使用したくない場合は、データベースサーバの-ccオプションや-crオプションでオフにする。
2.6 ユーザの作成
データベースにはユーザを作成できる。データベース内のテーブルやストアドプロシージャは、作成したユーザがオーナーとなり、オーナーがほかのユーザへアクセス権限を与える。テーブルを参照する権限を特定のユーザのみに限定したり、ストアドプロシージャの実行権限を制限したりすれば、データベースのセキュリティが高まる。ユーザの数が多いときは、ユーザをグループに分類し、グループ単位で管理するとよい。
なお、DBA権限という特殊な権限があり、この権限を持つユーザは(特別な設定なしに)データベース内のあらゆる権限を持つことができる。SQL Anywhereでは、デフォルトで、「DBA」という名前のユーザがあり(パスワードは「SQL」)、このユーザはDBA権限を持つ。データベース作成後、DBAユーザで必要なユーザやグループを作成し、DBAユーザを削除するか最低限パスワードを変更するのがセキュリティの観点からは望ましい(注3)。パスワード変更方法は後述する。
ユーザの作成
ユーザを作成するには、GRANT CONNECT文を用いる(注4)。
GRANT CONNECT TO user1 IDENTIFIED BY password1;
これで、user1が作成され、このユーザはpassword1というパスワードで接続できる。だが、このままではuser1は接続しかできないので、ほかの適切な権限を与える。たとえば、テーブルを作成する権限を与えるには、RESOURCE権限を与えればよい。
GRANT RESOURCE TO user1;
ほかのユーザother_userが所有するテーブルをuser1が参照できるようにするには、そのテーブルの参照権限があればよいので、オーナーであるother_user(もしくはDBA権限を持つユーザ)が、次のように権限を与える。
GRANT SELECT ON other_user.some_table TO user1;
権限には以下のものがある(表2.4)。参照や更新などが別々の権限となっているので、細かく管理できる。
権限名 | 可能な構文 |
SELECT | SELECT文 |
INSERT | INSERT文 |
UPDATE | UPDATE文 |
DELETE | DELETE文 |
ALTER | ALTER TABLE文 |
REFERENCE | インデックスや外部キーの作成 |
ALL | 上記すべての権限 |
権限の委譲
ユーザに権限を与える権限はオーナーの特権であるが(もちろんDBAも可能)、ユーザに委譲することも可能だ。
GRANT SELECT ON other_user.some_table TO user1 WITH GRANT OPTION;
このようにWITH GRANT OPTIONを付加すれば、user1は、自分に与えられたother_user.some_tableテーブルに対するSELECT権限を別のユーザに付与できる。
DBA権限の付与
ユーザにDBA権限を与えるには、GRANT DBA文を用いる。
GRANT DBA TO user1;
デフォルトユーザのパスワード変更
前述したように、SQL AnywhereではデフォルトでDBA権限を持つ「DBA」ユーザが、「SQL」というパスワードで作成されている。データベースを運用する際は、セキュリティの面から、DBA権限を持つ別のユーザを作成し、「DBA」ユーザを削除(もしくは接続不可能)することを推奨する。少なくとも、次のようにしてパスワードを変更しておくとよい。
GRANT CONNECT TO dba IDENTIFIED BY new_password;
ストアドプロシージャの実行権限の付与
ストアドプロシージャの実行権限を与えるには、GRANT EXECUTE文を用いる。
GRANT EXECUTE ON Calculate_Report TO user1;
2.6.1 グループの作成
グループの機能は、GROUP権限として実装されている。GROUP権限を持つユーザは、ほかのユーザの親となることができ、「グループ」として振る舞う。グループ自体に権限を与えれば、そのグループに所属するユーザもその権限を与えられたことになる。
GRANT CONNECT TO group1; GRANT GROUP TO group1;
GRANT CONNECTのときにパスワードを指定していないので、このグループ(ユーザ)名で接続はできない。
グループにユーザを追加するには、以下のように実行する。
GRANT MEMBERSHIP IN GROUP group1 TO user1;
次回
次回は、主キーの生成や、指定したタイミングで特定の処理を実行する方法、データベースの移行機能などについて紹介する。社内評価や開発を目的としたSQL Anywhereの利用であれば、無償のDeveloper Editionを利用できるので、ぜひ一度、実際に試していただきたい。