mysql把data移走后报错_【mysql案例】Failedtoopenlog--datadir物理迁移报错
1.1.1.mysql5.6.14的datadir遷移時(shí)遇到報(bào)錯(cuò) 【環(huán)境描述】 在機(jī)器A上安裝了perconamysql 5.6.14,數(shù)據(jù)庫停啟正常,datadir路徑為pathA,并且已經(jīng)做了應(yīng)用數(shù)據(jù)庫的初始化工作,然后關(guān)閉了這個(gè)數(shù)據(jù)庫實(shí)例,把它的datadir和/etc/my.cnf遷移到另外一臺(tái)機(jī)器B上的pe
1.1.1. mysql5.6.14的datadir遷移時(shí)遇到報(bào)錯(cuò)
【環(huán)境描述】
在機(jī)器A上安裝了perconamysql 5.6.14,數(shù)據(jù)庫停啟正常,datadir路徑為pathA,并且已經(jīng)做了應(yīng)用數(shù)據(jù)庫的初始化工作,然后關(guān)閉了這個(gè)數(shù)據(jù)庫實(shí)例,把它的datadir和/etc/my.cnf遷移到另外一臺(tái)機(jī)器B上的percona mysql 5.6.14,遷移后的datadir路徑修改成路徑pathB,在啟動(dòng)mysql服務(wù)的時(shí)候遇到問題,啟動(dòng)失敗。
操作步驟:
1) 停掉機(jī)器A上的mysql
service mysql stop
2) 對(duì)機(jī)器A上mysql的datadir(路徑pathA)和my.cnf做打包,傳輸?shù)綑C(jī)器B,并把datadir解壓到pathB
3) 在機(jī)器B上安裝percona mysql 5.6.14
4) 使用機(jī)器A傳輸過來的my.cnf覆蓋機(jī)器B的/etc/my.cnf
5) 修改機(jī)器B的/etc/my.cnf中datadir路徑為pathB
6) 在機(jī)器B上執(zhí)行service mysql start啟動(dòng)mysql服務(wù)
7) 啟動(dòng)失敗,發(fā)生報(bào)錯(cuò)
【mysql報(bào)錯(cuò)】
啟動(dòng)時(shí)的報(bào)錯(cuò)servicemysql start:
Starting MySQL(Percona Server)......Theserver quit without[FAILED]ng PID file(/home/mysql_3306_bak/mysql.pid).
錯(cuò)誤日志中的報(bào)錯(cuò):
/usr/sbin/mysqld: File '/home/mysql_3306/mysql-bin.000003'not found (Errcode: 2 - No such file or directory)
2014-04-25 22:26:47 27048 [ERROR] Failed toopen log (file '/home/mysql_3306/mysql-bin.000003', errno 2)
2014-04-25 22:26:47 27048 [ERROR] Could notopen log file
2014-04-25 22:26:47 27048 [ERROR] Can'tinit tc log
2014-04-25 22:26:47 27048 [ERROR] Aborting
2014-04-25 22:26:47 27048 [Note] Binlog end
2014-04-25 22:26:47 27048 [Note] Shuttingdown plugin 'partition'
已經(jīng)修改了my.cnf配置文件中所有的路徑,但是Mysql仍然說找不到'/home/mysql_3306/mysql-bin.000003'路徑的文件,從報(bào)錯(cuò)看上去很詭異。
【問題原因】
Mysql報(bào)錯(cuò)提示找不到binlog,是由于my.cnf中配置了:
log-bin= /home/mysql_3306/mysql-bin
log-bin-index= /home/mysql_3306/bin-index
mysql會(huì)在log-bin-index參數(shù)指定的文件中維護(hù)log-bin的索引列表,并且它是以絕對(duì)路徑的方式記錄的:
/home/mysql_3306?mysql-bin.000001
/home/mysql_3306?mysql-bin.000002
/home/mysql_3306?mysql-bin.000003
雖然已經(jīng)把/etc/my.cnf中的所有路徑都修改正確了,但是mysql服務(wù)在啟動(dòng)時(shí),是通過讀取log-bin-index來查找log-bin日志文件的,查找的文件還是在機(jī)器A上指定的位置,所以mysql服務(wù)啟動(dòng)失敗。
【解決方法】
手動(dòng)修改log-bin-index指定的二進(jìn)制日志索引文件,修改里面所有l(wèi)og-bin的路徑,指定到當(dāng)前datadir下的二進(jìn)制日志,然后嘗試啟動(dòng)mysql服務(wù),啟動(dòng)成功,問題解決。
【問題思考】
Whatis log-bin-index paramter ?
Mysql官方手冊(cè)中說明“如果沒有在my.cnf中配置log-bin-index參數(shù)指定,mysql會(huì)自動(dòng)創(chuàng)建一個(gè)以host_name-bin.index命名的二進(jìn)制索引文件(實(shí)驗(yàn)證明是mysql-bin.index)”。
所以,嘗試去掉my.cnf中配置的log-bin-index參數(shù),然后啟動(dòng)mysql服務(wù),此時(shí)mysql服務(wù)正常啟動(dòng),查看log-bin-index文件:
#cat mysql-bin.index
/home/mysql_3306_bak/mysql-bin.000006
我們發(fā)現(xiàn)mysql自動(dòng)創(chuàng)建了名為“mysql-bin.index”的二進(jìn)制索引文件,并且文件中只包含在啟動(dòng)時(shí)重新生成的二進(jìn)制文件路徑信息。
此時(shí),mysql只知道此次啟動(dòng)時(shí)生成的二進(jìn)制文件路徑信息,那么也就意味著此時(shí)mysql丟失了編號(hào)000006之前的所有日志文件,我們進(jìn)行如下的測(cè)試:
執(zhí)行flush logs命令,讓mysql再刷出來幾個(gè)二進(jìn)制日志;
#cat mysql-bin.index
/home/mysql_3306_bak/mysql-bin.000006
/home/mysql_3306_bak/mysql-bin.000007
/home/mysql_3306_bak/mysql-bin.000008
然后,執(zhí)行purgebinary logs to 'mysql-bin.000004' 命令:
>purge binary logs to 'mysql-bin.000004';
ERROR1373 (HY000): Target log not found in binlog index
此時(shí),mysql提示無法找到000004號(hào)二進(jìn)制日志文件,接下來嘗試刪除000006號(hào)二進(jìn)制日志文件:
> purge binary logs to'mysql-bin.000007';
QueryOK, 0 rows affected (0.03 sec)
查看mysql-bin.index二進(jìn)制日志索引文件:
#cat mysql-bin.index
/home/mysql_3306_bak/mysql-bin.000007
/home/mysql_3306_bak/mysql-bin.000008
查看二進(jìn)制日志文件:
#ls -ltr mysql-bin.00000*
mysql-bin.000004
mysql-bin.000001
mysql-bin.000002
mysql-bin.000003
mysql-bin.000005
mysql-bin.000007
mysql-bin.000008
mysql已經(jīng)徹底刪除了編號(hào)000006的二進(jìn)制日志文件。
接下來,我們嘗試欺騙mysql,配置一個(gè)指向虛機(jī)路徑的二進(jìn)制日志文件:
#cat mysql-bin.index
/tmp/mysql-bin.0000005
/home/mysql_3306_bak/mysql-bin.000007
/home/mysql_3306_bak/mysql-bin.000008
在mysql中嘗試刪除編號(hào)000007之前的日志:
>purge binary logs to 'mysql-bin.000007';
ERROR 29 (HY000): File '/tmp/mysql-bin.0000005' not found (Errcode:2 - No such file or directory)
mysql在讀取log-bin-index日志索引文件刪除日志的時(shí)候發(fā)現(xiàn)日志文件不存在,報(bào)錯(cuò);
我們?cè)趪L試重啟mysql,來判斷它是如何讀取和加載log-bin-index日志索引文件 以及索引文件中指定的二進(jìn)制日志文件的:
# service mysql stop
Shutting down MySQL (PerconaServer)... [ OK ]
# service mysql start
Starting MySQL (PerconaServer).... [ OK ]
查看error.log日志:
2014-04-2600:53:28 7f752cddc700 InnoDB: Buffer pool(s) load completed at 140426 0:53:28
^G/usr/sbin/mysqld:File '/tmp/mysql-bin.0000005' not found (Errcode: 2 - No such file or directory)
2014-04-2600:53:28 16723 [ERROR] Failed to open log (file '/tmp/mysql-bin.0000005', errno2)
2014-04-2600:53:28 16723 [ERROR] Could not open log file
【總結(jié)】
雖然mysql的error日志中有error信息,但是mysql仍然成功啟動(dòng)了,也就是說mysql在啟動(dòng)過程會(huì)讀取log-bin-index文件,然后也會(huì)判斷索引指定的log-bin文件是否存在,結(jié)合本案例中遇到的情況,可以知道只有當(dāng)最后一個(gè)路徑指定的log-bin不存在時(shí),mysql服務(wù)才會(huì)中斷啟動(dòng)操作,即啟動(dòng)失敗。
【Sum Up】
1) 如果mysql沒有開啟binlog,則不會(huì)遇到這個(gè)問題;
2) 如果mysql開啟了binlog,并且在Datadir物理遷移的過程中,修改了datadir的路徑,就會(huì)遇到這個(gè)問題,此時(shí),可以編輯log-bin-index文件修復(fù)log-bin文件的路徑或者直接刪除,然后啟動(dòng)mysql服務(wù);
3) 為了避免遇到這個(gè)問題,在進(jìn)行datadir遷移的時(shí)候,盡量不要改變datadir的路徑;
本條技術(shù)文章來源于互聯(lián)網(wǎng),如果無意侵犯您的權(quán)益請(qǐng)點(diǎn)擊此處反饋版權(quán)投訴
本文系統(tǒng)來源:php中文網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的mysql把data移走后报错_【mysql案例】Failedtoopenlog--datadir物理迁移报错的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java是否为整数_Java问题 输入一
- 下一篇: java 发送qq消息_php发送qq消