1. 遷移背景和限制條件 隨著功能的迭代或者數據表中數據量的增加,將現有數據進行遷移已是工作中經常遇到的事情。通常我們在平時遷移數據數據的時候,只需要用mysqldump、mysqlimport指令就能完成遷移功能,但在實際工作中,作為開發者的我們往往沒有這麼大的許可權(例如寫許可權)來操作線上數據,只 ...
1. 遷移背景和限制條件
隨著功能的迭代或者數據表中數據量的增加,將現有數據進行遷移已是工作中經常遇到的事情。通常我們在平時遷移數據數據的時候,只需要用mysqldump、mysqlimport指令就能完成遷移功能,但在實際工作中,作為開發者的我們往往沒有這麼大的許可權(例如寫許可權)來操作線上數據,只能想辦法根據已有的許可權(通常是從庫的讀許可權)生成插入數據的SQL文件,再將文件交給DBA進行執行,從而完成遷移工作。
2. 數據遷移記錄
- 在只有讀許可權的情況下,可以通過mysqldump命令導出資料庫中的數據:
mysqldump -h127.0.0.1 -uadmin -proot database table > /home/work/data.sql;
- 但是mysql下需要lock tables許可權才能使用mysqldump,可以使用以下方式解決:
mysqldump -h127.0.0.1 -uadmin -proot database table --skip-lock-tables > /home/work/data.sql
- 如果需要對導出的數據添加篩選條件:
mysqldump -h127.0.0.1 -uadmin -proot database table --where="id<100" --skip-lock-tables > /home/work/data.sql
- 如果要對欄位進行篩選,從而達到遷移部分欄位的目的,可以用以下方式:
mysql -h127.0.0.1 -uadmin -proot database -e "SELECT id, name FROM table INTO OUTFILE '/home/work/data.sql'"
- but,往往對於線上資料庫我們是沒有寫許可權的,所以上面那條語句往往不能執行,我們可以先將數據生成到本地:
mysql -h127.0.0.1 -uadmin -proot -Ne "USE database; SELECT id, name FROM table;" > /home/work/data.txt
- 然後在本地創建相同的庫和對應欄位的表,並將導出的數據文件導入到本地的資料庫中:
load data infile '/home/work/data.txt' into table table_name
- 如果報以下錯:ERROR 13 (HY000): Can't get stat of '/home/work/data.txt' (Errcode: 13),則:
load data local infile '/home/work/data.txt' into table table_name
- 最後,再用mysqldump生成可執行的SQL文件(因為是本地,所以可以用root賬戶,不需要加 skip-lock-tables 參數):
mysqldump -h127.0.0.1 -uroot -proot database table > /home/work/data.sql
- 加上 no-create-info 則不會生成創建表的語句,加上 default-character-set 可以指定字元集:
mysqldump -h127.0.0.1 -uroot -proot --no-create-info --default-character-set=utf8 database table > /home/work/data.sql
- 接著我們就可以拿著生成好的SQL文件交給DBA執行遷移工作啦~
Tips:在創建資料庫的時候,如果不指定字元集,則預設是latin1,此時用mysqldump進行導出時,需要指定字元集為latin1才不會亂碼,可以使用命令:show variables like 'character_set_%'; 來查看資料庫的編碼方式(關註 character_set_database 的值)