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 的值)