暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Mysql 学习过程分享,5.6升级5.7

839

升级过程参考mysql官方文档,本次采用In-Place Upgrade

MySQL :: MySQL 5.7 Reference Manual :: 2.11.2 Upgrade Paths https://dev.mysql.com/doc/refman/5.7/en/upgrade-paths.html

mysql支持从5.6升级到5.7,但是建议先升到5.6的最后一个版本,再升到5.7

Upgrade from MySQL 5.6 to 5.7 is supported. Upgrading to the latest release is recommended before upgrading to the next version. For example, upgrade to the latest MySQL 5.6 release before upgrading to MySQL 5.7.

升级过程:

1 .关闭数据库,备份

在关闭数据库前,设置innodb_fast_shutdown=0 ,这样会清除所有 undo log 记录(XA PREPARE 事务除外)并完成整个 change buffer 的合并,然后关闭 redo log。

root@db 08:02: [(none)]> SET GLOBAL innodb_fast_shutdown=0;
Query OK, 0 rows affected (0.00 sec)

关闭数据库

[root@mysql1 mysql.bak]# mysqladmin -u root -p shutdown
Enter password:
220611 08:09:47 mysqld_safe mysqld from pid file /data/mysql/db.pid ended
[1]+ Done mysqld_safe --defaults-file=/etc/my.cnf
复制


备份

[root@mysql1 data]# cp -r mysql/ mysql.bak
复制



2.下载并解压5.7版本软件

[root@mysql1 soft]# tar -zvxf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz

。。。。。。。。。
[root@mysql1 soft]# ls

[root@mysql1 mysql]# ls
auto.cnf ibdata1 ib_logfile1 mybinlog.000002 mybinlog.000004 mybinlog.index mysql-5.7.36-linux-glibc2.12-x86_64 slow.log testdb
error.log ib_logfile0 mybinlog.000001 mybinlog.000003 mybinlog.000005 mysql performance_schema test

[root@mysql1 soft]#
复制



3.取消5.6的软连接,连接到5.7目录

[root@mysql1 local]# ll
lrwxrwxrwx. 1 root root 46 Jun 10 22:07 mysql -> /data/soft/mysql-5.6.49-linux-glibc2.12-x86_64
drwxr-xr-x. 2 root root 4096 Jun 28 2011 sbin

[root@mysql1 local]# unlink mysql

[root@mysql1 mysql]#ln -s /data/mysql/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql

[root@mysql1 local]# mysql --version
mysql Ver 14.14 Distrib 5.7.36, for linux-glibc2.12 (x86_64) using EditLine wrapper
复制


4.启动数据库

mysqld_safe --defaults-file=/etc/my.cnf &
复制



5.执行mysql_upgrade脚本

[root@mysql1 ~]# mysql_upgrade -u root -p
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv OK
。。。。。。
mysql.user OK
Upgrading the sys schema.
Checking databases.
Failed to run query "ALTER DATABASE `#mysql50#mysql-5.7.36-linux-glibc2.12-x86_64` UPGRADE DATA DIRECTORY NAME"
Error: Incorrect database name '#mysql50#mysql-5.7.36-linux-glibc2.12-x86_64'
#mysql50#mysql-5.7.36-linux-glibc2.12-x86_64 FAILED
sys.sys_config OK
testdb.test OK
Error occurred: Error during call to mysql_check.
复制


这里报了一个错误, '#mysql50#mysql-5.7.36-linux-glibc2.12-x86_64'名字不正确,进到mysql库里查看确实有这个库

root@db 08:20: [(none)]> show databases;
+----------------------------------------------+
| Database |
+----------------------------------------------+
| information_schema |
| mysql |
| #mysql50#mysql-5.7.36-linux-glibc2.12-x86_64 |
| performance_schema |
| test |
| testdb |
+----------------------------------------------+
6 rows in set (0.00 sec)
复制


本来还想着怎么会有人起这么奇怪的库名,但是再一看这个名字很熟悉,就是第2步中解压的5.7目录,是解压时候放到data目录里了,所以把这个文件拿出来就可以了。

重新执行mysql_upgrade

[root@mysql1 mysql]# mysql_upgrade -u root -p
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv OK
mysql.db OK
。。。。。。。
testdb.test OK
Upgrade process completed successfully.
Checking if update is needed.
复制


6.重启数据库


升级过程并不复杂,这里步骤5里因为失误导致的一个故障可以继续研究一下。

在刚接触mysql时就在想mysql的my.cnf好像即是参数文件又是控制文件,但是他只记录了data,log的路径,没有再详细的database目录,datafile的路径,那mysql怎么知道他自己有哪些数据库呢?

information_schema的SCHEMATA表里会记录schema的信息,但是在启动时也并没有哪个文件指定了information_schema的路径,像oracle那样参数文件指定控制文件,控制文件再记录datafile,redo等等。

由升级中出现的故障猜测,mysql启动时会把data下的目录都当做schema数据库。

动手测试一下。

在mysql的data目录建一个testdb1目录和一个test1文件

[root@mysql1 mysql]# mkdir testdb1

[root@mysql1 mysql]# vi test1

[root@mysql1 mysql]# ls
auto.cnf client-cert.pem error.log ib_logfile0 mybinlog.000001 mybinlog.000004 mybinlog.000007 mysql.sock performance_schema server-cert.pem sys testdb
ca-key.pem client-key.pem ib_buffer_pool ib_logfile1 mybinlog.000002 mybinlog.000005 mybinlog.index mysql.sock.lock private_key.pem server-key.pem test testdb1
ca.pem db.pid ibdata1 ibtmp1 mybinlog.000003 mybinlog.000006 mysql mysql_upgrade_info public_key.pem slow.log test1
复制


可以看到,只有testdb1被当做schema显示了出来。


刚才说过information_schema.SCHEMATA里会记录schema的信息,show tables里显示的schema也是schemata表里查的


在操作系统建好目录后,SCHEMATA就更新出来了


并且这个库是可用的,可以建表。

继续思考下去,如果在testdb1下复制一个别的schema下的表,是否也能显示出来呢?

直接复制test1表,改名为test2



复制的表可以看到,但是不能查询,这个就触及到知识盲区了,需要再学习一下基础知识。。。

因为也是初学,这里主要是和大家分享一下学习的过程,学习过程中可能有很多困惑一时解决不了,或许在某一次的故障中就解答了。

测试的过程并没有下结论,都是进行合理的猜测,需要再结合官方文档理解。有错误的地方希望大家指正。

最后修改时间:2022-06-14 08:48:25
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论