關於Linux更改mysql數據庫目錄辛酸歷程,其實我想交代更多的內容,只是限於文章的實用性,我決定去繁就簡。
今天早上,客戶告訴我期貨交易平台登陸不上去,這肯定是項目出了bug。
show processlist;
發現部分sql等待表級鎖(且這麼叫吧,懶得找翻譯軟件了),我首先想到的是“某幾張表是myisam引擎,容易發生表級鎖,之前就有類似的問題發生,先kill掉sql進程,然後將表引擎由myisam改為innodb。”
當然了,我按照這個想法准備要執行表引擎的更換了,但出現了突發狀況。
二、got error 28 from storage engine
如題所示,當我准備打開表查看數據的時候,出現了“got error 28 from storage engine”錯誤消息提示,我的翻譯是“存儲引擎出現了28錯誤”。
當然我百度了,找到這樣一篇mysql的“Got error 28 from storage engine”錯誤,說實話,這篇文章沒有給我什麼鳥的幫助,但現在回想起來,確實是我自己大意了,雖然說清空“/tmp”目錄的做法不值得推薦,但至少應該去清空一些磁盤,把數據庫備份一下。
當然了,我想到去備份數據,使用了“mysqldump”命令嘗試了一次數據備份,但是遺憾的是,報了一個錯誤,提示我無法保存。這是顯而易見的,因為磁盤本身就不足了,沒有清空磁盤,搞毛線的備份。但這是事後諸葛亮的想法,當時的我顯然沒有針對性的對數據進行備份!再次奉勸各位,數據庫出問題時,即使有自動化的數據備份,但盡量在修正問題之前再做一次實時的備份!
三、df -h
沒有備份成功,我就轉向了另外一個方向,查看數據磁盤空間。
[root@iZ23gsv94suZ run]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 19G 16M 100% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/xvdb1 99G 255M 99G 1% /mnt
看到use等於“100%”,我已經確定問題出在哪裡了,但是我在這裡繼續犯了一個錯誤。
“莫非是阿裡雲的磁盤沒有掛載成功,就是/dev/xvdb1對應的這個100G磁盤沒有掛載成功,否則怎麼把20G的這個盤給沾滿了呢?”
後知後覺的我現在恍然大悟,對於windows操作系統,C盤滿了,怎麼也不會把數據移動到D盤來,然而當時我怎麼都在懷疑阿裡雲的磁盤沒有掛載成功!這就是一個天大的錯誤!
四、阿裡雲磁盤掛載
由於上面這一步認為阿裡雲磁盤沒有掛載成功,所以當時糊塗的我一心要重新掛載磁盤,於是我又在Linux 系統掛載數據盤這個泥潭裡深陷不已,久久不能自拔,由於硬盤確實已經掛在成功,所以我再怎麼費盡心思也只能得到“磁盤已掛載成功”的答案。但是,這裡還是不得不說,一個人的精力實在有限,我幾乎已經是一個全棧工程師,自己對自己在意的標簽是“打雜工,偏java”,這就讓我不得不感慨萬千。
由於是個創業團隊,我又是一個負責人,所以我要做的工作有:
java編程 web編程 Linux編程(shell腳本、項目部署) C#客戶端協調(調查bug、業務探討、相關代碼審核) 安卓編程(目前處於學習階段) 項目管理(麻雀雖小肝膽俱全,我必須要讓每個人開心快樂的工作,效率最大化) 財務、行政(發發工資、請大家聚餐活動、游玩、工作環境布置、澆花、打掃衛生) 需求分析(客戶溝通、需求調查、業務建模) 個人能力提升(編程能力、為人處事能力)
等等等等,只要能想得到的,沒有不做的,實在是無法集中重心專業負責哪一塊,就導致哪一塊都不精通,這也是導致本次問題出現一個關鍵因素。
所以,如果朋友們有好的解決方案,請不吝賜教,我希望通過互聯網認識更多朋友,在未來的創業道路上一路前行,互惠互利。
五、mysql數據庫目錄更改
既然阿裡雲的磁盤已經掛在,那麼接下來的工作就是把mysql的默認數據目錄遷移到100G的盤上,而不是系統盤!
這個過程現在說起來很簡單,但是在執行的過程中,卻是千辛萬苦!
linux 更改mysql的數據庫目錄,這篇文章提供了相應的辦法,按理說,按照裡面提到的方法執行下去就OK,但這裡,我不得不強調,項目千差萬別,每個人解決問題的辦法也不盡相同,所以,動數據庫之前,千萬要先備份!
顯然,我按照這篇文章所說,是沒有把目錄遷移成功,所以你也需要這樣,請千萬注意!
①、mv
Linux的mv命令很強大,但風險系數也很高!
強烈建議使用cp命令,而非mv命令,除非你一萬個確定方案可行。
②、chown -R mysql:mysql /home/data/mysql/
chown -R mysql:mysql /home/data/mysql/ # 改變數據庫的歸屬為mysql
這個語句慎用,反正坑哭了我!
③、 /mnt
前面曾提到
/dev/xvdb1 99G 255M 99G 1% /mnt
不知道,你是否注意,對於我一個Linux的雛鳥來說,顯然沒有意識到這個100G的磁盤,其路徑是“/mnt”,也就是說,mysql的數據目錄需要重置到該“/mnt”目錄下。
④、目錄遷移
1、cp -afpr /var/lib/mysql/ /mnt/
使用cp命令,將mysql的數據默認目錄,移動到新的掛載盤/mnt下面
[root@iZ23gsv94suZ mysql]# pwd
/mnt/mysql
[root@iZ23gsv94suZ mysql]# ls
auto.cnf ib_logfile0 ibtmp1 iZ23gsv94suZ.pid mysql-bin.000001 mysql.sock RPM_UPGRADE_HISTORY
ibdata1 ib_logfile1 iZ23gsv94suZ.err mysql mysql-bin.index performance_schema RPM_UPGRADE_MARKER-LAST
2、vim /etc/my.cnf
[mysql]
default-character-set=utf8
socket = /mnt/mysql/mysql.sock
#
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306
socket = /mnt/mysql/mysql.sock
把mysql配置文件的socket目錄更改到/mnt下對應的路徑
3、vim /etc/init.d/mysql
then
# datadir=/var/lib/mysql
datadir=/mnt/mysql
將該文件中的datadir修改為對應的/mnt目錄
4、ln -s /mnt/mysql/mysql.sock /var/lib/mysql/mysql.sock
使用ln命令,指定一條鏈接給mysql.sock,具體的作用,我不知,你可百度。
按照以上四步,就可以轉移mysql的數據庫目錄了,但是,我的過程遠比這個艱辛。
搞來搞去,我的mysql是搞崩潰了,沒有辦法,需要重新安裝。這裡,你可以參照centOS下安裝mysql5.7、升級mysql到5.7。然後,數據恢復你可以使用source命令,如果涉及到二進制日志恢復,你可以參照mysql之備份和導入數據(包括二進制日志)
但最重要的是,操作數據庫之前,想盡一切辦法先備份數據庫