簡體   English   中英

恢復Django-mailer數據庫時出現MySQL錯誤1118(行大小太大)

[英]MySQL Error 1118 (Row size too large) when restoring Django-mailer database

我從django應用程序轉儲了一個正常工作的生產數據庫,並試圖將其遷移到我的本地開發環境中。 生產服務器運行MySQL 5.1,在本地我有5.6。

遷移django-mailer的“ messagelog”表時,我遇到了可怕的錯誤1118:

ERROR 1118 (42000) at line 2226: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

我已經在線閱讀了很多有關此錯誤的內容,但沒有一個可以解決我的問題。

注意:此錯誤不是來自表的創建,而是來自具有相當大數據的行的插入。

筆記:

  1. innodb_file_format和innodb_file_format_max變量設置為梭子魚。
  2. 在創建表時,ROW_FORMAT設置為DYNAMIC。
  3. 該表沒有很多列。 架構如下:

    +----------------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | message_data | longtext | NO | | NULL | | | when_added | datetime | NO | | NULL | | | priority | varchar(1) | NO | | NULL | | | when_attempted | datetime | NO | | NULL | | | result | varchar(1) | NO | | NULL | | | log_message | longtext | NO | | NULL | | +----------------+------------+------+-----+---------+----------------+

同樣,僅當我嘗試插入很大的行(message_data大約為5兆字節)時,才會發生錯誤。 創建表的工作正常,並且在出現故障之前可以添加大約500,000行。

我沒主意了; 我已經嘗試過DYANMIC和COMPRESSED行格式,並且已經三重檢查了相關innodb變量的值:

mysql> 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 | +--------------------------+-----------+

創建代碼(來自SHOW CREATE TABLE)如下所示:

CREATE TABLE `mailer_messagelog` ( `id` int(11) NOT NULL AUTO_INCREMENT, `message_data` longtext NOT NULL, `when_added` datetime NOT NULL, `priority` varchar(1) NOT NULL, `when_attempted` datetime NOT NULL, `result` varchar(1) NOT NULL, `log_message` longtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=869906 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC

根據對這個問題的答案之一,您的問題可能是由MySQL 5.6的更改引起的(請參閱http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-上的InnoDB Notes。 6-20.html ):

InnoDB注意事項

重要更改:對於大型的,外部存儲的BLOB字段,重做日志寫入操作可能會覆蓋最新的檢查點。 5.6.20補丁程序將BLOB寫入的重做日志大小限制為重做日志文件大小的10%。 5.7.5補丁解決了該錯誤,沒有施加任何限制。 對於MySQL 5.5,該錯誤仍然是已知的限制。

由於針對MySQL 5.6引入了重做日志BLOB寫限制,因此innodb_log_file_size設置應比表行中找到的最大BLOB數據大小加上其他可變長度字段(VARCHAR,VARBINARY和TEXT類型字段)。 如果您的innodb_log_file_size設置已經足夠大或您的表不包含BLOB數據,則無需采取任何措施。

注意:在MySQL 5.6.22中,重做日志BLOB寫入限制被放寬為總重做日志大小(innodb_log_file_size * innodb_log_files_in_group)的10%。

(缺陷#16963396,錯誤#19030353,錯誤#69477)

如果將innodb_log_file_size更改為大於50M的內容,是否有幫助? (更改該變量需要一些步驟才能正常工作:

https://dba.stackexchange.com/questions/1261/how-to-safely-change-mysql-innodb-variable-innodb-log-file-size )。

如果這對任何人都有用,則@klasske解決方案對我不起作用,但是在“ my.cnf”中編寫以下代碼即可:

innodb_file_format=Barracuda
ERROR 1118 (42000) at line 1852: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0

ubuntu 16.04 edit path : nano /etc/mysql/mysql.conf.d/mysqld.cnf
it work!!….

[http://dn59-kmutnb.blogspot.com/2017/06/error-1118-42000-at-line-1852-row-size.html][1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM