Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

SQL Anywhereのデータベース管理の基礎

SQL Anywhereの魅力を探る 3

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/06/04 16:20

目次

2.5 動的キャッシュ割り当て

 SQL Anywhereでは、必要に応じて、メモリ上のキャッシュサイズが動的に変更される。通常1分間隔で見直され、キャッシュが増減する。ただし、起動直後や急激にデータが増加した直後は、見直し間隔が短縮されて5秒ごとになり、これが30秒間持続する。変動しすぎることを避けるため、大幅に増減させる必要がある場合でも徐々に変わるようになっている。キャッシュの増減にあたっては、システムの負荷状況を参照し、ほかのプロセスがメモリを必要とするようであればSQL Anywhereで使用するキャッシュの割り当てサイズは控えめになる。

 ただし、Linux上では、キャッシュの「動的割り当て」の意味が若干異なる。物理メモリとスワップ領域の合計をここではシステムリソースと呼ぶことにすると、SQL Anywhereは起動時に、システムリソースに対して一定量を確保する。この量は変化しないが、物理メモリとスワップ領域との構成比は動的に変わる。これが「動的割り当て」の意味である。

 なお、Windows CEでは、キャッシュを動的に割り当てる機能はない。

キャッシュサイズの指定

 キャッシュに割り当てられる初期値や最大値は、デフォルトでは、物理メモリの量やデータベースサイズなどから算出される。ここで注意すべき点は、デフォルトの最大値が次のように決まっている点だ。

表2.3 : キャッシュサイズの最大値
プラットフォーム キャッシュサイズの最大値
Windows 256MB
Windows CE 600KB
Linux 256MB

 そのため、大きなキャッシュサイズが必要な場合は、初期値や最大値を指定したり、キャッシュサイズを固定したりするとよい。キャッシュに割り当てる初期値は-cオプションで指定する。最大値・最小値は、それぞれ -ch・-clオプションで指定する。

例 : 初期サイズ 100MB、最大値 500MB、最小値 50MB
$ dbsrv9 -c 100M -ch 500M -cl 50MB asademo.db

 キャッシュサイズを固定するには、-caオプションでゼロ(0)を指定する。

例 : 400MBで固定
$ 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によるメモリの割り当てが行われ、大きなサイズを確保することができる。ただし、キャッシュサイズの動的な割り当ては行われず、初期値で指定した量に固定される。

例 : AWEで20GBで使用
$ 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)。パスワード変更方法は後述する。

注3
 DBA権限のユーザのパスワードを忘れて接続できなくなったという問い合わせを受けることがあるが、隠しユーザなどはないので、パスワードは忘れないこと。

ユーザの作成

 ユーザを作成するには、GRANT CONNECT文を用いる(注4)。

GRANT CONNECT TO user1 IDENTIFIED BY password1;
注4
 Windowsのログオン認証を用いる「統合化ログイン」機能もある。その際は、GRANT INTEGRATED LOGIN文を用いる。

 これで、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)。参照や更新などが別々の権限となっているので、細かく管理できる。

表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を利用できるので、ぜひ一度、実際に試していただきたい。



  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 森脇 大悟(モリワキ ダイゴ)

    1974年生まれ。神奈川県川崎市出身。京都大学理学部物理学科卒業。同大学院 修士課程中退後、有限会社グルージェント(現・株式会社グルージェント)入社。 SIとして金融や物流システムを手がける。2003年アイエニウェア・ソリューションズ株式会社入社。エンジニアとして製品の導入支援やコンサルティング業...

バックナンバー

連載:SQL Anywhereの魅力を探る

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5