您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么解決MySQL中的ERROR 1799報錯問題”,在日常操作中,相信很多人在怎么解決MySQL中的ERROR 1799報錯問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么解決MySQL中的ERROR 1799報錯問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
【問題描述】:
版本:MySQL 5.6.36 (以上的版本都可能出現)
行為:對某些訪問頻繁的大表做Online DDL
現象:
ERROR 1799 (HY000): Creating index 'GEN_CLUST_INDEX' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
比如:
mysql> ALTER TABLE a ENGINE=innodb;
ERROR 1799 (HY000): Creating index 'GEN_CLUST_INDEX' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
mysql> ALTER TABLE a DROP idx_name;
ERROR 1799 (HY000): Creating index 'idx' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
只要是DDL相關的,就可能遇到這樣的問題,比如在optimize table時:
mysql> OPTIMIZE TABLE a;
+--------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------+----------+----------+-------------------------------------------------------------------+
| test.a | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.a | optimize | error | Creating index 'FTS_DOC_ID_INDEX' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again. |
| test.a | optimize | status | OK |
+--------+----------+----------+-------------------------------------------------------------------+
2 rows in set (18.13 sec)
雖然optimize對innodb表沒什么用,但是仍然會拋出該錯誤
那么查看一下手冊,可以得知:
innodb_online_alter_log_max_size控制在用于在Online DDL操作時的一個臨時的日志文件的上限值大小。
該臨時的日志文件存儲了在DDL時間內,dml操作的記錄。這個臨時的日志文件依照innodb_sort_buffer_size的值做擴展。
如果該日志超過了innodb_online_alter_log_max_size的最大上限,DDL操作則會拋出失敗,并且回滾所有未提交的DML操作。
反過來說,該值如果設置更高,則可以允許在做Online DDL時,有更多的DML操作發生。
但因此帶來的問題就是,在DDL做完之后,需要更多時間來鎖表和應用這些日志。
另外對于某些DDL操作,比如
ADD INDEX/COLUMN,則可以通過調整innodb_sort_buffer_size的大小來加快操作速度。
但是實際上分配的內存為3倍的innodb_sort_buffer_size值。
innodb_online_alter_log_max_size和innodb_sort_buffer_size均為5.6 Online DDL的新參數。
【解決方案】:
知道這個參數控制的是什么東西,就好解決了。
臨時調大該值,此處改成了256MB:
mysql> SET GLOBAL innodb_online_alter_log_max_size=256*1024*1024;
Query OK, 0 rows affected (0.03 sec)
該值默認為128MB,還是建議在做完DDL之后再將其改為默認值,也就是134217728。
到此,關于“怎么解決MySQL中的ERROR 1799報錯問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。