Mysql之mysqldump工具使用


mysqldump

官方文檔:https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html

mysqldump客戶端是一個mysql自帶的邏輯備份工具,可以用導出sql語句形式一次導出多個數據庫進行備份。mysqldump還可以生成csv、xml或其他定界符文本。

查看幫助

mysqldump --help

參數

-h: 主機
-P: 端口
-u: 用戶名
-p: 密碼

--databases: 指定多個數據庫,如果是一個數據庫可以不寫--databases直接寫dbname
--tables: 指定表名,以空格分開

--no-create-info, -t: 不使用create table建表和drop table語句
--no-data, -d: 不導出表數據
--extended-insert, -e: 使用具有多個VALUES列的INSERT語法。這樣使導出文件更小,並加速導入時的速度。默認為打開狀態,使用--skip-extended-insert取消選項

--complete-insert, -c:insert語句展示完整字段,在表結構字段數量不一致時使用(少的導入多的時)
--replace:使用replace into語句,當值(主鍵/唯一鍵)存在時刪除舊數據插入新數據
--insert-ignore:使用insert-ignore語句插入,當值(主鍵/唯一鍵)存在時忽略新數據保留舊數據

--skip-tz-utc:(對有timestamp字段的表有影響)跳過時區設置。不寫默認開啟時區+00:00,為了導出的數據能在各個時區的服務器中導入自動轉換為所在時區的時間,**記住原則:加了一定不能跨時區服務器執行,沒加一定不能把insert語句復制出來單獨執行!!!**
-w: 添加表條件,有timestamp字段的條件一定要跳過時區設置(--where=name)

常用命令

mysqldump -u root -p --all-databases > D:/mysql.sql  #備份所有數據庫
mysqldump -uroot -p123456 --databases db1 db2 db3 > D:/mysql.sql  #備份多個數據庫
mysqldump -hhostname -Pport -uroot -p"123456" --databases dbname > D:/mysql.sql   #遠程備份(遠程時,需要多加入-h:主機名,-P:端口號)

#帶條件導出指定表的部分數據,注意mysqldump導出時時區默認設置為+00:00,w后面的timestamp時間也會被認為是+00:00時區的數據,從而導致數據有問題
mysqldump -h222.222.221.197 -uroot -proot DBname TABLEname -t --complete-insert --skip-tz-utc -w"sys_create > '2020-12-25 16:00:00'">export.sql   

#一次性導出導入數據庫(!!!慎用,兩個服務器寫反了就完蛋了,因為導出的sql中有drop table語句)
mysqldump --host=h1 -uroot -proot --databases db1 |mysql --host=h2 -uroot -proot db2 

#導出為壓縮包,這樣會小很多,線上服務器盡量用這個,推薦!!!
mysqldump --opt -uroot -p123456 -h127.0.0.1 --databases dbname --ignore-table=dbname.table1 | gzip>/db_back/dbname_`date +%F`.zip    

常用腳本

導出多個庫的命令

這個一般用於將數據部署到一台新的數據庫上面。

mysqldump -uroot -proot --databases DB1 DB2 DB3 > script_databases.sql

某個庫的部分表完整導出

完整導出一個數據庫中的指定表,此時沒有-t參數,如果有表會先drop在create所以用replace和insert-ignore沒有意義。

mysqldump --host=192.168.XX.X -uroot -proot DBNAME --tables TB1 TB2 TB3 TB3 > script_tables.sql
pause

某張表部分數據導出

導出某個數據庫下面指定表的部分數據,t(不用drop、create表語句,只要帶t,insert-ignore/replace就沒必要了),skip-tz-utc(不會進行時區轉換,可以直接把sql復制出來執行),insert-ignore(保留舊數據,如果主鍵/唯一鍵沖突想保留新數據就用replace)。

mysqldump --host=192.168.XX.X -uroot -proot -t --skip-tz-utc --insert-ignore DBNAME --tables TABLENAME1 -w"sysdate > '2021-01-01 00:00:00'" > script_tb_data1.sql
mysqldump --host=192.168.XX.X -uroot -proot -t --skip-tz-utc --insert-ignore DBNAME --tables TABLENAME2 -w"createdate > '2021-01-01 00:00:00'" > script_tb_data2.sql
pause

導入數據

sql腳本導入到數據庫,這個在服務器上執行要慎重檢查host(host寫成線上庫就和刪庫跑路有異曲同工之妙!)

mysql --host=127.0.0.1 -uroot -proot DBNAME < script_tables.sql

注意坑

導出的insert語句不能復制出來執行

mysqldump語句導出時默認用+00:00時區的,這時導出的sql語句中timestamp都是+00:00時區的,也就是都是-8h的。所以一定要整個文件執行,不能復制出來單獨執行!!!,沒寫--skip-tz-utc的情況下一定不能把insert語句單獨拿出來執行!!!!

/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;

-w條件中timestamp條件

-w語句中timestamp字段條件的時間會被認為是+00:00時區的時間(此時庫里的timestamp在這個環境下已經是都-8h的數據了)

解決辦法:

1.使用--skip-tz-utc(這時導出的sql是不能跨時區服務器導入的)。

2.使用datetime的字段則不會被解析為+00:00時區。

報錯

error1044

【錯誤信息】: mysqldump: Got error: 1044: Access denied for user 'XXX'@'%' to database 'XXX' when doing LOCK TABLES

【報錯原因】:mysqldump 命令執行時,需要四種權限,分別是:select,show view,trigger,lock table。但是因為沒有lock table的權限,導致上述錯誤發生。

【解決方案】:

1.用具有select,show view,trigger,lock table全部權限的賬戶導出.(推薦!!!)

2.添加 --skip-lock-tables使mysqldump導出時不鎖表(據說數據量過大會卡死)

3.--single-transaction(網上解釋:此選項會將隔離級別設置為REPEATABLE READ。並且隨后再執行一條START TRANSACTION語句,讓整個數據在dump過程中保證數據的一致性,這個選項對InnoDB的數據表很有用,且不會鎖表。但是這個不能保證MyISAM表和MEMORY表的數據一致性。為了確保使用--single-transaction命令時,保證dump文件的有效性。需沒有下列語句ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,因為一致性讀不能隔離上述語句。所以如果在dump過程中,使用上述語句,可能會導致dump出來的文件數據不一致或者不可用。 )


免責聲明!

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



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