mysqlは表領域を介してデータを復元または転送する

11045 ワード

mysqlのバックアップツールには、通常mysqldump、mysqlpump(5.7以降の新しいプロパティ)などのバックアップツールがあります.ここでは、表領域を使用して転送してみましょう.
データファイルのコピー+表領域のコピー   対応innodbエンジンはibdファイルとcfgファイルです
この方式を実行するための要求
(1)         ,  innodb_file_per_table  ;
(2)      ,          ;
(3)       data page size    ;
(4)  MySQL 5.7.4                  ;
(5)      ,     set foreign_key_check=0      ,             ,                ;

 
次に例を挙げて説明する
1一般的な表領域の転送
2つのmysql、ソース+ターゲットを用意し、同時にテーブル作成コマンドを行います.1つはソースmysqlと呼ばれ、1つはターゲットmysqlと呼ばれます.
create table first(id int,name char(16));

ソースmysqlにデータを挿入する
insert into first values(1,'ni'),(2,'wo'),(3,'ta');

ターゲットmysql上で表領域を解放する
alter table first discard tablespace;  #      first.ibd  ,    first.frm
frm , :rename table,drop table , ibd , :dml
select * from first;
ERROR 1814 (HY000): Tablespace has been discarded for table 'first'

 ソースmysqlに.cfgメタデータファイルを作成します.現在のウィンドウを閉じないでください.そうしないと消えません.
flush tables first for export;  #  , MySQL  first.cfg  ,

insert into first values(10,'hehe'); DML

ERROR 1099 (HY000): Table 'first' was locked with a READ lock and can't be updated

first.cfg first.ibd mysql

cp   mysql  /first.{cfg,ibd}    mysql/

chown mysql.mysql *

mysql

UNLOCK TABLES;

mysql

alter table first  import tablespace;

mysql

select * from first;

 2 (mysql5.7.4 )

 test_range_partition

database test_range_partition

mysql> CREATE TABLE test_range_partition(
    ->     id INT auto_increment,
    ->     createdate DATETIME,
    ->     primary key (id,createdate)
    -> ) 
    -> PARTITION BY RANGE (TO_DAYS(createdate) ) (
    ->    PARTITION p201801 VALUES LESS THAN ( TO_DAYS('20180201') ),
    ->    PARTITION p201802 VALUES LESS THAN ( TO_DAYS('20180301') ),
    ->    PARTITION p201803 VALUES LESS THAN ( TO_DAYS('20180401') ),
    ->    PARTITION p201804 VALUES LESS THAN ( TO_DAYS('20180501') ),
    ->    PARTITION p201805 VALUES LESS THAN ( TO_DAYS('20180601') ),
    ->    PARTITION p201806 VALUES LESS THAN ( TO_DAYS('20180701') ),
    ->    PARTITION p201807 VALUES LESS THAN ( TO_DAYS('20180801') ),
    ->    PARTITION p201808 VALUES LESS THAN ( TO_DAYS('20180901') ),
    ->    PARTITION p201809 VALUES LESS THAN ( TO_DAYS('20181001') ),
    ->    PARTITION p201810 VALUES LESS THAN ( TO_DAYS('20181101') ),
    ->    PARTITION p201811 VALUES LESS THAN ( TO_DAYS('20181201') ),
    ->    PARTITION p201812 VALUES LESS THAN ( TO_DAYS('20190101') )
    -> );
Query OK, 0 rows affected (0.06 sec)

alter table test_range_partition discard partition p201802 tablespace;

[root@localhost target]# ls
db.opt                              test_range_partition#P#p201805.ibd  test_range_partition#P#p201810.ibd
test_range_partition.frm            test_range_partition#P#p201806.ibd  test_range_partition#P#p201811.ibd
test_range_partition#P#p201801.ibd  test_range_partition#P#p201807.ibd  test_range_partition#P#p201812.ibd
test_range_partition#P#p201803.ibd  test_range_partition#P#p201808.ibd
test_range_partition#P#p201804.ibd  test_range_partition#P#p201809.ibd

mysql> flush tables test_range_partition for export;
Query OK, 0 rows affected (0.00 sec)

scp ip/test_range_partition#P#p201802.{cfg,ibd} /

, ,

[root@localhost target]# ls
db.opt                              test_range_partition#P#p201803.ibd  test_range_partition#P#p201808.ibd
test_range_partition.frm            test_range_partition#P#p201804.ibd  test_range_partition#P#p201809.ibd
test_range_partition#P#p201801.ibd  test_range_partition#P#p201805.ibd  test_range_partition#P#p201810.ibd
test_range_partition#P#p201802.cfg  test_range_partition#P#p201806.ibd  test_range_partition#P#p201811.ibd
test_range_partition#P#p201802.ibd  test_range_partition#P#p201807.ibd  test_range_partition#P#p201812.ibd

chown mysql.mysql *

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

mysql> alter table test_range_partition import partition p201802 tablespace;  #             
ERROR 1812 (HY000): Tablespace is missing for table `target`.`test_range_partition`.
mysql> alter table test_range_partition import partition p201802 tablespace;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from test_range_partition; #      ,             ,            
+----+---------------------+
| id | createdate          |
+----+---------------------+
|  2 | 2018-02-05 00:00:00 |
|  3 | 2018-02-06 00:00:00 |
+----+---------------------+
2 rows in set (0.00 sec)