今日遭遇したとき、私は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テーブルに使用するファイル形式。現在、アンテロープとバラクーダがサポートされています。これは、独自のテーブルスペースを持つテーブルにのみ適用されるため、それを有効にするには、innodb_file_per_tableを有効にする必要があります。バラクーダファイル形式は、テーブル圧縮などの特定のInnoDB機能に必要です。
サーバーの起動時に、InnoDBはこの変数の値をシステムテーブルスペース(AntelopeやBarracudaなど)のファイル形式タグに設定します。サーバーが「より高い」ファイル形式でテーブルを作成または開くと、innodb_file_format_maxの値がその形式に設定されます。
これらはデータではなくmy.cnf
に属しているため、mysqldumpに関する限り、InnoDBのフォーマットは不可知論です。すべてをオンザフライでバラクーダにシフトしたい場合は、2つの方法があります(開発サーバーとステージングサーバーで提案する方法をテストしてください)。
Mysqldumpファイルの名前がmydump.sql
であるとします。これを行う:
echo "SET GLOBAL innodb_file_format = 'Barracuda';" > mynewdump.sql
cat mydump.sql >> mynewdump.sql
さて、ダンプをロードしてください
mysql -uroot -p < mynewdump.sql
root@localhost
としてmysqlにログインし、mysqlプロンプトからこれを実行します
mysql> SET GLOBAL innodb_file_format = 'Barracuda';
mysql> source mynewdump.sql
開発およびステージングサーバーで提案をテストしてください