1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MySQL 指定したテーブルだけdumpを取得したい

Last updated at Posted at 2022-03-06

はじめに

やりたかったこと。バックアップとして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;

テーブル作成

ageテーブルとnameテーブルを用意を行っておきます。
スクリーンショット 2022-03-06 16.20.51.png

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());

スクリーンショット 2022-03-06 16.20.59.png
無事、nameテーブルとデータが作成されました。

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());

スクリーンショット 2022-03-06 16.21.08.png
無事、ageテーブルとデータが作成されました。

①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;

スクリーンショット 2022-03-06 16.34.47.png
nameテーブルのid:1が変わりました。
次にageテーブルを変更します。

UPDATE ages SET age = 2022 WHERE id = 1;

スクリーンショット 2022-03-06 16.34.52.png
ageテーブルのid:1が変わりました。

③dumpの流し込み

では、本題に入ります。テーブル指定をしたdumpファイルを使って、nameテーブルのデータだけを変更前の状態に戻します。

mysql -u root -p dump_test_db < sql_dump_name_only;

スクリーンショット 2022-03-06 16.37.46.png

nameテーブルだけ変更前の状態に戻ってageテーブルは変更後のままですね!

(全テーブルのデータを取得したdumpを流し込む)

念の為、全テーブルのデータを取得したdumpを流して元に戻ることも確認しておきます。

mysql -u root -p dump_test_db < sql_dump_all;

スクリーンショット 2022-03-06 16.39.19.png
当たり前ですが、nameテーブルとageテーブルのどちらも元の状態に戻っていますね!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?