バックアップと復元のメモ

特定のデータベースをバックアップ&復元する方法

mysqldumpでバックアップ&復元 - phpspot から。

バックアップ

$ mysqldump -u root -p データベース名 > dump.sql

復元

$ mysql -u root -p データベース名 < dump.sql


保存される場所は、今いるディレクトリの中。

特定のテーブルをバックアップ&復元する方法

MySQL テーブル単位でのデータバックアップ・復元 - スポンサー広告MYSQL から。

まずはMySQLクライアントを起動して、目的のテーブルがあるデータベースを開く。

$ mysql -u root -p ...この後パスワード入力
mysql> USE データベース名;

バックアップ

mysql> select * INTO OUTFILE 'dump.txt' from テーブル名;

復元

mysql> LOAD DATA INFILE 'dump.txt' INTO TABLE テーブル名;


私はAサーバからBサーバへのテーブル単位のデータ移動が目的だったんだけど、2つのエラーに直面したのでそれもメモ。

文字コードの違いによるエラー

ERROR 1366 (HY000): Incorrect string value: '\x00\x00\x00\x00\x00\x00...' for column 'name' at row 1

AサーバがUTF-8でBサーバがSJISになってた。
Bサーバの他のデータベースに影響が出ると困るので、特定のデータベースだけ文字コード変更。
データベース属性(文字セットと照合順序)を変更する(ALTER DATABASE文) | MySQLの使い方 を参考に。

ALTER DATABASE データベース名 CHARACTER SET utf8;
プライマリキーの重複

ERROR 1062 (23000): Duplicate entry 'X' for key 1

もともとBサーバにあったデータを、Aサーバで変更してBサーバに戻そうとしていたのでこうなった模様。
これの対処法は、MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.6 LOAD DATA INFILE 構文 を参考に。

mysql> LOAD DATA INFILE 'dump.txt' REPLACE INTO TABLE テーブル名;

このように、ファイル名の後に「REPLACE」キーワードを付けることで上書きが出来る。

その他、細かいこと

'〜〜〜〜/dump.txt' not found (Errcode: 2)

'〜〜〜〜'にファイルを移動するか、INFILEの前に「LOCAL」キーワードを付けて今いるディレクトリのファイルを参照させる。

mysql> LOAD DATA LOCAL INFILE 'dump.txt' REPLACE INTO TABLE テーブル名;

Access denied for user: 'xxxxx@localhost' (Using password: YES)

Access deniedエラー
ユーザにFILE 権限が有効化されていない。
(最初、データベース専用のユーザでやろうとしてこのエラーが出た。面倒だったのでrootでやった。)


という感じで、無事バックアップ&復元完了しました!