Mysql利用data文件恢复以及主数据mysql表损坏修复总结

mysql突然报错,说是user表损坏,容器一直启动不了,查了一些资料总结了一下两种方法可以做到数据恢复。

新启动一个MySQL容器,利用data文件恢复数据

  1. 新创建一个mysql
    我用的是docker容器,可以使用dockerfile或者是命令行直接 docker pull mysql
    Dockerfile如下
FROM mysql:5.7

MAINTAINER Mahmoud Zalt 

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

  1. 复制原数据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一同复制过来

  1. 权限修改
    一般复制过来的文件如果执行不成功,可能是因为权限的问题,
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,随意组合
  1. 重启mysql
    我用的navicat,直接打开,搞定

修复原数据损坏表恢复数据

我只损坏了mysql里面的user表,以此举例

  1. 新建mysql,或者是copy一下其他同事的密码明朗的mysql里面的data文件
    我这里直接复制新建的mysql容器里面的表
cp -r /var/lib/docker/volumes/oldmysql/_data/mysql user.*  
  1. 权限修改
    和文件恢复一样,这里也会遇到权限问题,
ls -l ##查看权限
chown -R mysql:mysql user.* ##修改分组
chown -R 750 user.* ##修改权限
  1. 重启mysql,搞定

你可能感兴趣的:(Mysql利用data文件恢复以及主数据mysql表损坏修复总结)