InnoDB--------独立表空间平滑迁移

1. 背景

* InnoDB的表空间可以是共享的或独立的。如果是共享表空间,则所有的表空间都放在一个文件里:ibdata1,ibdata2..ibdataN,这种情况下,目前应该还没办法实现表空间的迁移,除非完全迁移。

  * 不管是共享还是独立表空间,InnoDB每个数据表的元数据(metadata)总是保存在 ibdata1 这个共享表空间里,因此该文件必不可少,它还可以用来保存各种数据字典等信息。

* 独立表空间中数据文件单独存放在.ibd文件中。

* MySQL 5.6版本开始支持独立表空间导入与导出。

2. 环境 [ 2台DB实例, MySQL 5.6表迁移至MySQL5.7 ]

* 源实例 MySQL

mysql> show variables like ‘innodb%version‘;
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| innodb_version | 5.6.36 |
+----------------+--------+
1 row in set (0.01 sec)

mysql> show variables like ‘datadir‘;
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| datadir       | /data/mysql_data6/ |
+---------------+--------------------+
1 row in set (0.00 sec)

* 目的实例 MySQL

mysql> show variables like ‘innodb%version‘;
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| innodb_version | 5.7.18 |
+----------------+--------+
1 row in set (0.00 sec)

mysql> show variables like ‘datadir‘;
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| datadir       | /data/mysql_data7/ |
+---------------+--------------------+
1 row in set (0.01 sec)

* 源实例 MySQL 迁移的数据库与表信息

mysql> select database();
+------------+
| database() |
+------------+
| mytest     |
+------------+
1 row in set (0.00 sec)

mysql> show create table users;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                      |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `sex` enum(‘M‘,‘F‘) NOT NULL DEFAULT ‘M‘,
  `age` int(11) NOT NULL DEFAULT ‘0‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> select * from users;
+----+-------+-----+-----+
| id | name  | sex | age |
+----+-------+-----+-----+
|  1 | tom   | M   |  25 |
|  2 | jak   | F   |  38 |
|  3 | sea   | M   |  43 |
|  4 | lisea | M   |  36 |
+----+-------+-----+-----+
4 rows in set (0.00 sec)

3. 平滑迁移实战 [ 迁移mytest数据库下users表 ]

* 目的MySQL实例创建相同的数据库与表 [ MySQL 5.7中创建表需要指定row_format=compact ]

mysql> create database mytest character set utf8mb4;
Query OK, 1 row affected (0.03 sec)

mysql> use mytest;
Database changed
mysql> CREATE TABLE `users` (
    ->   `id` bigint(20) NOT NULL AUTO_INCREMENT,
    ->   `name` varchar(255) NOT NULL,
    ->   `sex` enum(‘M‘,‘F‘) NOT NULL DEFAULT ‘M‘,
    ->   `age` int(11) NOT NULL DEFAULT ‘0‘,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 row_format=compact;
Query OK, 0 rows affected (0.59 sec)

mysql> system ls -l /data/mysql_data7/mytest/
total 64
-rw-r----- 1 mysql mysql    67 Jul 18 05:21 db.opt
-rw-r----- 1 mysql mysql  8648 Jul 18 05:21 users.frm
-rw-r----- 1 mysql mysql 49152 Jul 18 05:21 users.ibd

* 目的MySQL实例丢弃表空间

mysql> alter table users discard tablespace;
Query OK, 0 rows affected (0.01 sec)

mysql> system ls -l /data/mysql_data7/mytest/
total 16
-rw-r----- 1 mysql mysql   67 Jul 18 05:21 db.opt
-rw-r----- 1 mysql mysql 8648 Jul 18 05:21 users.frm

* 源MySQL实例刷新表至磁盘并加lock,并且当前表quiesce状态,只读,且创建.cfg metadata文件

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

* 从源MySQL实例服务止拷贝表文件users.ibd, users.cfg文件至目的MySQL实例中

[[email protected] ~]# cp -v /data/mysql_data6/mytest/users.{cfg,ibd} /data/mysql_data7/mytest/
`/data/mysql_data6/mytest/users.cfg‘ -> `/data/mysql_data7/mytest/users.cfg‘
`/data/mysql_data6/mytest/users.ibd‘ -> `/data/mysql_data7/mytest/users.ibd‘

* 修改目的MySQL实例数据文件下拷贝文件的所有者与所有组

[[email protected] ~]# chown -v mysql.mysql /data/mysql_data7/mytest/users.{cfg,ibd}
changed ownership of `/data/mysql_data7/mytest/users.cfg‘ to mysql:mysql
changed ownership of `/data/mysql_data7/mytest/users.ibd‘ to mysql:mysql

* 源MySQL实例释放lock

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

  * 目的MySQL实例加载表空间

mysql> alter table users import tablespace;
Query OK, 0 rows affected (0.04 sec)

* 查看目的MySQL实例表数据 [ MySQL5.6数据成功迁移过来 ]

mysql> select * from users;
+----+-------+-----+-----+
| id | name  | sex | age |
+----+-------+-----+-----+
|  1 | tom   | M   |  25 |
|  2 | jak   | F   |  38 |
|  3 | sea   | M   |  43 |
|  4 | lisea | M   |  36 |
+----+-------+-----+-----+
4 rows in set (0.00 sec)

4. 注意问题

* MySQL 5.6数据迁移到MySQL5.7时,如果创建目的表时不指定row_format,import表数据时会报错,原因在于MySQL 5.6中是Antelope,在MySQL 5.7中是Barracuda,主要是在表压缩和行的动态格式上有所改变。


5. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。

时间: 2024-12-09 00:12:13

InnoDB--------独立表空间平滑迁移的相关文章

InnoDB独立表空间

使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:数据文件(.MYD),索引文件(.MYI)和表结构文件(.frm).我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而,当你使用InnoDB的时候,一切都变了. InnoDB默认会将所有的数据库的数据存储在一个共享表空间:ibdata1文件中,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题.通常只能将数据使用mysqldump导出,

Innodb独立表空间的配置

环境介绍: MySQL版本:5.5.40 1.查看独立表空间是否开启 mysql> show variables like '%per_table%'; +-----------------------+-------+ | Variable_name         | Value | +-----------------------+-------+ | innodb_file_per_table | OFF   | +-----------------------+-------+ 1 r

看懂MySQL怎样判断InnoDB表是独立表空间还是共享表空间

本文参考原文-http://bjbsair.com/2020-03-22/tech-info/5348/概述 InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file),用户可以通过参数innodb_data_file_path对其进行设置,可以有多个数据文件,如果没有设置innodb_file_per_table的话, 那些Innodb存储类型的表的数

mysql5.7 InnoDB数据表空间文件平滑迁移

[ERROR] [FATAL] InnoDB: Tablespace id is 14 in the data dictionary but in file ./mysql/innodb_index_stats.ibd it is 696! --先测试直接把.ibd文件拷贝过去   (这种方法失败,因为tablespace_id不一致) mysqld_safe --defaults-file=/usr/my-new.cnf &    --启库 总结: 对于innodb每个表都有各自的表空间来说,

InnoDB 引擎独立表空间 innodb_file_per_table

使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而当你使用InnoDB的时候,一切都变了. InnoDB 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题.通常只能将数据使用mysqldump 导出,然后再导入解决这个问题.

MySQL InnoDB 共享表空间和独立表空间

共享表空间 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下. 默认的文件名为ibdata1, 初始化为10M. 由于是默认的方式,就暂且理解为Mysql官方推荐的方式.相对而言所有的数据都在一个(或几个)文件中,比较利于管理,而且在操作的时候只需要open这一个(或几个)文件即可,相对来说代价很低.但问题是在数据达到以G为单位来计算的时候优劣逆转.一个过大的文件很不利于管理,而且对于一个如此巨大的文件来说,读写它需要耗费的资源一样巨大.更加令

mysql InnoDB引擎 共享表空间和独立表空间(转载)

PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空间 共享表空间以及独占表空间都是针对innodb表的数据存储而言的,ibdata1为innodb引擎的存储数据与索引的数据文件,ib_logfile0与ib_logfile1为innodb引擎使用的日志文件共享表空间: mysql服务器中所有数据库的innodb表(数据,索引)全部放在一个文件中,默

mysql之innodb引擎的共享表空间和独立表空间

对于innodb的数据存储文件,首先要解决两个概念性的问题: 共享表空间以及独占表空间.(innodb引擎与MYISAM引擎的区别很大.特别是它的数据存储方式等.) 1.共享表空间和独占表空间介绍 共享表空间以及独占表空间都是针对数据的存储方式而言的. 共享表空间:  每一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下. 默认的文件名为:ibdata1  初始化为10M. 独占表空间:  每一个表都将会生成以独立的文件方式来进行存储,每一个表都有

MySQL如何判别InnoDB表是独立表空间还是共享表空间

InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file),用户可以通过参数innodb_data_file_path对其进行设置,可以有多个数据文件,如果没有设置innodb_file_per_table的话, 那些Innodb存储类型的表的数据都放在这个共享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存储引