Mysql5.6迁移到Mysql5.7

Mysql5.6与Mysql5.7在mysql库表上有差异,特别是user表中password修改成authentication_string ,还增加了几个字段。所以该迁移带来问题。

方案1:

1)在Mysql5.6下使用xtrbackup对数据库全量复制。

  #innobackup 

2)在Mysql5.7停止mysqld服务

  #systenctl stop mysqld

3)[可选]在新安装的Mysql5.7下物理复制/var/lib/mysql库表,特别是mysql,performance_schema(MyISAM引擎)表,复制到/tmp/mysql-old下。  

  #mkdir -p /tmp/mysql-old

  #cp -r /var/lib/mysql /tmp/mysql-old

4)在Mysql5.7下,删除/var/lib/mysql下库表

  #rm -rf /var/lib/mysql/*

5)[可选]在Mysql5.7下,初始化Mysql数据库(必须/var/lib/mysql位空目录)

  #mysqld --user=mysql --initialize

  或

  #mysqld --user=mysql --initialize-noinsurce

6)Mysql5.7下物理复制/var/lib/mysql库表,特别是mysql,performance_schema(MyISAM引擎)表,复制到/tmp/mysql-old下

  #mkdir -p /tmp/mysql-old

  #cp -r /var/lib/mysql    /tmp/mysql-old

7)在Mysql5.7下,清空/var/lib/mysql下库表

  #rm -rf /var/lib/mysql/*

8)在Mysql5.7下,使用xtrbackup恢复全量备份

  #innoback-up --apply-log --redo-log backup

  #innoback-up --copy-back backup

9)删除xtrbackup恢复的mysql,performance_schema等库管理表(除业务数据库表外),因为特表是mysql是来自Mysql5.6

  #rm -rf /var/lib/mysql/{mysql,performance_schema}

10)复制Mysql5.7的mysql,performance_schema等库管理表,因为MyISAM引擎可直接物理复制。

  #cp -r   /tmp/mysql-old/{mysql,performance_schema}     /var/lib/mysql/

11)Mysql5.7下对恢复目录修改所属所组

  #chown -R mysql.mysql    /var/lib/mysql/

12)启动Mysql5.7

  #systemctl start mysqld

13)手动添加Mysql5.6下用户及授权。

 

注1:如果启动Mysql5.7先与Mysql5.7下对恢复目录修改所属所组,因为/var/lib/mysql下库表权限为root,mysql用户无法访问。所以会报错,此时在/var/lib/mysql下生成xxx.socket.lock文件(文件名由/etc/my.cnf决定)。解决方法:

  #rm -rf  mysql.socket.lock

  #chown -R mysql.mysql    /var/lib/mysql/ 

  #systemctl start mysqld

 

注2:上述过程主要是通过xtrbackup全量恢复后删除Mysql5.6中mysql表等,用Mysql5.7中的mysql表等代替。注意这个顺序,不能把顺序颠倒;如在/var/lib/mysql下先保留Mysql5.7等文件,在从xtrbackup全量恢复中拷贝业务库表回来,这样会使业务库表表空间不存在,同时报Table “xxx.xx”  not exist.---->原因是表空间问题,因为innodb引擎库表文件包括日志文件。【表空间】

 

注3:可以对Mysql5.6中mysql等管理库表使用mysqldump来复制,然后修改备份的逻辑备份文件,最后通过它生产Mysql5.7的mysql表数据。

 

注4:若数据库都使用MyISAM引擎,可采用冷备方式,直接复制对应数据库目录(物理复制)即可,恢复时重新复制回来就行。

  #mysqldump -u root -p userdb > /root/userdb.sql       //只备份某一数据库

  #cat userdb.sql 

  #mysqldump -u root -p  -B mysql userdb > /root/userdb2.sql   //备份多个数据库

  恢复userdb库时,通常不建议覆盖旧库,而采用新建库并导入逻辑备份的方式执行恢复,待新库正常后即可废弃或删除旧库。

  >create database  userdb2;    //创建userdb2的新库

  #mysql -u root -p userdb2 < /root/userdb.sql;    //导入备份文件,在新库中重建表及数据

  >select sn,username from userdb2.userlist limit 10;  //确认新库正常,启用新库

  >drop database userdb;        //废弃或删除旧库

 

注5:只有InnoDB存储引擎的表才能支持外键。外键字段如果没有指定索引名称,会自动生成。如果要删除父表(如分类表)中的记录,必须先删除子表(带外键的表,如文章表)中的相应记录,否则会出错。 创建表的时候,可以给字段设置外键,如 foreign key(cate_id) references cms_cate(id),由于外键的效率不是很好,因此并不推荐使用外键,但我们要使用外键的思想来保证数据的一致性和完整性。

   数据库索引的位置

      数据库文件都有后缀,例如:    

   数据文件:        . myd
   索引文件:        . MYI
   表定义文件:      . frm

 

 

问题:

  1、mysql引擎,及对应文件。

  2、mysqldump使用范围,使用时限制条件。

 

posted @ 2019-10-22 09:25  gageshen  阅读(67)  评论(0)    收藏  举报