admin 管理员组

文章数量: 1184232

接博客上文

http://t.csdnimg/ZEz7M,通过修改本地挂载的myf文件后远程成功连接上了docker部署mysql,但是数据库无法进行修改、删除等操作,这是由于刚刚修该的配置文件造成的

只有在紧急情况下才能设置
innodb_force_recovery大于0,默认值是0,不进行强制恢复的正常启动。innodb_force_recovery一共有6个级别,举例说明:值为3时包括了1和2的功能,值越小越安全;

关于innodb_force_recovery的值
1 (SRV_FORCE_IGNORE_CORRUPT):即使服务器检测到损坏的页仍让它运行。试图使SELECT* FROM tbl_name跳过损坏的索引记录和页,这样有助于转储表。
2 (SRV_FORCE_NO_BACKGROUND):阻止主线程和任何清除线程的运行。如果崩溃会在清除操作中发生,该恢复值会阻止它。
3 (SRV_FORCE_NO_TRX_UNDO):不要在崩溃恢复后运行事务回滚。
4 (SRV_FORCE_NO_IBUF_MERGE):阻止插入缓冲合并操作。如果它们会导致崩溃,不要做这些。不计算表统计。这个值可以永久损坏数据文件。使用这个值后,准备号删除并重建所有辅助索引。在MySQL5.6.15中,设置InnoDB为只读。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN):在启动数据库时不查看撤消日志:InnoDB将即使未完成的事务也作为已提交。这个值可以永久损坏数据文件。在MySQL5.6.15中,设置InnoDB为只读。
6 (SRV_FORCE_NO_LOG_REDO):不要通过恢复对重做日志进行前滚。这个值可能永久损坏数据文件。数据库页被留在一个陈旧的状态,这反过来又可能带给B-trees和其它数据库结构更多的损坏。

这时就需要重建恢复数据库了

1.备份数据

1.通过docker exec -it mysql容器名 bash 命令进入容器内部

docker exec -it mysql容器名 bash

2.测试数据库是否可以连通:mysql -uroot -p密码
如果可以正常连通则退出可以备份数据:

mysqldump -uroot -p密码 --all-databases  > /tmp/all_mysql_bak.sql 

(/tmp可以是其他目录, all_mysql_bak.sql文件就是所有的库数据和表数据,到时候回重新导入数据库中;)

3.通过下面命令将刚刚备份好的数据拷贝到容器外

docker cp  mysql:/tmp/all_mysql_bak.sql /root 

4.停止当前mysql 容器 ,然后将容器删除,如果本地挂载了数据卷,同时需要把数据卷删除(myf可以不删但需要把前面断电添加的配置注释或者删除),再新建

docker stop mysql容器名
docker rm  mysql容器名

5.重新部署mysql容器

# 创建并运行新mysql容器,挂载本地目录
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  --restart=always
  mysql

通过docker ps -a 命令查看发现已经部署成功。

6.将拷贝到容器外的备份数据在拷贝回容器内部,重新进入mysql容器

[root@master]docker cp  /root/all_mysql_bak.sql  mysql:/tmp/all_mysql_bak.sql (再拷贝到容器里面)
#进入容器内部
[root@master]docker exec -it mysql容器名 bash
2.数据恢复
恢复数据:
mysql -uroot -p密码 -e "source \tmp\all_mysql_bak.sql"


查看数据库数据已经恢复。

以上是我解决docker部署mysql数据重建恢复的一种方式,欢迎积极讨论。

本文标签: 数据恢复 数据库 docker MySQL