docker下mysql8根据ibd恢复数据

1,320 阅读3分钟

前言

就在昨天我误删了docker映射出来的mysql中performance_schema,当我发觉不对劲时已为时已晚,好在ibd文件都在,这个时候就能拿来做文章了,下面就是具体步骤了:

一、mysql容器重新创建

  1. 如果docker中还存在mysql容器先清除
    docker rm mysql(或者容器id)
    
  2. 创建新的文件夹
    • 这里我是在根目录创建了data文件,在这里面存mysql配置和数据库等文件
      mkdir -p /data/mysql/{db,conf,log} 
      
  3. 初始化容器映射conf
    • 先初始化一个mysql容器,为了把配置文件映射出来,否则一气呵成的时候会报错
      docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
      
    • 映射conf文件
      docker cp  容器id:/etc/mysql(容器路径)  /data/mysql/conf(外部路径)
      
  4. 删除mysql容器并重新启动
    • 删除mysql容器
      docker stop mysql
      docker rm mysql
      
    • 启动mysql容器
      docker run -p 3306:3306 --name mysql -v /data/mysql/conf:/etc/mysql -v /data/mysql/log:/var/log/mysql -v /data/mysql/db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql()
      

二、mysql容器内操作

  1. 进入mysql容器中
    docker exec -it mysql /bin/bash
    
    # 进入后操作
    mysql -uroot -p
    # 输入密码
    123456
    
    输入密码操作若是不成功,总是显示密码错误时,退出进入/data/mysql/conf/中,打开my.cnf文件最后一行添加skip-grant-tables,暂时不使用密码登录
    vim /data/mysql/conf/my.cnf
    
  2. 再次登录后,修改root密码(root登录成功可跳过)
    • 把root用户密码修改为空(此行为不安全,但是为了可以登录后创建新的用户暂且这样设置)
      update user set authentication_string='' where user='root';
      flush privileges; (清除缓存)
      
    • 退出修改my.cnf文件,注释skip-grant-tables,重启mysql容器,进入容器中免密登录,就可以新建用户了
      # 重启mysql容器
      docker restart mysql
      # 进入容器
      docker exec -it mysql /bin/bash
      # 进入后直接回车进入sql
      mysql -uroot -p
      
  3. 新建用户并赋权限
    • 创建用户admin
      CREATE USER 'admin'@'%' IDENTIFIED BY '123456';
      
    • 赋所有权限
      grant all on*.* to 'admin';
      flush privileges;
      

三、进入navicat操作

  1. 进入界面点击 “连接” 数据库,输入ip、端口号、用户 admin、密码123456测试连接,完成后即可进入新建数据库
  2. 新建数据库名test,字符集选择 utf8,排序规则可不选
  3. 然后新建一张表,这里我是使用代码新建
    create table if not exists ctrl_record
        (
            id             varchar(36) not null
                primary key,
            ctrl_type      varchar(36) null,
            ctrl_time      datetime    null,
            point_group_id varchar(36) null
        );
    
    新建完成之后可以在服务器/data/mysql/db/test文件夹中看到该文件
    -rw-r----- 1 systemd-coredump input   114688 Mar  3 15:06 ctrl_record.ibd
    
    其中systemd-coredumpinput分别为用户和用户组
  4. 再执行删除ibd文件操作
    alter table ctrl_record discard tablespace;
    
  5. 将原来的对应表名称ibd文件移入/data/mysql/db/test,这个时候因为用户和用户组与我们之前新建的ibd不用,所有需要修改ibd所属用户和用户组
    chown -R systemd-coredump:input /data/mysql/db/test/*.ibd
    
  6. 再进入navicat执行导入
    alter table ctrl_record IMPORT TABLESPACE;
    
    显示ok则说明成功了