リストア中は当然、ロックがかかり他のユーザーは利用出来ませんが、
特定テーブルのみのリストアで済めば最小限の影響範囲に留める事が出来るかもしれません。
■テストテーブルを作成してデータを登録
root@localhost > CREATE TABLE `BR_TEST` ( -> `id` int(20) NOT NULL AUTO_INCREMENT, -> `name` varchar(32) NOT NULL DEFAULT '', -> PRIMARY KEY (`id`) -> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.16 sec) root@localhost > insert into BR_TEST(name) value("NAME-1"); Query OK, 1 row affected (0.02 sec) root@localhost > insert into BR_TEST(name) value("NAME-2"); Query OK, 1 row affected (0.02 sec) root@localhost > insert into BR_TEST(name) value("NAME-3"); Query OK, 1 row affected (0.01 sec) root@localhost >
■特定データベース全体のバックアップ
[admin@CentOS02 bin]$ mysqldump --databases --single-transaction test > /home/admin/testDB20140925.sql -u root -p Enter password: [admin@CentOS02 bin]$ ls -l /home/admin/ 合計 4 -rw-rw-r--. 1 admin admin 2877 9月 25 19:46 testDB20140925.sql [admin@CentOS02 bin]$ [admin@CentOS02 bin]$ cat /home/admin/testDB20140925.sql | grep CREATE CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET latin1 */; CREATE TABLE `BR_TEST` ( CREATE TABLE `federated_table` ( [admin@CentOS02 bin]$
■特定テーブルのみリストアするため、csplitでテーブル単位にバックアップを分割する。
[admin@CentOS02 ~]$ csplit testDB20140925.sql '/DROP TABLE IF EXISTS/' {*} 973 687 1217 [admin@CentOS02 ~]$ [admin@CentOS02 ~]$ ls -l 合計 16 -rw-rw-r--. 1 admin admin 2877 9月 25 19:46 testDB20140925.sql -rw-rw-r--. 1 admin admin 973 9月 25 19:57 xx00 -rw-rw-r--. 1 admin admin 687 9月 25 19:57 xx01 -rw-rw-r--. 1 admin admin 1217 9月 25 19:57 xx02 [admin@CentOS02 ~]$
■ リストア対象テーブル用Scriptを抜粋
[admin@CentOS02 ~]$ cat xx01 DROP TABLE IF EXISTS `BR_TEST`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `BR_TEST` ( `id` int(20) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `BR_TEST` -- LOCK TABLES `BR_TEST` WRITE; /*!40000 ALTER TABLE `BR_TEST` DISABLE KEYS */; INSERT INTO `BR_TEST` VALUES (1,'NAME-1'),(2,'NAME-2'),(3,'NAME-3'); /*!40000 ALTER TABLE `BR_TEST` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `federated_table` -- [admin@CentOS02 ~]$
■対象テーブルを間違えてTruncateしたと仮定してデータ削除
root@localhost > truncate table BR_TEST; Query OK, 0 rows affected (0.09 sec) root@localhost > select count(*) from BR_TEST; +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec) root@localhost >
■特定テーブルのリストア処理とデータが戻っていることを確認
[admin@CentOS02 ~]$ mysql -u root -p test < /home/admin/xx01 Enter password: [admin@CentOS02 ~]$ root@localhost > select count(*) from BR_TEST; +----------+ | count(*) | +----------+ | 3 | +----------+ 1 row in set (0.01 sec) root@localhost >
余談:
■対象テーブルがトランザクション中だと、リストアは待たされます。
反対にリストア中はテーブルは参照出来ません。
root@localhost > lock table BR_TEST READ; Query OK, 0 rows affected (0.00 sec) <----この間はリストアも待ちになります。 root@localhost > UNLOCK TABLES; Query OK, 0 rows affected (0.00 sec) root@localhost > select * from BR_TEST; +----+--------+ | id | name | +----+--------+ | 1 | NAME-1 | | 2 | NAME-2 | | 3 | NAME-3 | +----+--------+ 3 rows in set (0.00 sec)
root@localhost >