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使用范围,使用时限制条件。
浙公网安备 33010602011771号