mysql的innodb表生成的物理文件_MySQL innodb表使用表空间物理文件复制或迁移表
MySQL InnoDB引擎的表通過(guò)拷貝物理文件來(lái)進(jìn)行單表或指定表的復(fù)制,可以想到多種方式,今天測(cè)試其中2種:
將innodb引擎的表修改為Myisam引擎,然后拷貝物理文件
直接拷貝innodb的表空間文件(前提是獨(dú)立表空間(默認(rèn),通過(guò)show variables like 'innodb_file_per_table' 查看))進(jìn)行復(fù)制
一、修改引擎
1.創(chuàng)建一張innodb引擎的表,并插入測(cè)試數(shù)據(jù);
create table test_tb(id int primary key,c1 varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into test_tb select 1,'c1';insert into test_tb select 2,'c2';
2. 修改引擎
alter table test_tb engine=myisam;
showcreate table test_tb\G
3. 將物理文件拷貝至目標(biāo)庫(kù)
cd /data/mysql/mysql3307/data/cd testdbllcd ../testdb2/
pwdll
cp ../testdb/test_tb.*.ll
4.修改權(quán)限
chown -R mysql:mysql .
5. 查看結(jié)果
記錄和源庫(kù)一致。
6. 將源庫(kù)及目標(biāo)庫(kù)的表引擎修改為innodb
alter table testdb.test_tb engine=innodb;alter table testdb2.test_tb engine=innodb;
二、拷貝.idb物理表空間文件
1.? 創(chuàng)建一張innodb的表,為了測(cè)試大表的情況,我創(chuàng)建了一張800W記錄的表,占用940M空間
/*先創(chuàng)建快速生成連續(xù)數(shù)的表及存儲(chǔ)過(guò)程*/
--建表
CREATE TABLE`test_tb2` (
`id`int(11) DEFAULT NULL,
`aa`varchar(20) DEFAULT NULL,
`bb`varchar(20) DEFAULT NULL,
`cc`varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;--創(chuàng)建過(guò)程
DELIMITER $$CREATE PROCEDURE `sp_test_tb2`(cnt INT)BEGIN
DECLARE i INT DEFAULT 1;TRUNCATE TABLEtest_tb2;INSERT INTO test_tb2 SELECT concat(i,'a'),concat(i,'b'),concat(i,'c') ;WHILE i
INSERT INTO test_tb2 SELECT id + i,concat(id+i,'a'),concat(id+i,'b'),concat(id+i,'c') FROM test_tb2 WHERE id + i<=cnt;SET i = i*2;END;END WHILE;END$$
DELIMITER ;--生成8000000條記錄
call sp_test_tb2(8000000);select count(*) from test_tb2;
2. 在目標(biāo)庫(kù)創(chuàng)建相同的表名
mysql> usetestdb2;CREATE TABLE`test_tb2` (
`id`int(11) DEFAULT NULL,
`aa`varchar(20) DEFAULT NULL,
`bb`varchar(20) DEFAULT NULL,
`cc`varchar(20) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 刪除目標(biāo)表的表空間
alter table test_tb2 discard tablespace;
此時(shí)目標(biāo)庫(kù)的test_tb2表近剩下數(shù)據(jù)定義文件,表空間文件已刪除
4. 拷貝源庫(kù)的idb文件
/** 需先f(wàn)lush table */
flush table test_tb2 for export ;
之后拷貝(會(huì)生成一個(gè)cfg文件 也一并拷貝過(guò)去)
拷貝完成后需解鎖test_tb2表
unlock tables;
5. 修改表空間文件權(quán)限
6. 目標(biāo)表導(dǎo)入表空間數(shù)據(jù)(記錄較多的時(shí)候需要一點(diǎn)時(shí)間)
alter table test_tb2 import tablespace;
7. 查看導(dǎo)入結(jié)果
結(jié)果與源表一致
Tips:
以上2種處理方式都需要源表無(wú)寫入更新等操作下進(jìn)行,且需要flush tables 將數(shù)據(jù)刷新到物理磁盤的文件上。所以建議先鎖表或停止業(yè)務(wù),待拷貝文件后再恢復(fù)寫入等操作。
耿小廚已開通個(gè)人微信公眾號(hào),想進(jìn)一步溝通或想了解其他文章的同學(xué)可以關(guān)注我
總結(jié)
以上是生活随笔為你收集整理的mysql的innodb表生成的物理文件_MySQL innodb表使用表空间物理文件复制或迁移表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql5.6 临时表_MySQL5.
- 下一篇: mysql主库从库binlog_MySQ