亚洲国产精品人久久,亚洲va国产日韩欧美精品色婷婷,久久久久88色偷偷,免费人成黄页在线观看国际

17站長網

17站長網 首頁 數據庫 Mysql 查看內容

MySQL傳輸表空間總結

2023-3-16 14:23| 查看: 1850 |來源: 互聯網

在MySQL中如果要遷移一個表導另外一個服務器/環境中,常規的做法就是使用備份工具備份,比如mysqldump,然后拷貝備份到目標服務器或者環境導入。如果某一個表數 ...

在MySQL中如果要遷移一個表導另外一個服務器/環境中,常規的做法就是使用備份工具備份,比如mysqldump,然后拷貝備份到目標服務器或者環境導入。如果某一個表數據量很大,導出dump文件很大的情況下,使用導出導入工具其實會花費不少的時間.

怎么樣提高效率呢,可以有一種想法就是直接拷貝數據文件到目標環境,當然在早期版本中這么做是不可取的,因為會有很多關聯數據在ibdata中,InnoDB的數據存在對應的數據字典信息,是存放在共享表空間中,無法直接剝離出來,而在5.6/5.7中,就推出了一個很不錯的特性,就是遷移表空間,可以把這個配置信息剝離出來,簡單來說就是把數據文件直接拷貝到目標環境,在目標端掛載即可。

這樣一個操作的一個基本前提是使用了獨立表空間,開啟innodb_file_per_table.

>show variables like '%per_table%';

+-----------------------+-------+

| Variable_name         | Value |

+-----------------------+-------+

| innodb_file_per_table | ON    |

+-----------------------+-------+

1 row in set (0.00 sec)

 

跨版本傳輸表空間-源端操作

我們做一個有代表意義的測試,比如把某一個表從MySQL 5.6環境遷移到MySQL 5.7環境中。

 

 我們選擇一個表users作為測試所用,數據量在2萬條左右。數據文件情況:

 

-rw-rw---- 1 mysql mysql      8602 Feb 13 23:10 users.frm

-rw-rw---- 1 mysql mysql  11534336 Mar 12 22:55 users.ibd數據情況:

 

> select count(*) from users;

+----------+

| count(*) |

+----------+

|    20001 |

+----------+

1 row in set (0.01 sec)我們開始遷移數據,首先要生成一個cfg文件,導出配置信息。

  

-rw-rw---- 1 mysql mysql       599 Mar 13 08:17 users.cfg

-rw-rw---- 1 mysql mysql      8602 Feb 13 23:10 users.frm

-rw-rw---- 1 mysql mysql  11534336 Mar 12 22:55 users.ibd在flush table之后,這個表users就被鎖定了,DML操作是阻塞的,也就意味著遷移的過程中,是無法直接寫入數據的。

 

# strings users.cfg

mbionline.test.com    

test/users

userid

        username

DB_ROW_ID

DB_TRX_ID

DB_ROLL_PTR

PRIMARY

userid

DB_TRX_ID

DB_ROLL_PTR

        username

        username

        username

userid

idx_users

userid

username完成之后推出會話,設置unlock tables即可。

> alter table users import tablespace;

ERROR 1808 (HY000): Schema mismatch (Table flags don't match, server table has 0x5 and the meta-data file has 0x1)或者下面的錯誤:

> alter table users import tablespace;

ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)通過錯誤信息可以發現和表的一個屬性有關。我們先解決問題,添加屬性row_format

CREATE TABLE `users` (

  `userid` int(11) unsigned NOT NULL,

  `username` varchar(64) DEFAULT NULL,

  PRIMARY KEY (`userid`),

  KEY `username` (`username`),

  KEY `idx_users` (`userid`,`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 row_format=compact;然后繼續嘗試Import tablespace操作。

回到剛剛碰到的問題,為什么在5.6遷移至5.7會有報錯。

> alter table users import tablespace;

ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)原因就是Innodb_file_format在5.6中是Antelope,在MySQL 5.7中是Barracuda,主要是在表壓縮和行的動態格式上有所改變。更詳細的內容可以參考:

https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-7.html

小結

其實這個特性在Oracle中已經有耳熟能詳的的方案,TTS,支持跨平臺,轉換字節順序,甚至可以支持基于增量備份的遷移方案,MySQL中的遷移方式和Oracle傳統的TTS有些相似。當然上面的操作還可以使用Percona的工具innobackupex 來完成,我們下一篇來進行演示。

本文最后更新于 2023-3-16 14:23,某些文章具有時效性,若有錯誤或已失效,請在網站留言或聯系站長:17tui@17tui.com
·END·
站長網微信號:w17tui,關注站長、創業、關注互聯網人 - 互聯網創業者營銷服務中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!

17站長網微信二維碼

始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!

掃一掃,關注站長網微信

大家都在看

    熱門排行

      最近更新

        返回頂部