記一次mysql故障處理

忽然間,我的網站崩潰了!相信這個報錯做爲運維都應該清楚的,是數據庫宕機了。node

數據庫我採用mysql 5.1.63,上機查看錯誤日誌:mysql

171010 10:11:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
171010 10:11:01 InnoDB: Initializing buffer pool, size = 512.0M
171010 10:11:01 InnoDB: Error: cannot allocate 536887296 bytes of
InnoDB: memory with malloc! Total allocated memory
InnoDB: by InnoDB 22442704 bytes. Operating system errno: 12
InnoDB: Check if you should increase the swap file or
InnoDB: ulimits of your operating system.
InnoDB: On FreeBSD check you have compiled the OS with
InnoDB: a big enough maximum process size.
InnoDB: Note that in most 32-bit computers the process
InnoDB: memory space is limited to 2 GB or 4 GB.
InnoDB: We keep retrying the allocation for 60 seconds...
171010 10:12:01InnoDB: Fatal error: cannot allocate the memory for the buffer pool
171010 10:12:01 [ERROR] Plugin 'InnoDB' init function returned error.
171010 10:12:01 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
171010 10:12:01 [ERROR] Unknown/unsupported table type: INNODB
171010 10:12:01 [ERROR] Abortinglinux

171010 10:12:01 [Note] /usr/local/mysql/libexec/mysqld: Shutdown completesql

171010 10:12:01 mysqld_safe mysqld from pid file /usr/local/mysql/var/qyi-599a87c5e1fa7.pid ended
^C數據庫

我覺得是innoDB引擎的壞掉了,因而從新編譯安裝了mysql,後來才發現,原來是配置文件中
innodb_buffer_pool_size 設置的值過大了,(我設置了1G) 呵呵 ,緩衝池過大了,雲服務器上的內存不過也就才1G。緩存

查了資料得知緣由:安全

這個報錯的大意是,內存基本耗盡,沒有再能夠分配的內存.服務器

解決辦法:查看/etc/my.cnf,找innodb_buffer_pool_size,發現設值已經超過了系統總內存,而後從新設置爲系統內存1半,即innodb_buffer_pool_size = 512M 重啓MySQL就OK了.運維

因而我修改my.cnf中參數:wordpress

innodb_buffer_pool_size         = 512M

 嘗試啓動mysql,結果不盡人意,依然報錯上述錯誤。

因而我方了。。。。。我嘗試各類方法,好比說初始化!!!!

通常來講初始化不會對線上數據形成什麼影響,可是~!生產環境可千萬不要這樣操做,萬一哪天不幸運,初始化完出故障了,那這個鍋你背定了。

按照個人想法繼續走。我本人是個菜鳥,寫這篇文章可能會被噴,是內存的問題爲何要動數據?

我本人是個喜歡折騰的人,並且這個又是個人云機器因此我當試驗機隨便折騰了。。好壞都無所謂。因此我這麼作,還能夠鍛鍊我對於mysql的理解呢,何樂而不爲?

而後、、、初始化事後,我把datadir目錄下的數據全都刪了!!!!對沒錯,全刪了,或者是移到了其餘不重要的目錄裏面去。

是什麼給了我這麼大勇氣刪數據庫?固然是binlog日誌哈哈哈,我但是對他作了備份呢。諾,你看。以前操做過的數據都會保存在binlog日誌中,在其餘沒有備份機制的狀況下經過他能夠備份出sql文件,而後導入MySQL。

mysqlbinlog --start-datetime="2017-09-30 16:41:00" --stop-datetime="2017-09-30 20:48:00" mysql-bin.000003 > wordpress.sql

好了,此次備份也有了我從新進到MySQL 的datadir目錄從新初始化,初始化完後目錄下會有兩個目錄分別是mysql、test

啓動mysql。這時候打開另外一個會話窗口查看日誌,個人心都要崩潰了。。。

跟上面報錯如出一轍,最後我沒辦法了,沒脾氣了,我直接reboot !!哼哼此次看你還怎麼報錯。

linux內存管理是很是合理的,是不須要咱們插手管理的,他會根據內存大小自動存儲到cache裏。固然此次的重啓就是爲了釋放內存,有人說我小題大作,手工釋放一次內存不就好了?我能告訴你我當時沒有想到這一點嘛。。。。看來我考慮的還不夠全面啊哈哈,仍是欠缺考慮。此次是個人試驗機,下次若是是線上的業務機器不讓重啓那可就沒轍了,還有萬一重啓起不來可就完蛋了。不過通常企業爲了數據安全起見,都會部署至少兩個或兩個以上的數據庫,作個主從,以備故障之需。上次線上機器mysql的innodb出現故障,還好只是sdb,因而我果斷刪除目錄從新初始化,而後再從MDB把數據給同步過來恢復了正常。

在Linux系統下,咱們通常不須要去釋放內存,由於系統已經將內存管理的很好。可是凡事也有例外,有的時候內存會被緩存佔用掉,致使系統使用SWAP空間影響性能,此時就須要執行釋放內存(清理緩存)的操做了。我可真是傻,百度上有釋放內存的資料,我居然沒有想到。哎,這裏記錄下一下吧。

配置文件/proc/sys/vm/drop_caches。這個文件中記錄了緩存釋放的參數,默認值爲0,也就是不釋放緩存。他的值能夠爲0~3之間的任意數字,表明着不一樣的含義:

0 – 不釋放

1 – 釋放頁緩存

2 – 釋放dentries和inodes

3 – 釋放全部緩存

接下來,咱們須要將須要的參數寫進/proc/sys/vm/drop_caches文件中,好比咱們須要釋放全部緩存,就輸入下面的命令:

#echo 3 > /proc/sys/vm/drop_caches

此指令輸入後會當即生效,能夠查詢如今的可用內存明顯的變多了。

要查詢當前緩存釋放的參數,能夠輸入下面的指令:

#cat /proc/sys/vm/drop_caches

 好了重啓ok了,以前作了全部服務開機自啓動,發現mysql已經啓動成功了,可是數據目錄裏面沒有東西,緣由是我剛纔把它刪了哈哈哈。。。。

因此如今備份的sql文件有做用了!!!

直接導入  mysql < wordpress.sql 

大功告成!!!!!個人我的網站又能夠訪問了。

相關文章
相關標籤/搜索