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にリストアされてしまう。

参考