1. 程式人生 > >mysql資料庫datadir路徑更改記錄

mysql資料庫datadir路徑更改記錄

今天伺服器突然出現故障,所有數表不能寫入,經檢視:

# df -h

顯示:/dev/xvda1 磁碟空間佔用100%

想著系統盤怎麼會有這麼大的寫入量(其實是公司申請的雲伺服器系統盤太小,只有20G,嫌麻煩,沒有升級!)

# cd /var

# du -sh*

最終確定/var/lib/mysql/ibdata1檔案佔磁碟高達11G

度娘了一下mysql ibdata1存放資料,索引等,是MYSQL的最主要的資料。如果不把資料分開存放的話,這個檔案的大小很容易就上了G,甚至幾十G。MySql innodb如果是共享表空間,ibdata1檔案越來越大,達到了30多個G

對於系統盤只有20G,公司不給升級的運維D來說,情何以堪。幸虧掛載盤/mnt夠大。

兩個思路:1、ibdata1瘦身  2、更換datadir路徑

第一個方法網上很多,大家度娘、搜狗一下。

此處,我採用的是第二種:

首先:在/mnt/lib目錄建立mysql資料夾

# mkdir /mnt/lib/mysql

 編輯mysql配置檔案:ubuntu系統一般在/etc/mysql/my.cnf

# vim /etc/mysql/my.cnf

我將datadir改成/mnt/lib/mysql下,則在my.cnf中做如下更改,在[mysqld]段

port            = 3306
basedir         = /usr
datadir         = /mnt/lib/mysql

更改完成儲存退出,可以重啟mysql服務,結果mysql啟動不起來,但是將datadir換回來就能啟動,於是各種度娘度狗度Google,終於發現問題的原因是在ubuntu中存在一個apparmor的服務,這個服務主要作用是主要的作用是設定某個可執行程式的訪問控制權限,可以限制程式 讀/寫某個目錄/檔案,開啟/讀/寫網路埠等等。他的配置檔案在/etc/apparmor.d/中,在這裡我們可以看到一個usr.sbin.mysqld的配置檔案,所以我們要改datadir路徑,這裡也需要做更改。

我做了如下更改:

  /logs/mysql/mysql.log rw,
  /logs/mysql/mysql.err.log rw,
  /mnt/lib/mysql/ r,
  /mnt/lib/mysql/** rwk,

  /logs/mysql/ r,
  /logs/mysql/* rw,

紅色區域是更改的地方。更改完成以後,因為這是一個服務,所以我們需要重啟一下這個服務:

# /etc/init.d/apparmor restart


給/mnt/lib/mysql賦許可權
chown -R mysql:mysql mysql

因為mysql雖然啟動失敗,但是/mnt/lib/mysql目錄仍然生成有:ibdata1 ib_logfile*檔案,

刪除/mnt/lib/mysql目錄下的幾個檔案
# rm -rf ibdata1 ib_logfile*

此時心情那叫一個愉悅,重啟myslq準備關燈睡覺,然並卵。發火發火

重啟mysql
/etc/init.d/mysql start

mysql仍然無法啟動。

檢視錯誤日誌vim /var/log/mysql/error.log

161027 23:43:36 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
161027 23:43:36 InnoDB: The InnoDB memory heap is disabled
161027 23:43:36 InnoDB: Mutexes and rw_locks use GCC atomic builtins
161027 23:43:36 InnoDB: Compressed tables use zlib 1.2.3.4
161027 23:43:36 InnoDB: Initializing buffer pool, size = 128.0M
161027 23:43:36 InnoDB: Completed initialization of buffer pool
161027 23:43:36 InnoDB: highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 49439
161027 23:43:36  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite

又奮戰半小時,各種更改,各種嘗試。最終被一條指令莫名其妙的一錘定音。

神之指令:

# mysql_install_db --user=mysql --ldata=/mnt/lib/mysql/ 其中/mnt/lib/mysql/是自己需要更好的路徑。

再啟動mysql
/etc/init.d/mysql start

一切搞定,此時已經凌晨1:00,運維D趕緊關燈睡覺,以迎接新的挑戰。