【MySQL】ERROR 1799 (HY000) innodb_online_alter_log_max_size引數過小的一則case
【問題描述】:
版本: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.
比如:
只要是DDL相關的,就可能遇到這樣的問題,比如在optimize table時:
雖然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:
該值預設為128MB,還是建議在做完DDL之後再將其改為預設值,也就是134217728。
作者微信公眾號(持續更新)
版本: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)
那麼檢視一下手冊,可以得知:
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。
作者微信公眾號(持續更新)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2140971/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql lower-case-table-names引數MySql
- MYSQL ERROR 2003 (HY000) CanMySqlError
- mysql 5.6.25報錯ERROR 1372 (HY000): Password hash 的一點思考MySqlError
- mysql儲存過程的引數MySql儲存過程
- MySQL "ERROR 1010(HY000):Error dropping database(canMySqlErrorDatabase
- mysql無法建立儲存過程問題 ERROR 1307 (HY000)MySql儲存過程Error
- ERROR 1290 (HY000): The MySQL server is running withErrorMySqlServer
- ERROR 1010 (HY000) mysql 5.5.19ErrorMySql
- MySQL 5.7 複製的過濾引數MySql
- MySQL Case-max_allowed_packet過小是否會擷取sql文字MySql
- 【MySQL】ERROR 1878 (HY000): Temporary file write failure.MySqlErrorAI
- Mysql連線錯誤ERROR 2003 (HY000)MySqlError
- 【Mysql】ERROR 1872 (HY000): Slave failed to initialize relay log infoMySqlErrorAI
- 小程式內引數和掃碼引數統一
- go select case的一個小坑Go
- mysql一些引數的介紹MySql
- MySQL ERROR 1031 (HY000) at line 33: Table storage engine forMySqlError
- 正則特殊引數
- Mysql配置引數詳解(一)MySql
- mysql 引數修改 一例MySql
- 【SQL】小CASESQL
- lower_case_table_names引數設定解決Error Code: 1146. Table doesn't exist?Error
- Mysql 引數MySql
- MySQL報錯ERROR 2013 (HY000): Lost connection to MySQL server during queryMySqlErrorServer
- MySQL5.6:mysql_secure_installation 報錯ERROR 2002 (HY000)MySqlError
- MySQL 使用 show tables 時出現 ERROR 1449 (HY000) 問題MySqlError
- mysql執行sql指令碼報錯ERROR 1366 (HY000) 解決MySql指令碼Error
- 【MySQL】ERROR 1005 (HY000): Can't create table' (errno: 150)MySqlError
- ERROR 1010 (HY000): Error dropping databaseErrorDatabase
- MySQL報錯'ERROR 2002 (HY000): Can't connect to local MySQL server through'MySqlErrorServer
- ERROR 2002(HY000):Can't connect to local MySQL socket '/tmp/mysql.sock'ErrorMySql
- MySQL5.7叢集(MGR)啟動報ERROR 3092 (HY000)MySqlError
- ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables optErrorMySqlServer
- 【MySQL】ERROR 1290 (HY000): --secure-file-priv--匯出報錯MySqlError
- MySQL 報錯 ERROR 1290 (HY000): running with the --secure-file-privMySqlError
- 阿里雲mysql遠端登入報ERROR 2027(HY000)阿里MySqlError
- MySQL案例02:ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGESMySqlError
- mysql資料匯入問題處理(ERROR 1418 (HY000))MySqlError