升级MySQL8,各种问题及最终解决办法

问题:

我使用的是最不常用的源码编译安装,至于它的好处我就不在这里赘述了,我在执行make的时候,出现下面的错误提示

上网查了一下,说是内存被消耗完了,我的配置是2G的内存,按照网友的说法,编译安装mysql8至少要6G的内存,硬盘要13G,安装的时间至少要2个小时以上,我吓了一跳,如果内存不够,可以用swap来弥补。我最后放弃了编译安装的方式,准备使用docker。

下载好官方的MySQL8的最新镜像之后,开始了下面的操作:

1.运行容器

docker run \
--restart=always \
-v /etc/localtime:/etc/localtime:ro \
--name mysql8 \
-v /application/mysql8/data:/var/lib/mysql \
-v /application/mysql8/conf:/etc/mysql \
-v /application/mysql8/mysql-files:/var/lib/mysql-files \
-v /application/mysql8/log:/log \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:latest

 

2.数据库配置

#将宿主机的数据库文件拷贝到容器中
docker cp teddylu_2021-03-14.sql mysql8:teddylu_2021-03-14.sql

#进入容器,还原数据库
root@01cfe0de859f:/# mysql -u root -p < teddylu_2021-03-14.sql
Enter password:

#创建用户,授权,并更改其密码模式

mysql> create user 'teddylu'@'127.0.0.1' identified by '654321';
Query OK, 0 rows affected (0.02 sec)

mysql> alter user 'teddylu'@'127.0.0.1' identified with mysql_native_password by '654321';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on teddylu.* to 'teddylu'@'127.0.0.1';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select User,Host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| User | Host | plugin |
+------------------+-----------+-----------------------+
| root | % | caching_sha2_password |
| teddylu | 127.0.0.1 | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

#我之前数据库的信息
Extension mysqli
Server version 5.5.53
Client version mysqlnd 7.4.11
Database username teddylu
Database host 127.0.0.1:3306
Database name teddylu
Table prefix wp_
Database charset utf8mb4
Database collation utf8mb4_unicode_ci

#我现在数据库的信息
mysql> show create database teddylu;
+----------+----------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------------------------------------------+
| teddylu | CREATE DATABASE `teddylu` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+----------------------------------------------------------------------------------------------------+

mysql> alter database teddylu charset=utf8mb4 collate=utf8mb4_unicode_ci;
Query OK, 1 row affected (0.01 sec)

mysql> show create database teddylu;
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
| teddylu | CREATE DATABASE `teddylu` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

即使完成了上面的操作还是出现错误,最后只能用大招,开启debug模式,在wp-config.php文件中修改这一行,将false 改为true :define(’WP_DEBUG’,true);

 

Warning: mysqli_real_connect(): (HY000/1045): Access denied for user ‘teddylu’@’172.17.0.1’ (using password: YES) in /home/teddylu/wp-includes/wp-db.php on line 1653
Access denied for user ‘teddylu’@’172.17.0.1’ (using password: YES)

建立数据库连接时出错

[root@li1548-187 mysql]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:7bff:fe13:58cb prefixlen 64 scopeid 0x20<link>
ether 02:42:7b:13:58:cb txqueuelen 0 (Ethernet)
RX packets 266275 bytes 232355590 (221.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 272666 bytes 282644102 (269.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

这样看的话,就是说wp用的是docker的ip172.17.0.1在连接数据库,而不是宿主机的ip127.0.0.1

我们可以看到这个容器的网络类型是bridge
docker container inspect mysql8

“NetworkSettings”: {
“Bridge”:

 

改变容器的网络类型,解决办法:

docker run \
-v /etc/localtime:/etc/localtime:ro \
--name mysql8 \
--net=host \
-v /wordpress/mysql8/data:/var/lib/mysql \
-v /wordpress/mysql8/conf:/etc/mysql/conf.d \
-v /wordpress/mysql8/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.27

ps:记得一定要先在conf下准备好配置文件

这里随便提一下,docker容器的四种网络类型:

1.None:不为容器配置任何网络功能 --net=none

2.container:与另一个运行中的容器共享Network Namespace ,–net=container:caontainerID(k8s)

3.bridge:docker设计的NAT网络模型

4.host:与宿主机共享network namespace,–net=host,性能最高

 

然后,经过一系列与上面一样的操作之后,成功了!!!

总结:虽然用了很久的docker 容器,但是对他的网络类型的还理解的不是很深刻,这个问题足足折腾了我一整天,不过收获很大,非常的值得!!!

升级MySQL8,各种问题及最终解决办法
5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
Scroll to top
0
Would love your thoughts, please comment.x
()
x