Pocket

※このページは2013/12/18に大幅に書き換えています。

仕事、特にオフィスワークをしているとDBとの関わり無しでは仕事にならない。

大規模システムから小規模なデータのまとめだったりと様々です。もちろん、大規模システムからデータを抽出し、欲しいデータに加工することだってあるだろう。
そういった意味で、MS OfficeのAccessはお手軽にデータベースを構築でき、DB初心者にも扱いやすく、リンクテーブルを使用すれば大規模システムのDBクライアントにもなるし少し工夫すれば小規模WEBシステムのDBにも出来るツールのため、使っている方も多いだろう。
そんなAccessだが、かなり厄介な制限がある。Accessのファイル形式「.mdb(Office 2007以降の場合は.accdb)」の容量上限が約2GBであるという点だ。
それは、Accessファイルの容量は「MS Office 2003」はもちろん、今後導入されることが多くなるであろう「MS Office 2010」であっても変わらない。おそらく、ファイル拡張子が2007以降と同じ「MS Office 2013」でも変わらないだろう。過去のバージョンと互換性が失われてしまうからだ。
Sponsored Links

そもそも、通常のRDBMSは一つないし複数のテーブルごとに一個の物理ファイルとして作成し、それら複数の物理ファイルを一つのデータベースとして扱う方式。たとえ一つのテーブルが一定以上の容量になったとしても、ある程度自動的にテーブルを分割するため、2GB程度で容量オーバーになることは無い。

しかし、Accessの場合はファイル「.mdb(.accdb)」にすべてのテーブルを格納してしまう。

20131217_001

今どきのファイルシステムであれば、1ファイル2GB以上のデータは簡単に作れる。ただ、過去のしがらみか(Windows 95とか98の際には、ファイルシステムにFAT16というものが使われていて、これは2GB以上のファイルが作成出来なかった。)自社のSQL Serverを入れたいためかは不明だが「.mdb(.accdb)」形式では2GB以上のデータは作れない。2GBを超えてしまうと「引数が無効です」というエラーが表示されてしまい、それ以降内部データを削除するまではデータの追加ができなくなる。

このようなエラーが起きると、その後の作業が止まってしまう。10年程度前であれば、Accessで2GB以上のデータを使うことなんて稀だったのかもしれない。しかし、今の時代、2GB程度で止まってしまうのは困る。

とはいえAccessにこのような制限があるのは事実なので、これとうまく付き合っていき、かつ対応する方法を記述する。

1.応急処置で「データベースの最適化/修復」を行う

RDBMSではおなじみとも言える作業。そもそも、Accessのテーブルにあるデータを消したといってもすぐにAccessのサイズが小さくなるわけではない。

ただ削除しただけだと、データはいぜん「.mdb(.accdb)」ファイル内に残り続け、認識されるファイルサイズは変動しない。

そこで、「削除を適用させる(ファイルサイズに反映させる)」ために、「データベースの最適化/修復」という作業を行う事で、「.mdb(.accdb)」ファイルと内部のデータとを連携させる事が出来る。

図:Accessの容量変動イメージ

20131217_002

「データベースの最適化/修復」の方法は2003の場合はこっち、2010の場合はこのページに掲載されている。

で、当たり前なんだけど、この方法はあくまでもAccessの容量と格納されているテーブルの容量に乖離があるときにしか使えない訳で、テーブルの容量が大きい場合にはこの方法では対処不可能になる。

2.Accessを分割する

要は、Accessが1ファイルごとに2GB以上の場合に問題が出るわけなのだから、複数ファイルに分けてしまえばいいということ。

20131217_003

物理的にAccessファイルを分割し、互いの連携を「リンクテーブル」というAccessの機能で行う事で対応するというもの。

これなら、Accessで作成されていたクエリも、一部以外は使い回す事が可能となる。ここでいう一部だが、テーブル更新・削除クエリ(テーブル内部のみ削除するクエリの事。紛らわしい名前…)は使い回し可能だが、テーブル追加クエリでTableA.accdbやTableB.accdbにテーブルの追加ができないため、対策が別途必要になる。

なぜかというと、リンクテーブルという機能は「Access」へのリンクを作るのではなく、「テーブル」へのリンクのためである。つまり、リンクをする対象となるテーブルをリモートで作成することが出来ない。

さらにもう一つ、根本的な問題がある。それは、テーブル1個の容量が2GBを超える場合には対応できない。

3.別のRDBMSシステムを使用し、クライアントとしてAccessを利用する。

そんなことわかってるんだよ!

と言われそうな気がする。

といっても、わざわざDBサーバを起動させるようなやり方ではない。
RDBMSの中に「SQLite」というものがある。このシステム、Accessと同じように1ファイルにテーブルデータ等を保持する形式となっているのだが、容量制限が32TBまでとなっている。これをリンクテーブル先にすればよいのだ。

実際の作業方法は以下のページを参照してもらうとわかりやすい。

AccessからSQLiteのデータベースを使用する方法
http://www.crystal-creation.com/software/tool/office/access/external/sqlite.htm

MSAccessからSQLiteを操作する
http://atm-tkd.sakura.ne.jp/pcspe/sqlite/sqlite09access.php

Accessでaccdbを使わずに他のDBを使ってみる ? SQLite編1
http://foolexp.wordpress.com/2012/06/20/access%E3%81%A7accdb%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E3%81%AB%E4%BB%96%E3%81%AEdb%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-sqlite%E7%B7%A81/



もちろん、SQLiteを使用するにもデメリットが存在する。上の3つ目のリンクに乗っているんだけど、処理が遅いということ。

現時点では、Accessの2GB制限は解除されることは無く、その方法も無い。
うまいこと工夫してやりくりするしか無いというのが現状。

追記
他のDBソフトで代用できないか、少し調べてみました。

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。