Mysql

MySQL:增加緩衝池,ibdata1 損壞?

  • January 26, 2013

我嘗試innodb_buffer_pool_size通過my.cnf從預設的 128m 增加到 256m,但是在重新啟動嘗試時,mysql 關閉失敗:

130125 11:49:55 InnoDB: Initializing buffer pool, size = 256.0M
130125 11:49:55 InnoDB: Completed initialization of buffer pool
InnoDB: Unable to lock ./ibdata1, error: 11

MySQL 已啟動並正在執行,但任何通過終端“mysql -u root -p”的嘗試都會失敗:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)

我在適當的位置觸摸了/chown mysql.sock 和 mysqld.pid(因為它們失去了,不好),但仍然沒有運氣進入 mysql。

從昨晚開始轉儲,但很想從今天開始轉儲以查看 ibdata1 是否已損壞(讀/寫操作似乎很好,所以如果它已損壞,mysql 將關閉,不是嗎?)

不用說,擔心嘗試重啟!我們有一個通過連接池連接到 MySQL 的 Java 應用程序;那裡發生了鎖定嗎?

無論如何,關於如何處理這種情況的想法值得讚賞。可能會複製執行 MySQL 的 VM 並導入 /var/lib/mysql 目錄以查看發生了什麼,但如果只是重新創建 sock 和 pid 文件並重新啟動,那麼浪費一個下午是沒有意義的。

其他東西正在 ibdata1 上持有文件鎖。在 ibdata1 上使用lsof並找出誰持有鎖。

解決了這個問題,mysql.sock 和 mysql.pid 文件離開了,所以我:

touch /var/lib/mysql/mysql.sock
chown mysql.mysql /var/lib/mysql/mysql.sock
touch /var/run/mysqld/mysqld.pid
chown mysql.mysql /var/run/mysqld/mysqld.pid
echo [pid of running mysqld] > /var/run/mysqld/mysqld.pid

mysqld 服務正在執行,所以客戶端站點一直很好,但鑑於日誌中的驚人錯誤,我的印像是 ibdata 文件已損壞:“無法打開或創建數據文件……InnoDB 只寫了那些滿是零的文件,但還沒有以任何方式使用它們。但是請注意不要刪除包含您寶貴數據的舊數據文件!

我的意思是,考慮到大量的警告和錯誤,很難不認為天要塌下來了——看起來像狗屎已經擊中了風扇,在這種情況下,它根本沒有。

通過終端會話執行上述內容,然後是 aservice mysql restart和瞧,緩衝池大小增加到 256MB,正如我在my.cnf今天早上進行更改時最初打算的那樣。

至於問題的原因,我跑去mysqltuner.pl檢查性能瓶頸;除了正在執行的 mysqld 程序之外,這還必須創建一個新的 mysqld 程序,該程序在腳本執行後保持連接(在重新啟動失敗時 grep 正在執行的程序有 4 個 mysqld 程序,2 個用於 root mysqld_safe,2 個用於 mysql mysqld)。

殺死 mysqltuner.pl 創建的程序並沒有解決問題,因為 mysql.sock 和 mysql.pid 文件隨之而來,然後我無法進入 mysql 客戶端。看著日誌,我擔心最壞的情況,花了幾個小時在網上搜尋。

無事生非;-)

引用自:https://serverfault.com/questions/472480