MySQL 8 導出之mysqlpump

1. mysqldump簡介

  mysqlpump是MySQL 5.7中引入的邏輯備份新功能,備份形式是SQL語句,其中大部分參數與mysqldump是相同的,可以理解爲加強版的mysqldump,神似Oracle數據庫的exp與expdp的關係,mysqlpump的功能如下:

  • 可以並行備份數據庫以及數據庫中的對象,備份速度更快;
  • 更好地控制要備份的數據庫和數據庫對象(表,存儲的程序,用戶帳戶);
  • 以CREATE USER, GRANT來備份用戶帳戶,而不是直接插入到MySQL的系統數據庫;
  • 備份文件可壓縮;
  • 備份進度可視化(估計值);
  • 備份文件恢復時,InnoDB表先建表後插入數據最後建立索引,減少了索引維護開銷,加快了恢復進程。

  執行mysqlpump的用戶必須具備的權限:SELECT備份表,SHOW VIEW備份視圖,TRIGGER備份觸發器以及 --single-transaction選項未使用時LOCK TABLES權限等,具體的權限要看實際備份對象來確定。

  來看看mysqlpump具體的參數:

[root@chengyu ~]# mysqlpump --help
mysqlpump  Ver 8.0.20 for Linux on x86_64 (Source distribution)
Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

MySQL utility for dumping data from databases to external file.
Usage: mysqlpump [OPTIONS] [--all-databases]
OR     mysqlpump [OPTIONS] --databases DB1 [DB2 DB3...]
OR     mysqlpump [OPTIONS] database [tables]

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql8/etc/my.cnf /usr/local/mysql8/my.cnf ~/.my.cnf 
The following groups are read: client mysql_dump mysqlpump
The following options may be given as the first argument:
--print-defaults        打印默認選項.
--no-defaults           不讀取選項文件.
--defaults-file=#       只讀指定的選項文件.
--defaults-extra-file=# 除了global選項文件,還讀取指定的選項文件.
--defaults-group-suffix=# 選項組後綴值(group, suffix)
--login-path=#          從.mylogin.cnf中讀取登錄路徑選項.
  -?, --help          help信息.
  --add-drop-database 在每個CREATE DATABASE語句之前添加DROP DATABASE語句.
  --add-drop-table    在每個CREATE TABLE語句之前添加DROP TABLE語句.
  --add-drop-user     在每個CREATE USER語句之前添加DROP USER語句.
  --add-locks         用LOCK TABLES和UNLOCK TABLES語句包圍每個備份表.
  -A, --all-databases 備份所有數據庫.
  --bind-address=name 使用指定的網絡接口連接到MySQL Server.
  --character-sets-dir=字符集的安裝目錄.
  --column-statistics 編寫ANALYZE TABLE語句以生成統計數據直方圖.
  --complete-insert   使用包含列名稱的完整INSERT語句.
  -C, --compress      壓縮客戶端和服務器之間發送的所有信息.
  --compress-output=name  輸出壓縮算法.
  --compression-algorithms=name 用於服務器連接的允許壓縮算法,'zstd','zlib','uncompressed'
  -B, --databases     指定數據庫,以逗號分隔.
  -#, --debug[=#]    編寫調試日誌.
  --debug-check[=#]   程序退出時打印調試信息.
  --debug-info[=#]    程序退出時打印調試信息,內存和CPU統計信息.
  --default-character-set=name 指定默認字符集.
  --default-parallelism=# 並行處理的默認線程數	
  --default-auth=name 身份驗證插件使用.
  --defer-table-indexes 在備份過程中,延遲爲每個表創建索引,直到數據備份完成,如果是InnoDB存儲引擎,則延遲創建二級索引,默認此參數開啓,禁用可以指定--skip-defer-table-indexes.
  --events            從指定的數據庫中備份事件.(默認on; 關閉使用--skip-events)
  --exclude-databases=name 不備份指定的數據庫.
  --exclude-events=name 不備份指定的事件.
  --exclude-routines=name 不備份指定的routine.
  --exclude-tables=name 不備份指定的table.
  --exclude-triggers=name 不備份指定的trigger.
  --exclude-users=name 不備份指定的user. 
  --extended-insert=# 一條INSERT語句默認會包含多行,如果要指定每個INSERT語句中包含的行數,可以設置這個值,默認爲250,值爲1時,每一行會有一個INSERT語句。
  --get-server-public-key 從服務器請求RSA公鑰
  --hex-blob          使用十六進制表示法轉儲二進制列.
  -h, --host=name     MySQL服務器所在的主機.
  --include-databases=name 指定要備份的數據庫.
  --include-events=name 指定要備份的events.
  --include-routines=name 指定要備份的routines.
  --include-tables=name 指定要備份的tables.
  --include-triggers=name 指定要備份的triggers.
  --include-users=name 指定要備份的users.
  --insert-ignore     編寫INSERT IGNORE而不是INSERT語句.
  --log-error-file=name 指定警告和錯誤文件.
  --net-buffer-length=# TCP/IP和套接字通信的緩衝區大小.
  --no-create-db      不要寫CREATE DATABASE語句.
  -t, --no-create-info 不要編寫重新創建每個備份表的CREATE TABLE語句.
  --parallel-schemas=name 創建一個用於處理數據庫的隊列,db_list表示備份的數據庫,逗號分隔,N表示該隊列使用N線程,如果N未給出則使用–default-parallelism參數設置的值.
  -p, --password[=name] 連接服務器時使用的密碼.
  --plugin-dir=name   安裝插件的目錄.
  -P, --port=#        連接服務器時的端口.
  --protocol=name     使用的傳輸協議 (tcp, socket, pipe, memory).
  --replace   編寫REPLACE語句而不是INSERT語句.
  --result-file=name  直接輸出到給定文件.
  --routines    從備份的數據庫中備份存儲的例程(過程和函數).(默認on; 關閉使用--skip-routines)
  --server-public-key-path=name 包含RSA公鑰的文件的路徑名	
  --set-charset  將SET NAMES default_character_set添加到輸出.(默認on;關閉使用--skip-set-charset)
  --set-gtid-purged=name 是否將SET @@ GLOBAL.GTID_PURGED添加到輸出.如果是用於備份,或是用於創建第二個從庫則設置爲ON,如果是爲了恢復誤刪的數據等,則設置爲OFF,如果不指定默認爲AUTO,判斷規則是如果備份服務器啓用了GTID則設置爲ON.
  --single-transaction 一致性備份參數,設置隔離級別模式爲RR(可重複讀),僅對支持事務的引擎有用,不支持事務的表不保證狀態一致;備份過程不要有DDL,否則可能會導致mysqlpump的select操作檢索內容的時候獲取錯誤的狀態信息退出(備份的時候會先show create table 然後select,如果兩個語句中執行了ddl,會導致報錯信息,表定義發生變化,)
  --skip-definer 從視圖和存儲的程序CREATE語句中忽略DEFINER和SQL SECURITY子句.
  -d, --skip-dump-rows Skip dumping rows of all tables to output.
  -S, --socket=name   指定socket.
  --ssl-ca=name       包含受信任的SSL證書頒發機構列表的文件    
  --ssl-capath=name   包含受信任的SSL證書頒發機構證書文件的目錄    
  --ssl-cert=name     包含X.509證書的文件    
  --ssl-cipher=name   連接加密的允許密碼    
  --ssl-crl=name      包含證書吊銷列表的文件    
  --ssl-crlpath=name  包含證書吊銷列表文件的目錄 
  --ssl-fips-mode=name 是否在客戶端啓用FIPS模式,允許的值有: OFF, ON, STRICT 
  --ssl-key=name      包含X.509密鑰的文件  
  --ssl-mode=name     與服務器連接的所需SSL     
  --tls-ciphersuites=name 允許的TLSv1.3密碼套件用於加密連接
  --tls-version=name  允許的TLS協議進行加密連接,允許的值有: TLSv1, TLSv1.1, TLSv1.2, TLSv1.3
  --triggers          指定要備份的觸發器.(默認on;關閉使用--skip-triggers)
  --tz-utc            將SET TIME_ZONE ='+ 00:00'添加到轉儲文件.(默認on; 關閉使用--skip-tz-utc.)
  -u, --user=name     User for login if not current user.
  --users             連接服務器時要使用的MySQL用戶名.
  -V, --version       顯示版本信息並退出.
  --watch-progress    顯示進度.(默認on; 關閉使用--skip-watch-progress)
  --zstd-compression-level=# 與使用zstd壓縮的服務器的連接的壓縮級別.

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
add-drop-database                 FALSE
add-drop-table                    FALSE
add-drop-user                     FALSE
add-locks                         FALSE
all-databases                     FALSE
bind-address                      (No default value)
character-sets-dir                (No default value)
column-statistics                 FALSE
complete-insert                   FALSE
compress                          FALSE
compress-output                   (No default value)
compression-algorithms            (No default value)
databases                         FALSE
default-character-set             UTF8MB4
default-parallelism               2
default-auth                      (No default value)
defer-table-indexes               TRUE
events                            TRUE
exclude-databases                 (No default value)
exclude-events                    (No default value)
exclude-routines                  (No default value)
exclude-tables                    (No default value)
exclude-triggers                  (No default value)
exclude-users                     (No default value)
extended-insert                   250
get-server-public-key             FALSE
hex-blob                          FALSE
host                              (No default value)
include-databases                 (No default value)
include-events                    (No default value)
include-routines                  (No default value)
include-tables                    (No default value)
include-triggers                  (No default value)
include-users                     (No default value)
insert-ignore                     FALSE
log-error-file                    (No default value)
max-allowed-packet                25165824
net-buffer-length                 1047552
no-create-db                      FALSE
no-create-info                    FALSE
parallel-schemas                  (No default value)
password                          (No default value)
plugin-dir                        (No default value)
port                              0
protocol                          (No default value)
replace                           FALSE
result-file                       (No default value)
routines                          TRUE
server-public-key-path            (No default value)
set-charset                       TRUE
set-gtid-purged                   AUTO
single-transaction                FALSE
skip-definer                      FALSE
skip-dump-rows                    FALSE
socket                            (No default value)
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-crl                           (No default value)
ssl-crlpath                       (No default value)
ssl-fips-mode                     (No default value)
ssl-key                           (No default value)
ssl-mode                          (No default value)
tls-ciphersuites                  (No default value)
tls-version                       (No default value)
triggers                          TRUE
tz-utc                            TRUE
user                              (No default value)
users                             FALSE
watch-progress                    TRUE
zstd-compression-level            3

2. mysqldump示例

2.1 簡單使用

# 全庫備份
[root@chengyu ~]# mysqlpump -uroot -p --all-databases>/home/all.sql
Enter password: 
Dump progress: 2/3 tables, 0/13 rows
Dump completed in 1121

# --exclude-databases參數使用
[root@chengyu ~]# mysqlpump -uroot -p --default-character-set=utf8mb4 --exclude-databases mysql >/home/allex.sql
Enter password: 
Dump progress: 1/1 tables, 0/5 rows
Dump completed in 630

# --include-tables參數使用
[root@chengyu ~]# mysqlpump -uroot -p --port 3307 --default-character-set=utf8mb4 --databases dbcy --include-tables=t1,t2 >/home/all03.sql
Enter password: 
Dump progress: 1/1 tables, 0/5 rows
Dump completed in 621

# 只備份用戶:備份文件生成CREATE USER和GRANT語句
# 對象名稱中允許使用通配符:% 匹配零個或多個字符的任何序列;_ 匹配任何單個字符。
[root@chengyu ~]#  mysqlpump -uroot -p --port 3307 --exclude-databases=% --users >/home/users.sql
Enter password: 
Dump completed in 617

2.2 mysqlpump並行處理

  mysqlpump可以使用並行性來實現併發處理:

  • –default-parallelism=N:每個並行處理隊列默認的線程數,默認爲2;
  • –parallel-schemas=[N:]db_list :db_list是逗號分隔的數據庫名稱的列表,N爲線程數,如果–parallel-schemas設置了並行度,那麼會覆蓋–default-parallelism默認值,如果–default-parallelism=0同時也沒有–parallel-schemas選項,mysqlpump會單線程運行,不創建任何隊列,5.7.11之前不支持與–single-transaction一起用。

  來看看簡單的例子,3個併發線程備份dbcy庫:

[root@chengyu ~]# mysqlpump -uroot -p --port 3307 --default-character-set=utf8mb4 --default-parallelism=3 --databases dbcy >/home/all02.sql
Enter password: 
Dump progress: 1/1 tables, 0/5 rows
Dump completed in 630

  4個併發線程備份指定數據庫,開啓一致性備份:

[root@chengyu ~]# mysqlpump -uroot -p --port 3307  --parallel-schemas=4:mysql,dbcy --set-gtid-purged=ON --single-transaction  --include-databases=mysql,dbcy  > /home/all01.sql

  看看幾個官網的案例:

  示例1: 建立一個隊列來處理db1和db2,另一個排隊的過程db3,所有隊列都使用2個線程

[root@chengyu ~]# mysqlpump -uroot -p --port 3307 --parallel-schemas=db1,db2 --parallel-schemas=db3 --include-databases=db1,db2,db3> /home/all04.sql

  示例2: 建立一個隊列來處理db1和db2,另一個排隊的過程db3,所有隊列共用4個線程

[root@chengyu ~]# mysqlpump -uroot -p --port 3307 --parallel-schemas=db1,db2 --parallel-schemas=db3 --default-parallelism=4 --include-databases=db1,db2,db3> /home/all05.sql

  示例3:隊列db1和db2共用5個線程,隊列db3使用3個線程,其他默認隊列使用默認的兩個線程

[root@chengyu ~]# mysqlpump -uroot -p --port 3307 --parallel-schemas=5:db1,db2 --parallel-schemas=3:db3 --include-databases=db1,db2,db3,db4> /home/all06.sql

  mysqlpump使用的限制條件:

  • 默認情況下,mysqlpump不備份performance_schema、sys schema、ndbinfo,需要備份的話用–databases或 --include-databases來明確指定;
  • mysqlpump不備份INFORMATION_SCHEMA;
  • mysqlpump不備份InnoDB CREATE TABLESPACE語句;
  • mysqlpump使用CREATE USER和 GRANT語句以邏輯形式備份user(例如,當使用–include-users或者–users選項時),因此備份mysql系統數據庫默認情況下不包括含有用戶定義的授權表:user,db, tables_priv,columns_priv, procs_priv,或 proxies_priv,要備份任何授權表,需要在mysql數據庫名稱後加上表名稱。

2020年6月30日

  下午幾個朋友聊買房聊育兒聊生活,朋友說:讀書再厲害比不上給孩子攢房子,作爲父母,要努力給孩子提供體面的生活…這大概是二八定律8字頭父母人羣最真實的理想現狀了,突然想起客廳、主臥、兒童房我們佈置的隨處可見的書架和書本,我們跟孩子說讀書可以獲得更多的快樂,希望他們成爲內心豐滿的人;在孩子說長大以後想開挖掘機做工人被爺爺奶奶教育理想不正確時,我們鼓勵說你覺得開心就可以,每一種工作都有它的價值,不逾矩逾規逾法,興趣與謀生能合二爲一爲何不可…相較之下,我們這些是不是有點理想化了……

  爲何“讀書”,何爲“體面”…脫離了經濟基礎來講上層建築,“讀書爲了自我愉悅”、“體面在更多的自我選擇”這樣的說辭就顯得過分清高,如此格格不入…但,現實已經夠俗氣了,好歹也要掙扎着讓理想脫俗,就這樣,一面在現實中妥協,一面在理想中憧憬才能拉扯自己前進的步伐。

  階段不同,立足點不同,追逐的自然有差異,沒什麼正反對錯標新立異可言的。

  今日身份:裝深沉、胡思亂想、矛盾附體的假正經!

  2020年首次正裝配高跟裝正經一整天迎“7.1”,記一下!

  2020年的10包辣條馬甲線賭約,進度更新——2包,距離10月份的10包辣條還會遠?記一下!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章