MySQL:增加緩衝池,ibdata1 損壞?
我嘗試
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 只寫了那些滿是零的文件,但還沒有以任何方式使用它們。但是請注意不要刪除包含您寶貴數據的舊數據文件!
我的意思是,考慮到大量的警告和錯誤,很難不認為天要塌下來了——看起來像狗屎已經擊中了風扇,在這種情況下,它根本沒有。
通過終端會話執行上述內容,然後是 a
service 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 客戶端。看著日誌,我擔心最壞的情況,花了幾個小時在網上搜尋。
無事生非;-)