mysql突然报错,说是user表损坏,容器一直启动不了,查了一些资料总结了一下两种方法可以做到数据恢复。
新启动一个MySQL容器,利用data文件恢复数据
- 新创建一个mysql
我用的是docker容器,可以使用dockerfile或者是命令行直接 docker pull mysql
Dockerfile如下
FROM mysql:5.7
MAINTAINER Mahmoud Zalt <yourname@zalt.me>
ADD startup /etc/mysql/startup
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE=homestead
ARG MYSQL_USER=homestead
ARG MYSQL_PASSWORD=secret
ARG MYSQL_ROOT_PASSWORD=root
ENV MYSQL_DATABASE=homestead
ENV MYSQL_USER=homestead
ENV MYSQL_PASSWORD=secret
ENV MYSQL_ROOT_PASSWORD=root
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/startup && \
sed -i 's/MYSQL_USER/'$MYSQL_USER'/g' /etc/mysql/startup && \
sed -i 's/MYSQL_PASSWORD/'$MYSQL_PASSWORD'/g' /etc/mysql/startup
ADD my.cnf /etc/mysql/conf.d/my.cnf
CMD ["mysqld", "--init-file=/etc/mysql/startup", "--sql-mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"]
EXPOSE 3306
docker up -d .
或者是放到yml文件加载
### MySQL Container #########################################
# mysql:
# build:
# context: ./mysql
# args:
# - MYSQL_DATABASE=homestead
# - MYSQL_USER=homestead
# - MYSQL_PASSWORD=secret
# - MYSQL_ROOT_PASSWORD=root
# volumes:
# - mysql:/var/lib/mysql
# ports:
# - "3306:3306"
volumes:
mysql:
driver: "local"
##注意这里要用local挂载本地文件
docker-compose up -d mysql
如果想看启动信息,例如错误什么的,去掉-d
- 复制原数据data文件到新mysql目录
以docker为例,文件内容是一样的,只是路径可能会不同
docker下的mysql文件一般在/var/lib/docker/volumes/这里是你的容器名称/_data/
##目录结构如下
apeerp ca-key.pem client-cert.pem hisiphp ib_buffer_pool ibdata1old ib_logfile1 nextcore private_key.pem server-cert.pem sys
auto.cnf ca.pem client-key.pem homestead ibdata1 ib_logfile0 mysql performance_schema public_key.pem server-key.pem thinkcmf5
[root@bogon _data]#
##复制原数据文件到这里
cp -r /var/lib/docker/volumes/oldmysql/_data/数据库名 .
这里说明一下,一般myisam文件的话直接复制过来就可以生效了,innodb文件需要连同ibdata1一同复制过来
- 权限修改
一般复制过来的文件如果执行不成功,可能是因为权限的问题,
ls -l #查看文件权限 如下
drwxr-x--- 2 systemd-bus-proxy input 8192 8月 9 09:32 apeerp
-rw-r----- 1 systemd-bus-proxy input 56 8月 8 17:43 auto.cnf
-rw------- 1 systemd-bus-proxy input 1675 8月 8 17:43 ca-key.pem
-rw-r--r-- 1 systemd-bus-proxy input 1074 8月 8 17:43 ca.pem
-rw-r--r-- 1 systemd-bus-proxy input 1078 8月 8 17:43 client-cert.pem
-rw------- 1 systemd-bus-proxy input 1679 8月 8 17:43 client-key.pem
drwxr-x--- 2 systemd-bus-proxy input 4096 8月 8 17:59 hisiphp
drwxr-x--- 2 systemd-bus-proxy input 20 8月 8 17:43 homestead
-rw-r----- 1 systemd-bus-proxy input 2054 8月 9 09:41 ib_buffer_pool
-rw-r----- 1 systemd-bus-proxy input 415236096 8月 9 09:41 ibdata1
-rw-r----- 1 systemd-bus-proxy input 50331648 8月 9 09:41 ib_logfile0
-rw-r----- 1 systemd-bus-proxy input 50331648 8月 8 17:43 ib_logfile1
drwxr-x--- 2 systemd-bus-proxy input 4096 8月 8 17:43 mysql
drwxr-x--- 2 systemd-bus-proxy input 20480 8月 9 09:25 nextcore
drwxr-x--- 2 systemd-bus-proxy input 8192 8月 8 17:43 performance_schema
-rw------- 1 systemd-bus-proxy input 1675 8月 8 17:43 private_key.pem
-rw-r--r-- 1 systemd-bus-proxy input 451 8月 8 17:43 public_key.pem
-rw-r--r-- 1 systemd-bus-proxy input 1078 8月 8 17:43 server-cert.pem
-rw------- 1 systemd-bus-proxy input 1679 8月 8 17:43 server-key.pem
drwxr-x--- 2 systemd-bus-proxy input 8192 8月 8 17:43 sys
drwxr-x--- 2 systemd-bus-proxy input 8192 8月 8 18:02 thinkcmf5
###修改权限分组
chown -R systemd-bus-proxy:input 数据库名
##这里举例说明,实际分组名称根据你文件显示为准
###修改不同文件权限
chmod -R 750 数据库名
##我的都是750,具体情况看文件显示
##一般三个一组 第一个代表是文件夹,r=4,w=2,x=1,随意组合
- 重启mysql
我用的navicat,直接打开,搞定
修复原数据损坏表恢复数据
我只损坏了mysql里面的user表,以此举例
- 新建mysql,或者是copy一下其他同事的密码明朗的mysql里面的data文件
我这里直接复制新建的mysql容器里面的表
cp -r /var/lib/docker/volumes/oldmysql/_data/mysql user.*
- 权限修改
和文件恢复一样,这里也会遇到权限问题,
ls -l ##查看权限
chown -R mysql:mysql user.* ##修改分组
chown -R 750 user.* ##修改权限
- 重启mysql,搞定
网友评论