docker 不同容器xtrabackup完备mysql数据

转载: https://www.cnblogs.com/xiao987334176/p/13953912.html

一、概述

线上有一个mysql,是在docker里面运行的。

关于docker封装mysql镜像,请参考链接:https://www.cnblogs.com/xiao987334176/p/11984692.html

为了避免数据丢失,需要做数据备份,但是不能影响mysql运行。所以这里采用xtrabackup

xtrabackup介绍

对于MySQL数据库的热备,xtrabackup是除了MySQL enterprise backup之外的不二之选。该工具提供了基于innodb存储引擎的热备,支持全量,增量备份,部分备份,时点恢复以及使用xtrabackup备份来重做slave等。xtrabackup工具包包含一个innobackupex命令行工具,同时支持InnoDB引擎以及MyISAM引擎。本文主要描述的是trabackup的备份原理并给出了相关演示。

xtrabackup工作原理

InnoDB引擎很大程度上与Oracle类似,使用redo,undo机制,因此在热备期间需要考虑对于日志缓冲区在线事物日志及时写出到文件的问题。如果log buffer没有及时写出将被日志的循环写特性覆盖。xtrabackup在启动时会记住log sequence number(LSN),然后一页一页地复制InnoDB的数据。与此同时,监控log buffer中的日志情况,一旦log buffer发生变化,即数据发生了不一致,该过程会立即被捕获并把变化的页面复制到xtrabckup log,直到全部innoDB数据文件复制完成之后,停止监控log buffer及日志复制。
xtrabackup在恢复期间对提交的事务前滚,未提交或失败的事务进行回滚,从而保证数据的一致性。因此对于InnoDB表在备份期间不会锁表。由于XtraBackup其内置的InnoDB库打开文件的时候是rw的,所以运行XtraBackup的用户,必须对InnoDB的数据文件具有读写权限。

image

extrabackup的备份步骤

image

二、xtrabackup运行

环境说明

操作系统:centos 7.6

ip地址:192.168.31.250

mysql数据目录(宿主机):/data/mysql/data

mysql备份目录(宿主机):/home/backup

说明:mysql容器和xtrabackup容器运行在同一台服务器上,因为xtrabackup运行过程中,需要读取mysql数据目录。

mkdir -p /data/mysql/conf && mkdir -p /data/mysql/data && mkdir -p /data/mysql/log

在 /data/mysql/conf 创建 my.cnf

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
socket=/var/lib/mysql/mysql.sock
[client]
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock
[mysql]
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock

mysql 的创建命令

docker run --name mysql -p 3306:3306 -v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /data/mysql/data:/var/lib/mysql -v /data/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root --restart=always -d mysql:5.7

有3种方案安装xtrabackup,分别是:

编译安装
在线安装
docker封装

这里选择第3种方案,使用docker部署比较方案,方便迁移。

下载xtrabackup

下载地址:https://www.percona.com/downloads/

找到Percona XtraBackup

image

这里选择2.4版本,8.0版本太新了。

选择centos7,下载percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm

image

镜像封装

这里以centos:7.8.2003作为基础镜像。

新建目录

mkdir -p /opt/centos7.8_xtrabackup

最终目录结构如下:

./
├── dockerfile
└── percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm

dockerfile

FROM centos:7.8.2003 ADD percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm / 
RUN yum install -y /percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm && \ 
yum clean all && \ rm -rf /percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm

生成镜像

docker build -t centos7.8_xtrabackup:v1 .

运行镜像

docker run -it -d \
  --name xtrabackup \
  --network=container:mysql \
  --restart=always \
  -e TZ=Asia/Shanghai \
  -v /home/backup:/backup \
  -v /home/data:/data \
  -v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
  -v /data/mysql/data:/var/lib/mysql \
  -v /data/mysql/log:/var/log/mysql \
  centos7.8_xtrabackup:v1

--network 让xtrabackup 使用mysql的网络, 可以通过localhost直接访问myql
把mysql的配置文件及挂载目录同步到xtrabackup, 可以直接使用mysql的配置文件, 让xtrabackup能找到mysql.sock (这个docker第一次创建启动mysql时会没有这个文件, 重启mysql容器就又有了.)

完整备份

进入mysql , 创建备份的用户

docker exec -it mysql bash
mysql -uroot -proot
mysql> CREATE USER 'bkpuser'@'%' IDENTIFIED BY '123456';  #创建用户
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser';  #回收此用户所有权限
mysql> REVOKE GRANT RELOAD,LOCK TABLES,RELICATION CLIENT ON *.* TO 'bkpuser'@'%';  #授权刷新、锁定表、用户查看服务器状态
mysql> FLUSH PRIVILEGES;  #刷新授权表

进入docker

docker exec -it centos7.8_xtrabackup /bin/bash

执行以下命令

innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=sunmnet@123 --stream=tar /backup |gzip>/backup/mysql.tar.gz

输出:

210430 09:54:50 Executing UNLOCK TABLES
210430 09:54:50 All tables unlocked
210430 09:54:50 [00] Streaming ib_buffer_pool to <STDOUT>
210430 09:54:50 [00]        ...done
210430 09:54:50 Backup created in directory '/backup/'
210430 09:54:50 [00] Streaming <STDOUT>
210430 09:54:50 [00]        ...done
210430 09:54:50 [00] Streaming <STDOUT>
210430 09:54:50 [00]        ...done
xtrabackup: Transaction log of lsn (12670780) to (12670789) was copied.
210430 09:54:50 completed OK!
[root@9e6355b8d04f mysql]# cd /backup/
[root@9e6355b8d04f backup]# ls
mysql.tar.gz

有输出completed OK,表示备份成功。

参数说明:

--user     #指定数据库备份用户
–password  #指定数据库备份用户密码
–port      #指定数据库端口
–host      #指定备份主机
–socket    #指定socket文件路径 --datadir  #指定mysql datadir路径 --stream   #指定流的格式做备份,–stream=tar,将备份文件归档

查看备份文件

[root@9e6355b8d04f backup]# ll
total 3864
-rw-r--r--. 1 root root 3952848 Apr 30 09:54 mysql.tar.gz

会发现,多了一个mysql.tar.gz

数据还原

在新的机器上面安全一套mysql, 以及xtrabackup, 按上面的步骤再走一次.
把备份文件拷贝到新的机器上的/home/backup, 上面的命令是把这个挂载到xtrabackup容器里的, 我没改命令, 就直接放这里了

tar -izxvf mysql.tar.gz -C /home/backup/db/

先停止数据库, 还要把数据目录清空:

docker stop mysql

删除mysql的数据目录, 我的是 /data/mysql/data
进入xtrabackup容器,

innobackupex --defaults-file=/etc/my.cnf  --user=root --password=root  --apply-log /home/backup/db/
innobackupex --defaults-file=/etc/my.cnf  --user=root --password=root  --copy-back /home/backup/db/

看到这样的命令就是成功了

210430 10:50:59 [01]        ...done
210430 10:50:59 [01] Copying ./ib_buffer_pool to /var/lib/mysql/ib_buffer_pool
210430 10:50:59 [01]        ...done
210430 10:50:59 [01] Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
210430 10:50:59 [01]        ...done
210430 10:50:59 [01] Copying ./ibtmp1 to /var/lib/mysql/ibtmp1
210430 10:50:59 [01]        ...

本文参考链接:

https://blog.csdn.net/weixin_45345374/article/details/109069467
https://www.cnblogs.com/wjoyxt/p/4742754.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容