MySQL · 答疑解惑 · mysqldump tips 兩則

來源:互聯網
上載者:User

MySQL · 答疑解惑 · mysqldump tips 兩則
背景

使用者在使用mysqldump導資料上雲的時候碰到兩個“詭異”的問題,簡單分析分享下。

TIP 1 --port連接埠無效?

本地有3306和3307兩個連接埠的執行個體,執行命令為:

mysqldump --host=localhost --port=300x -Ddb1 db1 -r outputfile

發現無論執行連接埠寫入3306還是3307,匯出的都是3306連接埠執行個體的資料。

程式碼分析

實際上不論是mysqldump還是mysql用戶端,在串連資料庫時都調用了 CLI_MYSQL_REAL_CONNECT 這個函數,裡面的一段代碼邏輯如下

if(!host || !strcmp(host,LOCAL_HOST){  vio_socket_connect(...}其中 #define LOCAL_HOST "localhost"

也就是說,當host參數值為localhost的時候,mysql和mysqldump用戶端使用的是–socket參數,如果未指定,則使用預設的/tmp/mysql.sock。
因此上面使用者的輸入,不論–port 輸入多少,都被忽略。而他的/tmp/mysql.sock 就是屬於3306連接埠執行個體。

從代碼中可以看到,必須是全小寫localhost才滿足條件,若是Localhost,則解析成127.0.0.1,用的是 ip + port 的模式,此時 –socket 參數無效。

TIP 2 匯出的資料無法匯入?

使用mysqldump預設參數匯出5.6 的資料,無法匯入到目標庫。

當源庫使用了GTID模式時,在dump出來的檔案中為了保持目標庫和源庫GTID值相同,增加了兩個語句, SET @@SESSION.SQL_LOG_BIN= 0SET @@GLOBAL.GTID_PURGED='xxxx'

而實際上增加這兩個語句會有諸多問題:

  1. 關閉binlog首先需要super許可權,如果目標庫只能使用普通帳號,則會導致執行失敗;
  2. 即使有super許可權,也會導致這些操作不記錄到binlog,會導致主備不一致。當然也可以說,這就要求同一份dump要restore到目標庫的主庫和所有備庫才能保持主備一致;
  3. SET @@GLOBAL.GTID_PURGED='xxxx'這個命令要求目標庫的gtid_executed值是空。若非空,這個命令執行失敗;
  4. reset master可以清空gtid_executed值,也需要super許可權。

因此在匯出5.6的資料時,有兩種可選方案:

  1. 在有目標庫的super許可權時,用預設dump參數,在匯入到目標庫之前,先執行reset master;這樣需要在主庫和所有備庫都執行相同個匯入動作;
  2. mysqldump需要增加參數 –set-gtid-purged=off,這樣不會產生上述兩個語句,資料能夠直接匯入。但是目標庫的gtid set就與源庫不同。

需要根據業務需求選擇。

使用mysqldump進行MariaDB 的備份 

使用mysqldump匯出資料庫 

基於mysqldump快速搭建從庫 

恢複mysqldump建立的備份組 

使用mysqldump命令列工具建立邏輯備份 

mysqldump實現資料庫邏輯備份

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.