Mysql
為什麼 MySQL 在載入 mysqldump 後沒有保留 innodb_file_format
我今天在載入 mysql 轉儲時遇到
ERROR 1118 (42000) at line 279: Row size too large (> 8126)
我認為這很奇怪,因為我知道我已經打開了行壓縮並在該伺服器上使用梭子魚。我也知道我沒有在生產數據庫上遇到這個問題。
我檢查了生產數據庫,果然
show variables like "%innodb_file%"; +--------------------------+-----------+ | Variable_name | Value | +--------------------------+-----------+ | innodb_file_format | Barracuda | | innodb_file_format_check | ON | | innodb_file_format_max | Barracuda | | innodb_file_per_table | ON | +--------------------------+-----------+
但在載入轉儲的伺服器上,file_format 變數設置為:
mysql> show variables like "%innodb_file%"; +--------------------------+-----------+ | Variable_name | Value | +--------------------------+-----------+ | innodb_file_format | Antelope | | innodb_file_format_check | ON | | innodb_file_format_max | Antelope | | innodb_file_per_table | ON | +--------------------------+-----------+
這是我的 MySQL 轉儲的樣子
sudo mysqldump -u mysqlbackups --databases limbo | gzip > /local_backup_directory'+%m-%d-%Y'.sql.gz
為什麼不轉儲 innodb_file_format 和 format_max 變數?如何告訴 mysqldump 轉儲 file_format 和 format_max 變數?
根據 MySQL 文件
innodb_file_format
用於新 InnoDB 表的文件格式。目前支持 Antelope 和 Barracuda。這僅適用於具有自己的表空間的表,因此要使其生效,必須啟用 innodb_file_per_table。某些 InnoDB 功能(例如表壓縮)需要梭子魚文件格式。
innodb_file_format_max
在伺服器啟動時,InnoDB 將此變數的值設置為系統表空間中的文件格式標記(例如 Antelope 或 Barracuda)。如果伺服器創建或打開具有“更高”文件格式的表,它會將 innodb_file_format_max 的值設置為該格式。
由於這些中的每一個都屬於
my.cnf
而不是數據,因此就 mysqldump 而言,InnoDB 的格式是不可知的。如果您想即時將所有內容轉移到梭子魚,有兩種方法(請在開發和暫存伺服器上測試我的建議)技術#1:在 mysqldump 中添加 Barracuda 選項
假設呼叫 mysqldump 文件
mydump.sql
。做這個:echo "SET GLOBAL innodb_file_format = 'Barracuda';" > mynewdump.sql cat mydump.sql >> mynewdump.sql
現在,只需載入轉儲
mysql -uroot -p < mynewdump.sql
技巧#2:在載入轉儲之前設置梭子魚選項
登錄到 mysql
root@localhost
並從 mysql 提示符執行它mysql> SET GLOBAL innodb_file_format = 'Barracuda'; mysql> source mynewdump.sql
警告
請在開發和登台伺服器上測試建議
試一試 !!!