Mysql数据备份与恢复——Docker版

本文记录了一次使用Docker在CentOS8系统上进行MySQL8.0.26数据库的快速迁移过程,避免了通过JSON导出和导入的长时间操作。主要步骤包括备份data目录和conf文件,特别是对data目录中的关键文件进行处理,以及在新服务器上恢复数据的详细步骤,强调了在数据恢复过程中需注意的文件覆盖和容器重启策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mysql数据备份与恢复——Docker版

​ 工作上由于需要将旧服务器停用换用新服务器,而旧服务器上存放的mysql数据库,查看磁盘得知大概50G以上,如果采用工具将数据导出成json再到新服务上执行,其过程花费时间太长了,至少得半天…

所以想着能否直接将数据库上的data目录数据直接复制到新的服务器上,然后利用docker重新创建新的容器,这样时间肯定快,在此过程中,由于不了解其原理,踩了很多坑,查找很多博客,大多数都不够详细,或者不符合自己实际情况。特此记录一下!

说明:

  • mysql版本为8.0.26
  • 部署在centos8上,使用docker部署
  • 数据磁盘采用映射方式,映射位置为:/usr/local/mysql,内容:conf、data、mysql-files

一、数据备份

1、总览目录结构

mysql文件夹
|-- conf文件夹                                                                         
|   |-- conf.d文件夹                                                                    #停mysql迁移                      
|   |-- my.cnf                                                                         #停mysql迁移
|   `-- my.cnf.fallback                                                                #停mysql迁移
|-- data文件夹 
|   |-- #innodb_temp文件夹                                                              #
|   |-- mysql文件夹                                                                     #
|   |-- performance_schema文件夹                                                        #
|   |-- sys文件夹                                                                       #
|   |-- (其他文件夹,此处就是自己创的数据库,例如:feparks等等)                                #停mysql迁移
|   |-- #ib_16384_0.dblwr                                                              #                 
|   |-- #ib_16384_1.dblwr                                                              #
|   |-- auto.cnf                                                                       #停mysql覆盖
|   |-- ca-key.pem                                                                     #
|   |-- ca.pem                                                                         #
|   |-- client-cert.pem                                                                #
|   |-- client-key.pem                                                                 #          
|   |-- ecology                                                                        #
|   |-- ib_buffer_pool                                                                 #停msyql覆盖
|   |-- ibdata1                                                                        #
|   |-- ib_logfile0                                                                    #停msyql覆盖
|   |-- ib_logfile1                                                                    #停msyql覆盖
|   |-- ib_logfile2                                                                    #(看情况是否删除或覆盖)
|   |-- ib_logfile3                                                                    #
|   |-- ibdata1                                                                        #停msyql覆盖
|   |-- mysql.ibd                                                                      #停msyql覆盖
|   |-- mysql-bin.000001                                                               #
|   |-- mysql-bin.000002                                                               #
|   |-- mysql-bin.000003                                                               #
|   |-- mysql-bin.index                                                                #
|   |-- private_key.pem                                                                #
|   |-- public_key.pem                                                                 #
|   |-- server-cert.pem                                                                #
|   |-- server-key.pem                                                                 #
|   |-- undo_001                                                                       #
|   |-- undo_002                                                                       #
`-- mysql-files                                                                        #空文件夹即可

2、将data文件夹压缩或者直接导出到本地进行备份,位置:/user/local/mysql/data

image-20230202141537007

image-20230202141609806

image-20230202141642734

3、将conf文件夹压缩或者直接导出到本地进行备份,位置:/user/local/mysql/conf

image-20230202144059156

4、查看my.cnf文件,到时恢复时需要

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock 
datadir         = /var/lib/mysql                 #mysql容器里数据存储位置,这里最好不变
port = 3306
secure-file-priv= ''
default_authentication_plugin= mysql_native_password
character-set-server=utf8mb4

server-id = 1
expire_logs_days = 7
binlog_format=ROW

max_connections = 5000
max_connect_errors = 10
table_open_cache = 4096
event_scheduler = ON
skip-name-resolve
#lower_case_table_names = 1              #这里注释掉是因为启动时报错
group_concat_max_len = 102400

max_allowed_packet = 100M
binlog_cache_size = 32M
max_heap_table_size = 256M
read_rnd_buffer_size = 64M
sort_buffer_size = 256M
join_buffer_size = 512M
thread_cache_size = 300
log_bin_trust_function_creators=1
key_buffer_size = 256M
read_buffer_size = 32M
read_rnd_buffer_size = 128M
bulk_insert_buffer_size = 512M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

######READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = READ-COMMITTED
tmp_table_size = 512M
log-bin=mysql-bin
binlog_format=mixed
expire_logs_days = 15
long_query_time = 5

####### InnoDB
innodb_buffer_pool_size = 512M
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_log_file_size = 1024M
innodb_log_files_in_group = 4
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
#innodb_force_recovery=1

[mysqldump]
quick
max_allowed_packet = 102400M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer = 16M
sort_buffer_size = 16M
read_buffer = 8M
write_buffer = 8M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
open-files-limit = 65535
log-error=/var/log/mysql_error.log

# Custom config should go here
!includedir /etc/mysql/conf.d/

二、数据恢复

1、在新的服务器上利用docker方式按照mysql

  • 创建mysql映射目录,此处:/usr/local/mysql
mkdir /usr/local/mysql
  • 将前面备份的conf目录上传到/usr/local/mysql下
  • 在/usr/local/mysql下创建data目录和mysql-files目录
mkdir /usr/local/mysql/data
mkdir /usr/local/mysql/mysql-files
  • 执行安装mysql命令
docker run -di --name mysql --network=host -e MYSQL_ROOT_PASSWORD='^`(/Das@KK321(' -e TZ=Asia/Shanghai -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf:/etc/mysql -v /usr/local/mysql/mysql-files:/var/lib/mysql-files mysql:8.0.26
  • 查看启动状况,运行成功看到3306端口启动后,进行下一步
docker logs -f mysql

2、将mysql停服务,再操作数据拷贝

docker stop mysql

3、将备份到data数据上传到/usr/local/mysql/data下,⚠️注意:不是所有的文件进行覆盖拷贝的!!!!

覆盖文件如下(去参考前面写的总览目录结构):

  • ibdata1

  • ib_logfile0

  • ib_logfile1

  • ib_buffer_pool

  • auto.cnf

  • mysql.ibd

    注意:ib_logfile2和ib_logfile3文件根据实际情况来,如果旧服务器上的data中有此文件,就需要进行覆盖,否则就进行删除,不然会报错:ib_logfile2 is of diffrent size…

4、完成拷贝后,启动mysql容器

docker start mysql
### 如何使用XtraBackup备份Docker中运行的MySQL数据库 为了成功地利用Percona XtraBackup来备份位于Docker容器内的MySQL数据库,需遵循特定的方法以确保数据的一致性和完整性。考虑到`mysql`容器和`xtrabackup`容器部署于同一服务器之上[^1],这使得操作更为简便。 #### 准备工作 确认已安装适当本的Docker(20.10.6)以及docker-compose(1.28.5),这对于构建多服务应用至关重要[^2]。此外,在执行任何备份之前,请先停止正在运行的服务实例,并清理旧有的备份文件以防冲突发生: ```bash docker exec -it <container_name> bash /etc/init.d/mysql stop rm -rf /var/lib/mysql/* ``` #### 执行全量备份 通过命令行启动完全备份过程,指定目标路径保存副本资料: ```bash xtrabackup --backup --target-dir=/path/to/backup_dir/ ``` 此指令会创建一个新的备份集存放在给定位置。对于基于Docker环境的操作而言,建议将该目录映射至宿主机上的持久化存储空间内以便长期保留[^3]。 #### 实施增量备份 除了定期进行全面复制外,还可以设置定时任务来进行更频繁的小规模更新记录——即所谓的“增量备份”。这种方式能够有效减少资源消耗的同时保持最新的状态快照可用性。编辑crontab条目定义计划作业如下所示[^5]: ```bash echo '0 */2 * * 1,2,4,5,7 root /root/incrbak.sh >> /var/log/mysql_backup.log 2>&1' >> /etc/crontab ``` 上述脚本安排每两小时一次(周一、二、四、五、日)执行增量备份程序`incrbak.sh`并将输出重定向到日志文件中去。 #### 数据恢复流程 当需要从现有备份还原整个数据库系统时,则按照以下步骤操作: - 停止当前活动的服务进程; - 清除原有数据文件夹下的所有内容; - 应用先前制作好的完整或部分恢复点; - 更改权限使新加载的数据可被访问; - 启动MySQL服务完成迁移过程。 具体实施可以参照下面这段shell代码片段[^4]: ```bash # 进入对应容器内部终端 docker exec -it <container_name> bash # 关闭mysqld服务 /etc/init.d/mysql stop # 删除/var/lib/mysql下全部项目 rm -rf /var/lib/mysql/* # 将备份拷贝回原位 xtrabackup --copy-back --target-dir=/home/full # 修改属组属性为mysql用户拥有者身份 chown -R mysql:mysql /var/lib/mysql # 开启mysqld服务 /etc/init.d/mysql bootstrap-pxc ``` 以上就是关于如何运用XtraBackup工具针对Docker环境中托管着MySQL实例的情况下来达成高效可靠的备份策略介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半点灿烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值