Mysql
單個文件上的大型 MYSQL DB
我有一個在 MySQL 伺服器中以單文件模式執行的大型 MYSQL innodb 數據庫(115GB)。
我需要將此移動到每個表模式的文件中,以允許我優化和減少整體數據庫大小。
我正在尋找各種選擇來做到這一點,但我的問題在於只有一小段停機時間(大約 5 小時)。
- 將伺服器的複製設置為從屬伺服器。使用 file_per_table 設置從屬,從主數據庫中獲取一個 mysqldump,在從屬中執行並進行複制。
然後,我將尋求故障轉移到從站。
- 另一個選項是通常的 mysqldump,刪除 DB 然後導入。
我擔心的是使用 mysqldump 的時間以及轉儲的質量如此之大。我在數據庫中也有 BLOB 數據。
任何人都可以就一個好的方法提供建議嗎?
謝謝
如果您擔心停機時間
mysqldump
可能會導致您可以查看熱備份。例如percona-xtrabackup。這是我要做的:
- 使用 xtrabackup 創建一個從站(如果您有 MySQL 5.6.2+, 請將master_info_repository設置為 table)
- 讓它複製並讓它趕上
- 停止複制:
stop slave
- (可選)如果您的 MySQL 早於 5.6.2,請備份主資訊文件
- 記下位置
show slave status
- 製作 mysqldump
- 銷毀數據庫和其中的所有文件
mysql_datadir
並刪除所有中繼日誌- 使用 mysql_install_db 恢復數據庫並執行轉儲(確保您有 file_per_table 設置)
- (僅在 <5.6.2 上)如有必要恢復複製(如果它在表中,則轉儲包含資訊,因此不需要)
然後您可以進行切換,您將只有幾秒鐘的停機時間。
如果使用 mysqldump,可以執行以下操作
- 確保在 mysqldump 期間不發生 DDL(no
ALTER TABLE
, no )DROP TABLE
- 使用–single-transaction確保所有表具有相同的時間點
您可以安排一個 mysqldump 將數據直接推送到從站,而無需保存轉儲文件。只需將 mysqldump 直接通過管道傳輸到從站。您必須預先預設複製件。
創建一個
LoadSlave.sh
用這些行呼叫的 bash 腳本MYSQL_MAS=10.20.30.40 MYSQL_SLV=10.20.30.50 MYSQL_USER=root MYSQL_PASS=rootpassword MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}" MYSQL_CONN_MAS="-h${MYSQL_MAS} -u${MYSQL_CONN}" MYSQL_CONN_SLV="-h${MYSQL_SLV} -u${MYSQL_CONN}" REPL_USER=replicator REPL_PASS=whateverthereplicatorpasswordis DATABASE_TO_DUMP=mydb MYSQLDUMP_OPTIONS="--single-transaction" MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --master-data=1" MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --routines --triggers" MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --add-drop-database" MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} -B ${DATABASE_TO_DUMP}" SQL="STOP SLAVE;" SQL="${SQL} CHANGE MASTER TO master_host='${MYSQL_MAS},master_port=3306," SQL="${SQL} master_user='${REPL_USER},master_password='${REPL_PASS}'," SQL="${SQL} master_log_file='blank',master_log_pos=4;" mysql ${MYSQL_CONN_SLV} -ANe"${SQL}" mysqldump ${MYSQL_CONN_MAS} ${MYSQLDUMP_OPTIONS} | mysql ${MYSQL_CONN_SLV} mysql ${MYSQL_CONN_SLV} -ANe"START SLAVE;"
然後,執行以下命令
chmod +x LoadSlave.sh nohup ./LoadSlave.sh &
這將建立複製機制,通過網路將 mysqldump 直接傳輸到從站,刪除從站上的數據庫,在從站上創建數據庫,將數據載入到從站,然後開始複製。
請在開發/暫存伺服器上進行測試
正如Károly Nagy 的回答中強調的那樣,您可以使用
percona-xtrabackup
. 請記住mysqldump
和之間的主要區別percona-xtrabackup
- 如果您
mysqldump --single-transaction
在午夜開始,並且備份需要 30 分鐘,則備份的時間點是 mysqldump 的開始時間,凌晨 12:00。- 如果您
percona-xtrabackup
在午夜開始,並且備份需要 30 分鐘,則備份的時間點是備份的完成時間,凌晨 12:30。