准备工具:
- mysql-utilities 下载地址
安装命令
wget https://downloads.mysql.com/archives/get/p/30/file/mysql-utilities-1.6.5.tar.gz
tar zxvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5
python ./setup.py build
python ./setup.py install
获取表结构
mysqlfrm --diagnostic xxxxx.frm
- docker
更新换源
yum -y update
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
查看可安装版本
yum list docker-ce --showduplicates | sort -r
安装需要的版本
yum -y install docker-ce-18.03.1.ce
运行docker
systemctl start docker
设置开机自启
systemctl enable docker
docker获取相应镜像
docker获取mysql镜像应尽量与需要恢复的版本一致,此处使用5.7.34 安装mysql镜像的命令为
docker pull mysql:5.7.34
运行后查看安装的镜像
配置容器并启动MySQL,以下命令为配置mysql:5.7.34容器并将其命名为mysql,映射端口为3306,密码为root,启动。
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.34
若需要将data文件或配置文件挂载则可使用-v参数,命令如下
冒号前为宿主机的路径。
docker run -p 3306:3306 --name sample-mysql -e MYSQL_ROOT_PASSWORD=root -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql -d mysql:5.7.34
使用docker ps查看容器是否顺利运行:
进入mysql容器并恢复相应数据库
- 进入MySQL容器
docker exec -it mysql /bin/bash
- 登陆mysql
mysql -u root -p
- 创建数据库和表,表名需与即将恢复的表名一致。
创建后使用语句alter table tablename discard tablespace;
删除相应的idb文件
查看mysql文件储存的目录
show global variables like "%datadir%";
关闭mysql容器docker stop mysql
- 将需要恢复的数据库的idb文件复制进容器中
docker cp '/home/centos7/Desktop/tablename .ibd' mysql:/var/lib/mysql/test
- 重启容器并授权文件
docker start mysql
为防止出现权限问题,可直接赋777权限
chown 777 tablename .ibd
- 进入MySQL,导入表结构
ALTER TABLE tablename IMPORT TABLESPACE;
- 导出.sql文件
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
通过本地navicat远程连接mysql容器
- 尝试授权
GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
若mysql版本较高或navicat版本较低需执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
更改加密规则。
随后更新密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
- 以上命令执行后更新权限
FLUSH PRIVILEGES;
完成两步后若连接失败,可尝试以下步骤:
- 查看user表中是否存在多个用户权限,删除多余用户,仅保留%一项
use mysql;select host from user where user='root';
delete from user where user = 'root' and host <>'%';
- 打开虚拟机相应端口权限并关闭防火墙
sudo firewall-cmd --add-port=3306/tcp sudo systemctl stop firewalld