背景:
昨天关机前还在使用mysql,一切正常,但今天打开电脑,发现mysql启动不起来了,老是提示端口占用,但是系统也没有新安装什么软件,而且通过查询nat命令也没发现3306端口占用。而且修改成3307等其它端口也都一直提示错误,如下:
2024-03-08T02:57:46.934875Z 0 [Warning] [MY-010915] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2024-03-08T02:57:46.936846Z 0 [System] [MY-010116] [Server] D:\software\mydevutils\MySQLServer8\bin\mysqld.exe (mysqld 8.0.30) starting as process 4036
2024-03-08T02:57:46.948027Z 0 [Warning] [MY-013907] [InnoDB] Deprecated configuration parameters innodb_log_file_size and/or innodb_log_files_in_group have been used to compute innodb_redo_log_capacity=100663296. Please use innodb_redo_log_capacity instead.
2024-03-08T02:57:46.950713Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-03-08T02:57:47.789982Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-03-08T02:57:48.201977Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-03-08T02:57:48.202579Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-03-08T02:57:48.204860Z 0 [ERROR] [MY-010262] [Server] Can't start server: Bind on TCP/IP port: 以一种访问权限不允许的方式做了一个访问套接字的尝试。
2024-03-08T02:57:48.205403Z 0 [ERROR] [MY-010257] [Server] Do you already have another mysqld server running on port: 3307 ?
2024-03-08T02:57:48.205806Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-03-08T02:57:49.468506Z 0 [System] [MY-010910] [Server] D:\software\mydevutils\MySQLServer8\bin\mysqld.exe: Shutdown complete (mysqld 8.0.30) MySQL Community Server - GPL.
我再尝试重装这个mysql8.0.30,重装后发现,它官方的这个msi镜像装了之后等半天也没法启动mysql80服务,跟我手动启动情况一致。
感觉系统有点问题,但毕竟是工作电脑不好随便重装。幸好我重装的时候有备份mysql8下的data文件夹,电脑也还有安装docker,这时我想到数据库能否恢复到docker中的mysql中,说干就干。
一、拉取镜像
docker pull mysql:8.0.30
二、创建挂载路径
mkdir -p /usr/local/software/mysql/3312/data
mkdir -p /usr/local/software/mysql/3312/logs
mkdir -p /usr/local/software/mysql/3312/conf
三、创建配置文件my.cnf
//根目录选择自身实际最大磁盘路径 一般为/home 或者定义/data 或自定义路径
vi /usr/local/software/mysql/3312/conf/my.cnf
//insert 插入以下内容
[mysqld]
#服务端口号 默认3306
port=3306
user=mysql
#mysql数据文件所在位置
datadir=/var/lib/mysql
#pid
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
default-time-zone = '+8:00'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# 允许访问的IP网段
bind-address=0.0.0.0
#只能用IP地址检查客户端的登录,不用主机名
skip_name_resolve=1
#事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
transaction_isolation=READ-COMMITTED
#最大连接数
max_connections=400
#最大错误连接数
max_connect_errors=1000
#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp=true
#SQL数据包发送的大小,如果有BLOB对象建议修改成1G
max_allowed_packet=1G
四、通过data文件恢复data里的数据库
Mysql里的数据一般会自动保存到D:\MySQL Server 8.0\Data目录下,卸载前要将其备份。
目前进测试了同版本的Mysql8.0.30,其它的版本目前没有测试成功,有成功或者方法的麻烦分享一下,谢谢。
个人发现我这个版本data下面才有#ib_16384_0.dblwr,#ib_16384_1.dblwr这两个文件。
五、启动docker 容器
# -p 端口映射 3312:3306 指外部访问端口改成33060规避一些默认端口被禁情况
docker run --privileged=true -p 3312:3306 -m 1g --name mysql3312 \
-v /usr/local/software/mysql/3312/conf:/etc/mysql/conf.d \
-v /usr/local/software/mysql/3312/logs:/var/log/mysql \
-v /usr/local/software/mysql/3312/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.30 --lower_case_table_names=1
六、检查容器是否正常运行
#检查镜像是否正常运行
docker ps
#启动后,查看日志,没出现error才能正常启动
docker logs mysql3312
#期间,我遇到两个错误,一个是lower_case_table_names有误,所以启动的时候加上
--lower_case_table_names=1
#另一个错误,提示#innodb_redo有误,所以猜测是里面的文件跟新mysql匹配不上,清空再次运行即刻
docker start mysql3312
#进入容器
docker exec -it mysql bash
#用默认密码登陆账号
#我发现有趣的是,第一次运行容器,都要stop重新start容器才能里面才能执行成功这个命令
mysql -uroot -p
七、创建对应数据库及账号密码
#创建账号并授权
CREATE USER 'hans'@'%' IDENTIFIED BY 'hans';
CREATE DATABASE test_database CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
GRANT ALL PRIVILEGES ON test_database .* TO 'hans'@'%';
FLUSH PRIVILEGES;
相信大家有看到为啥docker运行路径感觉是Linux下面。确实是的,这是因为我电脑同时装了Linux8虚拟机。
提醒一下,由于覆盖了旧系统的data文件,密码也是旧系统的密码。
好了,分享到此结束,欢迎提出指正。