日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
InnoDB數(shù)據(jù)表空間文件平滑遷移

如何遷移?

創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、建安網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開(kāi)發(fā)、商城系統(tǒng)網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為建安等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

從MySQL文檔中我們了解到,InnoDB的表空間可以是共享的或獨(dú)立的。如果是共享表空間,則所有的表空間都放在一個(gè)文件里:ibdata1,ibdata2..ibdataN,這種情況下,目前應(yīng)該還沒(méi)辦法實(shí)現(xiàn)表空間的遷移,除非完全遷移,因此不在本次討論之列;我們只討論獨(dú)立表空間的情況。

不管是共享還是獨(dú)立表空間,InnoDB每個(gè)數(shù)據(jù)表的元數(shù)據(jù)(metadata)總是保存在 ibdata1 這個(gè)共享表空間里,因此該文件必不可少,它還可以用來(lái)保存各種數(shù)據(jù)字典等信息。數(shù)據(jù)字典中,會(huì)保存每個(gè)數(shù)據(jù)表的ID號(hào),每次發(fā)生數(shù)據(jù)表空間新增時(shí),都會(huì)使得該ID自增一個(gè)值(++1),例如:CREATE TABLE xx ENGINE = InnoDB / ALTER TABLE xx ENGINE = InnoDB 都會(huì)使得ID值增加。

有了上面的理解,想要實(shí)現(xiàn)InnoDB表空間文件的平滑遷移就很容易了,呵呵。下面是一些例子:

假定我們有2臺(tái)DB主機(jī),一個(gè)是A,一個(gè)B,現(xiàn)在想把A上的某個(gè)InnoDB表空間文件遷移到B上直接用。

一、遷移失敗的例子

直接從A上把表空間文件 yejr.ibd 拷貝到 B 上后,導(dǎo)入表空間,報(bào)錯(cuò),無(wú)法使用。這是由于A,B上創(chuàng)建該表時(shí)的順序不一致,導(dǎo)致表的ID不一樣,無(wú)法導(dǎo)入。

注意:在這里,表空間文件直接拷貝的前提是該表空間處于"干凈"狀態(tài)下,也就是所有的數(shù)據(jù)均已經(jīng)刷新到磁盤(pán)中,否則可能導(dǎo)致無(wú)法使用或部分?jǐn)?shù)據(jù)丟失。

1. 在B上將舊的表空間廢棄

(root@imysql.cn/17:52:47)[yejr]>ALTER TABLE yejr DISCARD TABLESPACE;
Query OK, 0 rows affected (0.00 sec)

2. 拷貝到目標(biāo)機(jī)器

scp yejr.ibd B:/home/mysql/yejr/yejr.ibd
....

3. 啟用該表空間

(root@imysql.cn/17:52:47)[yejr]>ALTER TABLE yejr IMPORT TABLESPACE;
ERROR 1030 (HY000): Got error -1 from storage engine

4. 查看錯(cuò)誤

InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: Error: trying to open a table, but could not
InnoDB: open the tablespace file './test/b.ibd'!
InnoDB: Error: cannot reset lsn's in table `test/b`
InnoDB: in ALTER TABLE ... IMPORT TABLESPACE

5. 很明顯,是權(quán)限的問(wèn)題,修正過(guò)來(lái),然后重新導(dǎo)入

(root@imysql.cn/17:52:47)[yejr]>ALTER TABLE yejr DISCARD TABLESPACE;
ERROR 1030 (HY000): Got error -1 from storage engine

6. 怎么還是錯(cuò)誤?繼續(xù)看日志

InnoDB: Error: tablespace id in file './yejr/yejr.ibd' is 15, but in the InnoDB
InnoDB: data dictionary it is 13.
InnoDB: Have you moved InnoDB .ibd files around without using the
InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?
InnoDB: Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/innodb-troubleshooting.html
InnoDB: for how to resolve the issue.
InnoDB: cannot find or open in the database directory the .ibd file of
InnoDB: table `yejr/yejr`
InnoDB: in ALTER TABLE ... IMPORT TABLESPACE

從上面的日志得知,由于在A服務(wù)器上,yejr表的ID是15,而在B服務(wù)器上,yejr表的ID卻是13,二者不一致,因此遷移失敗。

既然只是因?yàn)镮D不一樣,而且有了上面的理論基礎(chǔ),我們完全可以人為的讓它們的ID一致嘛,請(qǐng)看下面的第2次嘗試。

二、人工干預(yù)下的成功遷移

1. 上面的例子中,B上面的yejr表ID為13,而A上面為15;因此只需要讓B上的yejr表ID增加2就可以了。

(root@imysql.cn/17:52:47)[yejr]>ALTER TABLE yejr RENAME TO yejr1;
Query OK, 0 rows affected (0.00 sec)
#這個(gè)時(shí)候,yejr的ID變?yōu)?4
(root@imysql.cn/17:52:47)[yejr]>ALTER TABLE yejr1 RENAME TO yejr;
Query OK, 0 rows affected (0.00 sec)
#這個(gè)時(shí)候,yejr的ID變?yōu)?5

2. 然后,我們?cè)賹?dǎo)入

(root@imysql.cn/17:52:47)[yejr]>ALTER TABLE yejr IMPORT TABLESPACE;
Query OK, 0 rows affected (0.00 sec)
(root@imysql.cn/17:52:47)[yejr]>select count(*) from yejr;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

看到了吧,成功了,呵呵。想要讓其它ID增加的方式也可以重復(fù)創(chuàng)建表,根據(jù)實(shí)際情況或者個(gè)人喜好而定了。

以上測(cè)試均在MySQL 5.0.67版本下通過(guò),只不過(guò)顯示數(shù)據(jù)稍作處理了。


本文題目:InnoDB數(shù)據(jù)表空間文件平滑遷移
網(wǎng)站網(wǎng)址:http://www.dlmjj.cn/article/djpjgjs.html