はじめに
やりたかったこと。バックアップとしてdumpファイルを取得したいけど、特定のテーブルのバックアップだけが欲しい。
特定のテーブルに変更を加える作業がある場合、事前にdumpをとっておくことはよくあると思います。もし、問題があったときにdumpで作業前の状態に戻したいけど、他のテーブルはユーザーが触ってデータが増えているかもしれないからテーブル全てを作業前に戻したくはない。
といった場面など。。
環境
・docker
・MySQL v.8.0.27
結論
データベース名の後にテーブル名をつけるだけです。
mysqldump --single-transaction -u {ユーザー名} -p {データベース名} {テーブル名} > {dumpファイル名}
流し込む時もそのままdumpファイルを指定して流すだけでOKです。
mysql -u {ユーザー名} -p {データベース名} < {取得したdumpファイル名}
検証
データベース名の後にテーブル名をつけるだけだけですが、一度も使ったことないことを実践で使うのは怖いので検証します。(※筆者はかなりビビリ)
⓪前準備
DB作成
dump_test_dbというデータベースを用意。
CREATE DATABASE dump_test_db;
テーブル作成
nameテーブル作成
CREATE TABLE names(
id INT(11) AUTO_INCREMENT NOT NULL,
name varchar(256) ,
updated_at datetime,
created_at datetime,
PRIMARY KEY (id));
);
INSERT文でデータ作成。中身は適当です。
INSERT INTO
names(name, updated_at, created_at)
values
("Y.K",now(),now()),
("T.A",now(),now()),
("U.K",now(),now());
ageテーブル作成
CREATE TABLE ages(
id INT(11) AUTO_INCREMENT NOT NULL,
age INT(11) NOT NULL ,
updated_at datetime,
created_at datetime,
PRIMARY KEY (id));
);
INSERT文でデータ作成。中身は適当です。
INSERT INTO ages(age,updated_at,created_at) values(10, now(), now()),(20, now(), now()),(30, now(), now());
①dumpを取得
dumpは検証用に2つ取ります。
1.全テーブルのデータの取得
mysqldump --single-transaction -u root -p dump_test_db > sql_dump_all;
2.nameテーブルのみのデータの取得
mysqldump --single-transaction -u root -p dump_test_db names > sql_dump_name_only;
②.各テーブルのレコードのデータ変更
nameテーブルとageテーブルを変更します。
UPDATE names SET name = "changed" WHERE id = 1;
nameテーブルのid:1が変わりました。
次にageテーブルを変更します。
UPDATE ages SET age = 2022 WHERE id = 1;
③dumpの流し込み
では、本題に入ります。テーブル指定をしたdumpファイルを使って、nameテーブルのデータだけを変更前の状態に戻します。
mysql -u root -p dump_test_db < sql_dump_name_only;
nameテーブルだけ変更前の状態に戻ってageテーブルは変更後のままですね!
(全テーブルのデータを取得したdumpを流し込む)
念の為、全テーブルのデータを取得したdumpを流して元に戻ることも確認しておきます。
mysql -u root -p dump_test_db < sql_dump_all;