MySQL-線上數據遷移實戰記錄


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM