mysql备份还原

时间:2023-03-18
本文章向大家介绍mysql备份还原,主要内容包括一、mysqldump、1.1 命令说明、1.2 InnoDB备份策略、1.3 备份指定数据库、1.4 分库备份并压缩、1.5 完全备份和还原、1.6 二进制日志,还原数据库、1.7 mysqldump和二进制日志结合实现差异(增量)备份、1.8 示例:恢复误删除的表、使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

mysql备份工具主要有mysqldump和xtrabackup

一、mysqldump

1.1 命令说明

  1. 备份命令

格式:mysqldump -h主机IP -P端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql

本地备份可以不添加端口和主机IP,username、passward是数据库用户名和密码

mysqldump -h *.*.*.* -P 3306 -u username -p password --database mysql > /data/backup/mysql.sql

  1. 备份压缩

格式:mysqldump -h主机IP -P端口 -u用户名 -p密码 --database 数据库名 | gzip > 文件名.sql.gz

导出的数据有可能比较大,不好备份到远程,这时候就需要进行压缩

mysqldump -h *.*.*.* -P 3306 -u username -p password --database mysql | gzip > /data/backup/mysql.sql.gz

  1. 备份同个库多个表

格式:mysqldump -h主机IP -P端口 -u用户名 -p密码 --database 数据库名 表1 表2 .... > 文件名.sql

mysqldump -h *.*.*.* -P 3306 -u username -p password mysql1 mysql2 mysql3> /data/backup/mysql_db.sql

  1. 同时备份多个库

格式:mysqldump -h主机IP -P端口 -u用户名 -p密码 --databases 数据库名1 数据库名2 数据库名3 > 文件名.sql

mysqldump -h *.*.*.* -P 3306 -u username -p password --databases mysql1 mysql2 mysql3 > /data/backup/mysql_db.sql

  1. 备份实例上所有的数据库

格式:mysqldump -h主机IP -P端口 -u用户名 -p密码 --all-databases > 文件名.sql

mysqldump -h *.*.*.* -P 3306 -u username -p password --all-databases > /data/backup/mysql_db.sql

  1. 备份数据出带删除数据库或者表的sql备份

格式:mysqldump -h主机IP -P端口 -u用户名 -p密码 --add-drop-table --add-drop-database 数据库名 > 文件名.sql

mysqldump -h *.*.*.* -P 3306 -u username -p password --add-drop-table --add-drop-database mysql > /data/backup/mysql_db.sql

  1. 备份数据库结构,不备份数据

格式:mysqldump -h主机IP -P端口 -u用户名 -p密码 --no-data 数据库名1 数据库名2 数据库名3 > 文件名.sql

mysqldump -h *.*.*.* -P 3306 -u username -p password --no-data –databases mysql1 mysql2 mysql3 > /data/backup/structure_db.sql

  1. 还原MySQL数据库的命令

database为数据库名mysql -h *.*.*.* -u username -p password database < backupfile.sql

  1. 还原压缩的MySQL数据库

database为数据库名gunzip < backupfile.sql.gz | mysql -u username -p password database

  1. 将数据库转移到新服务器

database为数据库名mysqldump -u username -p password database | mysql –host=*.*.*.* -C database

  1. --master-data​ 和--single-transaction

在mysqldump中使用--master-data=2​,会记录binlog文件和position的信息 。

--single-transaction​会将隔离级别设置成repeatable-commited​。

  1. 导入数据库

常用source命令,用use进入到某个数据库,mysql>source /opt/test.sql​,后面的参数为脚本文件。

  1. 查看binlog日志

查看binlog日志可用命令 mysqlbinlog binlog日志名称|more

  1. general_log

General_log记录数据库的任何操作,查看general_log 的状态和位置可以用命令show variables like "general_log%"​ ,开启general_log可以用命令set global general_log=on

  1. 查看所有数据库

mysql -e 'show databases;'|grep -Ev 'Database|information_schema|performance_schema'

1.2 InnoDB备份策略

mysqldump -uroot -p -A -F -E -R --triggers --single-transaction --master-data=1 \
--flush-privileges --default-character-set=utf8 --hex-blob \
>${BACKUP}/fullbak_${BACKUP_TIME}.sql

1.3 备份指定数据库

#!/bin/bash
TIME=`date +%F_%H-%M-%S`
DIR=/backup		# 备份目录
DB=hellodb		# 指定数据库
PASS=123456		# 数据库密码
[ -d $DIR ] || mkdir $DIR
mysqldump -uroot -p "$PASS" -F -E -R --triggers  --single-transaction --master-data=2 \
--default-character-set=utf8 -q  -B $DB | gzip > ${DIR}/${DB}_${TIME}.sql.gz

1.4 分库备份并压缩

#!/bin/bash
TIME=`date +%F_%H-%M-%S`
DIR=/backup
PASS=123456
[ -d "$DIR" ] || mkdir $DIR
for DB in `mysql -uroot -p "$PASS" -e 'show databases' | grep -Ev "^Database|.*schema$"`;do
	mysqldump -F --single-transaction --master-data=2 --default-character-set=utf8 -q -B $DB | gzip >  ${DIR}/${DB}_${TIME}.sql.gz
done

1.5 完全备份和还原

# 开启二进制日志
# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
log-bin

# 备份
mysqldump -uroot -p123456 -A -F --single-transaction --master-data=2 |gzip > /backup/all-`date +%F`.sql.gz


# 还原
## 解压备份文件
[root~ backup]# gzip -d all-2000-01-01.sql.gz
## 登录数据库还原
# mysql
MariaDB [(none)]> set sql_log_bin=off;			# binlog日志功能关闭
MariaDB [(none)]> source /backup/all-2000-01-01.sql	# 还原
MariaDB [(none)]> set sql_log_bin=on;			# binlog日志功能打开

1.6 二进制日志,还原数据库

# 二进制日志独立存放
[mysqld]
log-bin=/data/mysql/mysql-bin

# 完全备份,并记录备份的二进制位置
mysqldump  -uroot -p123456 -A -F --default-character-set=utf8  --single-transaction --master-data=2 | gzip > /backup/all_`date +%F`.sql.gz

# 修改数据库
insert students (name,age,gender)value('mage',20,'M');
insert students (name,age,gender)value('wang',22,'M');

# 损坏数据库
rm -rf /var/lib/mysql/*
# 还原
cd /backup
gzip -d all-2000-01-02.sql.gz

# CentOS 8 需要事先生成数据库相关文件,CentOS7 不需要执行此步
mysql_install_db  --user=mysql
systemctl restart mariadb

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       998 |
| mysql-bin.000002 |     28090 |
| mysql-bin.000003 |       342 |
+------------------+-----------+
3 rows in set (0.000 sec)
MariaDB [(none)]>set sql_log_bin=0;
MariaDB [(none)]>source /data/all_2000-01-02.sql

[root@centos8 ~]#grep '^-- CHANGE MASTER TO' /data/all_2000-01-02.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=328;

# 二进制日志的备份
[root@centos8 mysql]#mysqlbinlog mysql-bin.000001 --start-position=328 > /backup/inc.sql

[root@centos8 mysql]#mysqlbinlog mysql-bin.000002 >> /backup/inc.sql
MariaDB [(none)]>set sql_log_bin=0;
MariaDB [(none)]>source /backup/inc.sql
MariaDB [(none)]>set sql_log_bin=1;

1.7 mysqldump和二进制日志结合实现差异(增量)备份

[root@centos8 ~]#mysqldump -uroot -p -A -F --single-transaction --master-data=2 |gzip > /backup/all-`date +%F`.sql.gz

#观察上面备份文件中记录的二进制文件和位置,定期将其之后生成的所有二进制日志进行复制备份
[root@centos8 ~]#cp /var/lib/mysql/mariadb-bin.000003 /backup 	#假设mariadb-bin.000003是后续生成的二进制日志
[root@centos8 ~]#mysqlbinlog backup/mariadb-bin.000003 > /backup/inc.sql

1.8 示例:恢复误删除的表

说明:每天2:30做完全备份,早上10:00误删除了表students,10:10才发现故障,现需要将数据库还原到10:10的状态,且恢复被删除的students表

# 完全备份
[root@centos8 ~]#mysqldump -uroot -p -A -F --single-transaction --master-data=2 > /backup/allbackup_`date +%F_%T`.sql
[root@centos8 ~]#ll /backup/
total 2992
-rw-r--r-- 1 root root 3060921 Nov 27 10:20 allbackup_2019-11-27_10:20:08.sql

# 完全备份后数据更新
MariaDB [testdb]> insert students (name,age,gender) values('rose',20,'f');
Query OK, 1 row affected (0.001 sec)

MariaDB [testdb]> insert students (name,age,gender) values('jack',22,'M');
Query OK, 1 row affected (0.001 sec)

# 10:00误删除了一个重要的表
MariaDB [testdb]> drop table students;
Query OK, 0 rows affected (0.021 sec)

# 后续其它表继续更新
MariaDB [testdb]> use hellodb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

MariaDB [hellodb]> insert teachers (name,age,gender)values('wang',30,'M');
Query OK, 1 row affected (0.002 sec)

MariaDB [hellodb]> insert teachers (name,age,gender)values('mage',28,'M');
Query OK, 1 row affected (0.002 sec)

MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | wang          |  30 | M      |
|   6 | mage          |  28 | M      |
+-----+---------------+-----+--------+
6 rows in set (0.001 sec)

# 10:10发现表删除,进行还原
# 停止数据库访问
# 从完全备份中,找到二进制位置
[root@centos8 ~]#grep '\-\- CHANGE MASTER TO' /backup/allbackup_2019-11-27_10\:20\:08.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000003', MASTER_LOG_POS=389;

# 备份从完全备份后的二进制日志
[root@centos8 ~]#mysqlbinlog --start-position=389 /var/lib/mysql/mariadb-bin.000003 > /backup/inc.sql

# 找到误删除的语句,从备份中删除此语句
[root@centos8 ~]#vim /data/inc.sql
#DROP TABLE `student_info` /* generated by server */
## 如果文件过大,可以使用sed实现
[root@centos8 ~]#sed -i.bak '/^DROP TABLE/d' /data/inc.sql

# 利用完全备份和修改过的二进制日志进行还原
[root@centos8 ~]#mysql -uroot -p
MariaDB [hellodb]> set sql_log_bin=0;
MariaDB [hellodb]> source /backup/allbackup_2019-11-27_10:20:08.sql;
MariaDB [hellodb]> source /backup/inc.sql
MariaDB [hellodb]> set sql_log_bin=1;

二、xtrabackup

官网:www.percona.com

2.1 使用方法

xtrabackup工具备份和还原,需要三步实现

  1. 备份:对数据库做完全或增量备份
  2. 预准备: 还原前,先对备份的数据,整理至一个临时目录
  3. 还原:将整理好的数据,复制回数据库目录中

说明:

xtrabackup2.4 可备份mysql5.1、5.5、5.6、5.7
xtrabackup8.0只能备份mysql8.0

备份

innobackupex [option] BACKUP-ROOT-DIR

选项说明

--user			#该选项表示备份账号
--password		#该选项表示备份的密码
--host			#该选项表示备份数据库的地址
--databases		#该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开;
			# 如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。
			# 如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表

--defaults-file		# 该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental		# 该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir	# 该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir	# 该选项表示还原时增量备份的目录
--include=name		# 指定表名,格式:databasename.tablename

预准备

innobackupex --apply-log [option] BACKUP-DIR

选项说明:

--apply-log	# 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含
		#尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。
		#此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态

--use-memory	# 和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G
--export	# 表示开启可导出单独的表之后再导入其他Mysql中
--redo-only	# 此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并

还原

innobackupex --copy-back [选项] BACKUP-DIR
innobackupex --move-back [选项] [--defaults-group=GROUP-NAME] BACKUP-DIR

选项说明:

--copy-back			# 做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
--move-back			# 这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。
				#使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本

--force-non-empty-directories	# 指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。
				# 如果--copy-back和--move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

还原注意事项

  1. datadir 目录必须为空。除非指定innobackupex --force-non-empty-directorires​选项指定,否则--copy-back​选项不会覆盖

  2. 在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中

  3. 由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户, 执行chown -R mysql:mysql /data/mysql​,以上需要在用户调用innobackupex之前完成

2.2 完全备份与还原

使用xtrabackup8.0完全备份还原mysql8.0

# 1.安装xtrabackup包
[root@centos8 ~]#yum -y install percona-xtrabackup-80-8.0.23-16.1.el8.x86_64.rpm

# 2.在原主机做完全备份到/backup
[root@centos8 ~]#mkdir /backup
[root@centos8 ~]#xtrabackup -uroot -p123456 --backup --target-dir=/backup/base
#目标主机无需创建/backup目录,直接复制目录本身
[root@centos8 ~]#scp -r /backup/   目标主机:/

# 3.在目标主机上还原
## 1)预准备:确保数据一致,提交完成的事务,回滚未完成的事务
[root@centos8 ~]#yum -y install percona-xtrabackup-80-8.0.23-16.1.el8.x86_64.rpm
[root@centos8 ~]#xtrabackup --prepare --target-dir=/backup/base

## 2)复制到数据库目录
##注意:数据库目录必须为空,MySQL服务不能启动
[root@centos8 ~]#xtrabackup --copy-back --target-dir=/backup/base

## 3)还原属性
[root@centos8 ~]#chown -R mysql:mysql /var/lib/mysql

## 4)启动服务
[root@centos8 ~]#service mysqld start

2.3 完全、增量备份及还原

利用xtrabackup8.0 完全,增量备份及还原MySQL8.0

# 1.备份过程
## 1)完全备份:
[root@centos8 ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm
[root@centos8 ~]#mkdir /backup/
[root@centos8 ~]#xtrabackup -uroot -p123456 --backup --target-dir=/backup/base

## 2)第一次修改数据

## 3)第一次增量备份
[root@centos8 ~]#xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base

## 4)第二次修改数据

## 5)第二次增量
[root@centos8 ~]#xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

## 6)[root@centos8 ~]#scp -r /backup/* 目标主机:/backup/
#备份过程生成三个备份目录
/backup/{base,inc1,inc2}

# 2.还原过程
## 1)预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务
[root@centos8 ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm
[root@centos8 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base

## 2)合并第1次增量备份到完全备份
[root@centos8 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1

## 3)合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only
[root@centos8 ~]#xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2

## 4)复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
[root@centos8 ~]#xtrabackup --copy-back --target-dir=/backup/base

## 5)还原属性
[root@centos8 ~]#chown -R mysql:mysql /var/lib/mysql

## 6)启动服务
[root@centos8 ~]#service mysqld start

2.4 单表备份及还原

# 导出
# 1.单表备份
innobackupex  -uroot -p123456 --include='hellodb.students' /backup

# 2.备份表结构
mysql -e 'show create table hellodb.students' > student.sql

# 3.删除表
mysql -e 'drop table hellodb.students'

# 4.导出
innobackupex  --apply-log --export /backups/2018-02-23_15-03-23/

# 5.创建表
 mysql>CREATE TABLE `students` (
 `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `Name` varchar(50) NOT NULL,
 `Age` tinyint(3) unsigned NOT NULL,
 `Gender` enum('F','M') NOT NULL,
 `ClassID` tinyint(3) unsigned DEFAULT NULL,
 `TeacherID` int(10) unsigned DEFAULT NULL,
 PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

# 6.删除表空间
alter table students discard tablespace;

# 7.复制到数据库目录
cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/

# 8.还原属性
chown -R mysql.mysql /var/lib/mysql/hellodb/

# 9.导入表空间
mysql>alter table students import tablespace;

原文地址:https://www.cnblogs.com/areke/p/17228140.html