MariaDBでのバックアップとリストア
MariaDBにおいてデータベースダンプを行い、それをリストアする際に、
- リストア先データベースに、既に同じテーブルが存在していたらどうなるのか?
- データベース自体は作成できるのか?もし既に同じデータベースが存在していたらどうなるのか?
を調査した。使用したのはMariaDB 10.4。結論から言うと、
- 既に同じ名称のテーブルが存在していたら、それは削除される。
- その上でテーブルが作成される。
- リストア時にデータベース自体を作成するかどうかはダンプ時のオプションによる。ただしこの場合、別の名称のデータベースにはリストア不可。
何のオプションも無しに使用した場合
sampleというデータベースを作成し、testというテーブルを作っておく。
mysqldump -u ユーザ -pパスワード sample > sample.sql
でバックアップすると、その中身には大雑把に以下の記述がある。
DROP TABLE IF EXISTS `test`;
....
CREATE TABLE `test` (
.....
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
.... 以下TESTテーブルのデータが続く
したがって、以下の単純なリストアを行った場合、sampleデータベース内に既にTESTテーブルがあると、それはいったん削除されてから再度テーブル作成される。
...この方式では既にsampleデータベースが存在しなければならない。testテーブルはあっても無くてもよい...
mysql -u ユーザ名 -pパスワード sample < sample.sql
※もちろん、この方式では別の名前のデータベースにリストアしてもよい。
create database tttt default character set utf8
....
mysql -u ユーザ名 -pパスワード tttt < sample.sql
データベース強制作成オプション
バックアップ時に–databasesオプション(ハイフンは二つ)をつけると、リストア時にデータベース作成をするダンプが作成される。
mysqldump -u ユーザ -pパスワード --databases sample > sample-force.sql
この中身は以下だ。
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `sample` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `sample`;
... 以下TESTテーブルの定義が続く....
データベース名称まで指定されているので、リストアにはDB名称を指定する必要は無い。以下だけでリストアされる。
.... sampleデータベースはあっても無くてもよい ....
mysql -u ユーザ名 -pパスワード < sample-force.sql
他のデータベース名へのリストアは?
結論から言うとできない。ダンプファイルの中にしっかり「USE sample
」と記述されてしまっているので、他のデータベースにリストアすることはできないようだ。
※もしかしたらオプションで何とかなるのかもしれないが、調べていない。
したがって、仮に以下を実行しても、
create database tttt default character set utf8
....
mysql -u ユーザ名 -pパスワード tttt < sample-force.sql
ttttにはリストアされない。相変わらずsampleにリストアされてしまう。