Mysql
備份混合數據庫時包含在 mysqldump 中的選項
我計劃在遠端生產伺服器上備份所有 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