Mysql的backup备份

[复制链接]
发表于 2025-5-30 10:03:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
素材准备:

   CREATE TABLE `Student` (
  `Sno` int(10) NOT NULL COMMENT '学号',  `Sname` varchar(16) NOT NULL COMMENT '姓名',
  `Ssex` char(2) NOT NULL COMMENT '性别',  `Sage` tinyint(2) NOT NULL DEFAULT '0' COMMENT '学生年龄',
  `Sdept` varchar(16) DEFAULT 'NULL' COMMENT '学生所在系别',  PRIMARY KEY (`Sno`)
) ;

INSERT INTO `Student` VALUES (1, '陆亚', '男', 24, '盘算机网络'),(2, 'tom', '男', 26, '英语'),(3, '张阳', '男', 21, '物流管理'), (4, 'alex', '女', 22, '电子
商务');
  一:软件获取


二:安装(注意安装的MySQL版本和backup的版本是一制的)

   [root@openEuler-2 ~]# unzip V1040085-01.zip
[root@openEuler-2 ~]# dnf install mysql-commercial-backup-8.0.36-1.1.el8.x86_64.rpm
  三:备份管理员

   CREATE USER 'mysqlbackup'@'localhost' IDENTIFIED BY 'MySQL@123';
GRANT SELECT, BACKUP_ADMIN, RELOAD, PROCESS, SUPER, REPLICATION CLIENT ON *.* 
    TO `mysqlbackup`@`localhost`;
GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_progress TO 'mysqlbackup'@'localhost'; 
GRANT CREATE, INSERT, DROP, UPDATE, SELECT, ALTER ON mysql.backup_history 
    TO 'mysqlbackup'@'localhost';
GRANT LOCK TABLES, CREATE, DROP, FILE, INSERT, ALTER ON *.* TO 'mysqlbackup'@'localhost';
GRANT CREATE, DROP, UPDATE ON mysql.backup_sbt_history TO 'mysqlbackup'@'localhost';
GRANT ENCRYPTION_KEY_ADMIN ON *.* TO 'mysqlbackup'@'localhost';
GRANT INNODB_REDO_LOG_ARCHIVE ON *.* TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP ON mysql.backup_progress_old TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, ALTER ON mysql.backup_progress_new TO 'mysqlbackup'@'localhost';
  GRANT CREATE, INSERT, DROP ON mysql.backup_history_old TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, ALTER ON mysql.backup_history_new TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP ON mysql.backup_sbt_history_old TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, ALTER ON mysql.backup_sbt_history_new TO 'mysqlbackup'@'localhost';
  四:备份

①:backup-to-image方式的全量备份与还原

备份image

备份命令:
   mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--backup-image=my_full_bak.mbi  \
--backup-dir=/data/backup \
--show-progress \
--compress \
#        --with-timestamp \        
backup-to-image
  参数详解:
   

  • –backup-image:生成的备份image名称
  • –backup-dir:生成的备份image所在目录
  • –show-progress:表现备份进度[可选项]
  • –compress:对备份image举行压缩节流空间[可选项]
  • –with-timestamp:在backup-dir目录下生成’年-月-日-时-分-秒’的目录存储备份image以及别的相干文件
  • backup-to-image:声明这是备份为image的备份
  备份的目录结构:
   [root@openEuler-2 ~]# ll /data/backup/2025-04-19_13-47-29/
total 4264
-rw-r--r--. 1 root root     255 Apr 19 13:47 backup-my.cnf
drwxr-x---. 2 root root    4096 Apr 19 13:47 datadir
drwxr-x---. 2 root root    4096 Apr 19 13:47 meta
-rw-r-----. 1 root root 4329403 Apr 19 13:47 my_full_bak.mbi
-rw-r-----. 1 root root   19966 Apr 19 13:47 server-all.cnf
-rw-r-----. 1 root root     511 Apr 19 13:47 server-my.cnf
  查看和检验image:

list-image查看备份中image中的文件内容
   [root@openEuler-2 ~]# mysqlbackup --backup-image=/data/backup/2025-04-19_19-10-20/my_full_bak.mbi list-image
  validate验证image的有效性
   [root@openEuler-2 ~]#  mysqlbackup --backup-image=/data/backup/2025-04-19_19-10-20/my_full_bak.mbi validate
  还原image:

还原前需要做的使用:
   

  • 关闭数据库服务
    [root@openEuler-2 ~]# systemctl stop mysqld
     
  • 清空MySQL的datadir目录
    [root@openEuler-2 ~]# rm -rf /var/lib/mysql/*
  还原命令:
   [root@openEuler-2 ~]# 
  检查数据目录的权限;

修改权限:
   [root@openEuler-2 ~]# chown -R mysql.mysql /var/lib/mysql
  

查询数据:

②:backup-to-image方式的增量备份与还原

素材:
   insert into it.Student values(5,'李宁','男',23,'导弹专业');
  增量备份1:
   mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--compress \
--incremental \
--incremental-base=dir:/data/backup/2025-04-19_13-47-29 \
--backup-dir=/data/backup/incr1 \
--backup-image=my_inc1_bak.mbi \
backup-to-image
  

素材
   insert into school.Student values(6,'李刚','男',23,'导弹专业');
  增量备份2:
   mysqlbackup  --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--compress \
--incremental \
--incremental-base=history:last_backup \
--backup-dir=/data/backup/incr2 \
--backup-image=my_inc_bak.mbi \
backup-to-image
    增量备份1和增量备份2有什么区别呢?
  –incremental-base=dir:/data/backup/2025-04-19_13-47-29是前次全备或增备所在目录,那么这次增量备份就要基于这个目录中的备份为基准。 –incremental-base=history:last_backup是直接使用history:last_backup代替上一次的备份,省去人工探求目录的麻烦,MEB会自动到backup_history表中查找上一次备份的目录。 这是MEB为我们做的易用性改进。
  还原增量备份:

   

  • 关闭数据库服务
    [root@openEuler-2 ~]# systemctl stop mysqld
     
  • 清空MySQL的datadir目录
    [root@openEuler-2 ~]# rm -rf /var/lib/mysql/*
  还原第一次增量:
   mysqlbackup --backup-image=/data/backup/incr1/my_inc1_bak.mbi \
--backup-dir=/data/backup/incr1/tmp \
--datadir=/var/lib/mysql/ \
--incremental \
copy-back-and-apply-log
  还原第二次增量:
   mysqlbackup --backup-image=/data/backup/incr2/my_inc_bak.mbi \
--backup-dir=/data/backup/incr2/tmp \
--datadir=/var/lib/mysql/ \
--incremental \
copy-back-and-apply-log
  实验结果:

③:datafile方式的全量备份与还原

还原前需要的使用
   

  • 关闭数据库服务
    [root@openEuler-2 ~]# systemctl stop mysqld
     
  • 清空MySQL的datadir目录
    [root@openEuler-2 ~]# rm -rf /var/lib/mysql/*
  分步还原
第一步:apply-log 由于在备份期间数据库还在读写,把这期间产生的redolog贴回数据文件上,以到达数据一致性
   mysqlbackup --backup-dir=/data/backup/文件名 \
--uncompress \
apply-log 
  第二步:copy-back 把已经到达数据一致性的数据文件copy到mysql的datadir目录下,此时不能再用uncompress参数,因此apply-log时已经uncompress过了。
   mysqlbackup --datadir=/data/mysql/data --backup-dir=/data/backup/文件名 \
copy-back 
  合并还原 以上两步可以合为一步完成,即把apply-log与copy-back合并为copy-back-and-apply-log,它首先会把redolog贴回datafile并初始化新的redolog,然后把backupdir目录下的全部数据copy回mysql datadir
   mysqlbackup --datadir=/var/lib/mysql/ --backup-dir=/data/backup/文件名 \
--uncompress \
--show-progess \
copy-back-and-apply-log 
  参数表明:
   

  • –datadir: mysql server的datadir目录,就是要还原到这里
  • –backup-dir:生成的备份datafile所在目录
  • –show-progress:表现还原进度[可选项]
  • –uncompress[可选项]
  • –apply-log: 把备份期间的redo log贴回datafile
  • –copy-back:把datafile复制回datadir目录
  • –copy-back-and-apply-log:把备份期间的redo log贴回datafile再把datafile复制回datadir目录
  聪明的你一定发现了,在使用以上两种备份方式举行备份时都加了–compress参数,为什么还原的时间–uncompress参数却是可选项呢? 由于mysqlbackup 8.0.21版本开始可以辨认备份是否为compress,假如是,那么它在还原时会自动uncompress,不需要表现告诉它。 在mysqlbackup 4.X以及8.0.21之前版本是必须要表现指定uncompress的。
④:datafile方式的增量备份与还原

这里我为了图方便就和增量备份一起做。
素材:
   [root@openEuler-2 ~]# mysql -e "insert into school.Student values(7,'顾清寒','女',20,'长公主')"
  完全备份
   mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--backup-dir=/data/backup/full \
--show-progress \
--compress \
backup 
  第一次增量:
   mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--with-timestamp \
--compress \
--incremental \
--incremental-base=dir:/data/backup/full \
--incremental-backup-dir=/data/backup/incr3 \
backup
  素材:
   mysql -e "insert into it.Student values(8,'季莹莹','女',18,'无常司')"
  第二次增量:
   mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--with-timestamp \
--compress \
--incremental \
--incremental-base=history:last_backup \
--incremental-backup-dir=/data/backup/incr4 \
backup
  还原前需要的使用
   

  • 关闭数据库服务
    [root@openEuler-2 ~]# systemctl stop mysqld
     
  • 清空MySQL的datadir目录
    [root@openEuler-2 ~]# rm -rf /var/lib/mysql/*
  还原增量1:
   [root@openEuler-2 ~]# mysqlbackup --incremental-backup-dir=/data/backup/incr3/2025-04-19_20-04-51/  --backup-dir=/data/backup/full apply-incremental-backup
  还原增量2:
   [root@openEuler-2 ~]# mysqlbackup --incremental-backup-dir=/data/backup/incr4/2025-04-19_20-12-05/  --backup-dir=/data/backup/full apply-incremental-backup
  修改用户和所属组:
   chown mysql.mysql /var/lib/mysql/ -R
  ⑤:设置安全使用mysqlbackup

严谨的朋侪已经发现在以上命令中存在安全漏洞:用户名和密码是明文写在命令中的,且命令冗长,不易使用。 怎样设置能让mysqlbackup更安全呢? 将socket、user、password写到my.cnf中,mysqlbackup --defaults-file=/etc/my.cnf方式吗?掩耳盗铃罢了,由于在my.cnf中同样是明文的。 这里我们使用mysql_config_editor来处理处罚,既能隐藏密码,又能减少命令复杂度。 mysql_config_editor 是什么,读者可以自行查阅官方文档,下面直接上命令:
设置: 将mysqlbackup要使用的登录连接信息通过mysql_config_editor加密保存起来:
   mysql_config_editor set --login-path=backup --user=mysqlbackup  --password --socket=/var/lib/mysql/mysql.sock
Enter password:##此处输入password后回车
  查看: 看一看加密保存的信息:
   mysql_config_editor print --login-path backup
[backup]
user = "mysqlbackup"
password = *****
socket = "/var/lib/mysql/mysql.sock"
  可以看到,除了保存了user、socket外,还加密保存了密码。
改造: mysqlbackup命令就可以如下改造,直接调用此加密信息:
改造前:
   mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--backup-image=my_full_bak.mbi  \
--backup-dir=/data/backup \
--show-progress \
--compress \
--with-timestamp \
backup-to-image
  改造后:
   mysqlbackup --login-path=backup \
--backup-image=my_full_bak.mbi  \
--backup-dir=/data/backup \
--show-progress \
--compress \
--with-timestamp \
backup-to-image  
  通过改造前后对比,安全性与易用性都得到增强。
⑦:进阶

上面解说了mysqlbackup的通例用法,其实它另有许多高级功能,好比:


  • 备份加密
  • 磁带备份
  • 创建主从复制
  • 创建组复制
  • 指定备份对象
  • 指定还原对象 有兴趣的朋侪可以继承深入研究,官方文档在此。







回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表