回覆列表
  • 1 # 天南地北華爺最美

    1.mysqldump

    在日常工作中,我們會使用mysqldump命令建立sql格式的轉儲檔案來備份資料庫。或者我們把資料匯出後做資料遷移,主備搭建等操作。mysqldump是一個邏輯備份工具,複製原始的資料庫物件定義和表資料產生一組可執行的SQL語句。 預設情況下,生成insert語句,也能生成其它分隔符的輸出或XML格式的檔案。shell> mysqldump [arguments] > file_name我們簡單的來看一下日常的用法:備份所有的資料庫:shell> mysqldump --all-databases >

    dump.sql

    (不包含INFORMATION_SCHEMA,performance_schema,sys,如果想要匯出的話還要結合--skip-lock-tables和--database一起用)備份指定的資料庫:shell> mysqldump --databases db1 db2 db3 >

    dump.sql

    當我們只備份一個數據的時候可以省去 --databases 直接寫成:mysqldump test >

    dump.sql

    不過有一些細微的差別,如果不加的話,資料庫轉儲輸出不包含建立資料庫和use語句,所以可以不加這個引數直接匯入到其它名字的資料庫裡當然我們也可以只備份某個表 :mysqldump --user [username] --password=[password] [database name] [table name]

    table_name.sql

    瞭解了簡單的一些用法後我們再著重的看一下幾個引數:--master-data 獲取備份資料的Binlog位置和Binlog檔名,用於透過備份恢復的例項之間建立複製關係時使用,該引數會預設開啟。--dump-slave 用於在slave上dump資料,建立新的slave。因為我們在使用mysqldump時會鎖表,所以大多數情況下,我們的匯出操作一般會在只讀備庫上做,為了獲取主庫的Relay_Master_Log_File和Exec_Master_Log_Pos,需要用到這個引數,不過這個引數只有在5.7以後的才會有�Cno-data, -d 不匯出任何資料,只匯出資料庫表結構剛剛我們說過在使用mysqldump的時候會鎖表,我們來詳細的看一下它的鎖機制。我們開兩個視窗,在第一個裡面執行mysqldump -uroot -pxxxxx --master-data=2 --databases dbname > /tmp/dbnamedate +%

    F.sql

    然後第二個視窗登陸進去,使用show process的命令可以看到目前dump的session正在執行

    1.pngSELECT

    /*!40001 SQL_NO_CACHE */ * FROM table_name; 可以看到這條sql正在以no_cache的模式查詢資料。然後我們在同樣的表上執行一下select,發現被阻塞了。游標一直不返回。

    2.png

    一般遇到這種檔案,我們會想是不是有鎖呢?為了驗證我們檢視一下鎖的資訊,可以發現dump的程序實際上是加了鎖的。

    3.png

    我們把具體的general_log開啟,然後看一下當時的操作:4.png4101044 Query FLUSH /*!40101 LOCAL */ TABLES4101044 Query FLUSH TABLES WITH READ LOCK (關閉所有開啟的表,同時對於所有資料庫中的表都加一個讀鎖,直到顯示地執行unlock tables,該操作常常用於資料備份的時候。)4101044 Query SHOW MASTER STATUS(這是因為我用了--master-data=2)所以這個時候表就會被鎖住。如果我不加--master-data引數(mysqldump -uroot -pxx --databases db > /tmp/dbnamedate +%F.sql) mysql會顯示的對每一張要備份的表執行LOCK TABLES table_name1 READ,LOCK TABLES table_name2 READ並且也不會有讀的阻塞。那有沒有不鎖的方法,其實也是有的,就是使用--single-transaction把備份的操作放在一個事務裡去進行帶上--single-transaction引數的mysqldump備份過程:如果是5.6版本的mysql

  • 中秋節和大豐收的關聯?
  • 餐廳掛什麼畫好看?