Mysql

備份混合數據庫時包含在 mysqldump 中的選項

  • July 29, 2014

我計劃在遠端生產伺服器上備份所有 MySQL 數據庫。合併後的數據庫大小約為 2 GB。大多數表是 InnoDB ~1.8 GB,其餘的是 MyISAM。

現在我已經解決了關於 Serverfault 和 DBA.Stackexchange 的大部分關於備份混合數據庫的問題,幾乎所有的意見都是關於第三方工具,如 Percona Xtrabackup 或關於將 MyISAM 表轉換為 InnoDB,然後使用--quick --single-transaction選項執行 mysqldump 或進行備份從複製系統。

在我的情況下,並非所有數據庫都在從屬系統上複製,因此我無法在從屬電腦上執行 mysqldump,而且我將通過腳本或作為 cronjob 每晚執行 mysqldump,並且我知道獲取所有數據庫的全域讀鎖雖然使用 mysqldump 不會有問題,因為在晚上那個時間執行的 DML 語句的數量將非常低。

因此,我正在考慮在 mysqldump 中包含以下選項,如果有人可以幫助驗證/糾正這些選項,我將不勝感激。

--extended-insert  --all-databases  --add-drop-database --lock-all-tables  --log-error=file_name --skip-opt

在我看來,按表而不是按數據庫進行備份會更有意義。這是我用來備份包含 MyISAM 和 InnoDB 表的數據庫的腳本。

#!/bin/bash
USER="some_user"
PASSWD="some_password"
STAMP=$(date +"%d-%m-%y-%H:%M:%S")
HOST="some_host"
db="some_database"
FILESTAMP=$(date +"%d%m%y")
FILE="/some_directory/some_file-$STAMP.sql.gz"
Port=3306

TABLE_DUMP=$(mysql -u $USER -P$PASSWD -h $HOST -Bse "SELECT table_name FROM information_schema.tables where table_schema = '$db' and engine is not null order by table_type, table_name;")
for table_name in $TABLE_DUMP
do      
   table_engine=$(mysql -u $USER -P$PASSWD -h $HOST -Bse "SELECT engine FROM information_schema.tables where table_schema = '$db' and table_name = '$table_name';")
   case "$table_engine" in
       InnoDB ) 
           echo "$table_name InnoDB\n" 
           mysqldump --skip-opt --disable-keys --create-options --single-transaction --quick --extended-insert --add-drop-table -P $Port -u $USER -P$PASSWD -h $HOST $db $table_name | gzip -9 >> $FILE
       ;;
       MyISAM) 
           echo "$table_name MyISAM\n" 
           mysqldump --opt -P $Port -u $USER -P$PASSWD -h $HOST $db $table_name | gzip -9 >> $FILE
   esac

   #register all table names
   skiptables="$skiptables --ignore-table=$db.$table_name" 
done

# View
mysqldump -P $Port -u $USER -P$PASSWD -h $HOST $db $skiptables | gzip -9 >> $FILE

引用自:https://dba.stackexchange.com/questions/69602