Mysql

單個文件上的大型 MYSQL DB

  • February 19, 2022

我有一個在 MySQL 伺服器中以單文件模式執行的大型 MYSQL innodb 數據庫(115GB)。

我需要將此移動到每個表模式的文件中,以允許我優化和減少整體數據庫大小。

我正在尋找各種選擇來做到這一點,但我的問題在於只有一小段停機時間(大約 5 小時)。

  1. 將伺服器的複製設置為從屬伺服器。使用 file_per_table 設置從屬,從主數據庫中獲取一個 mysqldump,在從屬中執行並進行複制。

然後,我將尋求故障轉移到從站。

  1. 另一個選項是通常的 mysqldump,刪除 DB 然後導入。

我擔心的是使用 mysqldump 的時間以及轉儲的質量如此之大。我在數據庫中也有 BLOB 數據。

任何人都可以就一個好的方法提供建議嗎?

謝謝

如果您擔心停機時間mysqldump可能會導致您可以查看熱備份。例如percona-xtrabackup

這是我要做的:

  1. 使用 xtrabackup 創建一個從站(如果您有 MySQL 5.6.2+, 請將master_info_repository設置為 table)
  2. 讓它複製並讓它趕上
  3. 停止複制:stop slave
  4. (可選)如果您的 MySQL 早於 5.6.2,請備份主資訊文件
  5. 記下位置show slave status
  6. 製作 mysqldump
  7. 銷毀數據庫和其中的所有文件mysql_datadir並刪除所有中繼日誌
  8. 使用 mysql_install_db 恢復數據庫並執行轉儲(確保您有 file_per_table 設置)
  9. (僅在 <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。

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