mysql数据库备份和还原
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库备份和还原相关的知识,希望对你有一定的参考价值。
用了navicat备份库,和还原都报错,然后用传输也报错
mysql数据库备份与还原备份和恢复数据
生成SQL脚本
在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。
mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径
现在可以在C盘下找到mydb1.sql文件了!
注意,mysqldump命令是在Windows控制台下执行,无需登录mysql!!!
执行SQL脚本
执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本!!!
执行SQL脚本不只是用来恢复数据库,也可以在平时编写SQL脚本,然后使用执行SQL 脚本来操作数据库!大家都知道,在黑屏下编写SQL语句时,就算发现了错误,可能也不能修改了。所以我建议大家使用脚本文件来编写SQL代码,然后执行之!
SOURCE C:\mydb1.sql
注意,在执行脚本时需要先行核查当前数据库中的表是否与脚本文件中的语句有冲突!例如在脚本文件中存在create table a的语句,而当前数据库中已经存在了a表,那么就会出错!
还可以通过下面的方式来执行脚本文件:
mysql -uroot -p123 mydb1<c:\mydb1.sql
mysql –u用户名 –p密码 数据库<要执行脚本文件路径
这种方式无需登录mysql! 参考技术A 备份数据库testmysqldump-uroot-ptest>bak.sql还原:执行bak.sql自动备份:在windows中做一个自动任务,然后执行mysqldump-uroot-ptest>bak.sql 参考技术B MySQL有一种非常简单的备份方法,先将服务器停止,然后将MySQL中的数据库文件直接复制出来。这是最简单,速度最快的方法。
*将服务器停止,这样才可以保证在复制期间数据库的数据不会发生变化。如果在复制数据库的过程中还有数据写入,就会造成数据不一致。
恢复也一样,先将服务器停止,然后将备份的数据库覆盖同名的数据库即可。
24-mysql备份和还原
备份类型
- 完全备份,部分备份
- 增量备份、差异备份
- 增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂
图解
- 差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
图解
- 增量和差异备份的基础和前提是完全备份
注意:二进制日志文件不应该与数据文件放在同一磁盘
- 冷、温、热备份
- 冷备:读、写操作均不可进行,数据库停止服务
- 温备:读操作可执行;但写操作不可执行
- 热备:读、写操作均可执行
- MyISAM:温备,不支持热备
- InnoDB:都支持
- 物理和逻辑备份
- 物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
- 逻辑备份:从数据库中"导出"数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度
备份什么
- 数据
- 二进制日志、InnoDB的事务日志
- 用户帐号,权限设置,程序代码(存储过程、函数、触发器、事件调度器)
- 服务器的配置文件
备份注意要点
- 能容忍最多丢失多少数据
- 备份产生的负载
- 备份过程的时长
- 温备的持锁多久
- 恢复数据需要在多长时间内完成
- 需要备份和恢复哪些数据
还原要点
- 做还原测试,用于测试备份的可用性
- 还原演练,写成规范的技术文档
备份工具
- cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全和部分备份
- LVM的快照:先加读锁,做快照后解锁,几乎热备;借助文件系统工具进行备份
- mysqldump:逻辑备份工具,适用所有存储引擎,对MyISAM存储引擎进行温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份 --> 运维职业常用
- 命令
#参考 https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
mysqldump [OPTIONS] database [tables] #支持指定数据库和指定多表的备份,但数据库本身定义不备份
mysqldump [OPTIONS] -B DB1 [DB2 DB3...] #支持指定数据库备份,包含数据库本身定义也会备份
mysqldump [OPTIONS] -A [OPTIONS] #备份所有数据库,包含数据库本身定义也会备份
#常见通用选项:
-u, --user=name User for login if not current user
-p, --password[=name] Password to use when connecting to server
-A, --all-databases #备份所有数据库,含create database
-B, --databases db_name… #指定备份的数据库,包括create database语句
-E, --events:#备份相关的所有event scheduler
-R, --routines:#备份所有存储过程和自定义函数
--triggers:#备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
--default-character-set=utf8 #指定字符集
--master-data[=#]:#注意:MySQL8.0.26版以后,此选项变为--source-data
#此选项须启用二进制日志
#1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1,适合于主从复
制多机使用
#2:记录为被注释的#CHANGE MASTER TO语句,适合于单机使用,适用于备份还原
#此选项会自动关闭--lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启--
single-transaction)
-F, --flush-logs #备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,
配合-A 或 -B 选项时,会导致刷新多次数据库。建议在同一时刻执行转储和日志刷新,可通过和--singletransaction
或-x,--master-data 一起使用实现,此时只刷新一次二进制日志
--compact #去掉注释,适合调试,节约备份占用的空间,生产不使用
-d, --no-data #只备份表结构,不备份数据,即只备份create table
-t, --no-create-info #只备份数据,不备份表结构,即不备份create table
-n,--no-create-db #不备份create database,可被-A或-B覆盖
--flush-privileges #备份mysql或相关时需要使用
-f, --force #忽略SQL错误,继续执行
--hex-blob #使用十六进制符号转储二进制列,当有包括BINARY,VARBINARY,BLOB,
BIT的数据类型的列时使用,避免乱码
-q, --quick #不缓存查询,直接输出,加快备份速度
#mysqldump的MyISAM存储引擎相关的备份选项
*MyISAM不支持事务,只能支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作*
-x,--lock-all-tables #加全局读锁,锁定所有库的所有表,同时加--single-transaction或--
lock-tables选项会关闭此选项功能,注意:数据量大时,可能会导致长时间无法并发访问数据库
-l,--lock-tables #对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--
skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会造成数据不一致
#注:以上选项对InnoDB表一样生效,实现温备,但不推荐使用
#mysqldump的InnoDB存储引擎相关的备份选项
--single-transaction
#此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启
事务
#此选项通过在单个事务中转储所有表来创建一致的快照。 仅适用于存储在支持多版本控制的存储引擎中的表
(目前只有InnoDB可以); 转储不保证与其他存储引擎保持一致。 在进行单事务转储时,要确保有效的转储
文件(正确的表内容和二进制日志位置),没有其他连接应该使用以下语句:ALTER TABLE,DROP TABLE,
RENAME TABLE,TRUNCATE TABLE,此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互
排斥,备份大型表时,建议将--single-transaction选项和--quick结合一起使用
----------------------------------------------------------------------------------------------
#生产环境实战备份策略
#InnoDB建议备份策略
mysqldump -uroot -p123456 -A -F -E -R --triggers --single-transaction --masterdata=2
--flush-privileges --default-character-set=utf8 --hex-blob $BACKUP/fullbak_$BACKUP_TIME.sql
#新版8.0.26以上
mysqldump -uroot -p123456 -A -F -E -R --triggers --single-transaction --sourcedata=2
--flush-privileges --default-character-set=utf8 --hex-blob $BACKUP/fullbak_$BACKUP_TIME.sql
#MyISAM建议备份策略
mysqldump -uroot -p123456 -A -F -E -R -x --master-data=1 --flush-privileges --
triggers --default-character-set=utf8 --hex-blob BACKUP/fullbak_$BACKUP_TIME.sql
- xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份 --> DBA职业常用,更专业
- 其他
冷备-还原
#停止服务
[root@centos8 ~]#systemctl stop mysqld
#备份数据到远端
[root@centos8 ~]#rsync -a /var/lib/mysql 10.0.0.28:/data/
#如果配置及二进制文件相关有特殊设置也需要备份
#还原
[root@centos8 ~]#yum -y install mysql-server
[root@centos8 ~]#cp -a /data/mysql/* /var/lib/mysql/
[root@centos8 ~]#systemctl start mysqld
mysqldump 备份还原案例
#1. 特定数据库的备份脚本
[root@centos8 ~]#cat mysql_backup.sh
#!/bin/bash
TIME=`date +%F_%H-%M-%S`
DIR=/backup
DB=hellodb
PASS=wang
[ -d $DIR ] || mkdir $DIR
mysqldump -uroot -p "$PASS" -F -E -R --triggers --single-transaction --masterdata=
2 --default-character-set=utf8 -q -B $DB | gzip >
$DIR/$DB_$TIME.sql.gz
#2. 分库备份并压缩
[root@centos8 ~]#for db in `mysql -uroot -e show databases|grep -Ewv
^(Database|information_schema|performance_schema|sys)$`;do mysqldump -B $db |
gzip > /backup/$db.sql.gz;done
[root@centos8 ~]#mysql -uroot -e show databases|grep -Ewv
^(Database|information_schema|performance_schema\\sys)$|while read db;do
mysqldump -B $db | gzip > /backup/$db.sql.gz;done
[root@centos8 ~]#mysql -uroot -e show databases|grep -Ewv
^(Database|information_schema|performance_schema|sys)$ | sed -rn s#
(.*)#mysqldump -B \\1 | gzip > /backup/\\1.sql.gz#p |bash
[root@centos8 ~]#mysql -uroot -e show databases|sed -rn
/^(Database|information_schema|performance_schema|sys)$/!s#(.*)#mysqldump -B \\1
| gzip > /backup/\\1.sql.gz#p |bash
#脚本
[root@centos8 ~]#cat backup_db.sh
#!/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 -Ewv
"^Database|.*schema$"`;do
mysqldump -F --single-transaction --master-data=2 --default-characterset=
utf8 -q -B $DB | gzip > $DIR/$DB_$TIME.sql.gz
done
#完全备份和还原
#开启二进制日志
[root@centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
log-bin
#备份
[root@centos8 ~]#mysqldump -uroot -p123456 -A -F --single-transaction --masterdata=
2 |gzip > /backup/all-`date +%F`.sql.gz
#还原
[root@centos8 backup]#dnf install mariadb-server
[root@centos8 backup]#gzip -d all-2019-11-27.sql.gz
[root@centos8 ~]#mysql
MariaDB [(none)]> set sql_log_bin=off;
MariaDB [(none)]> source /backup/all-2019-11-27.sql
MariaDB [(none)]> set sql_log_bin=on;
#利用二进制日志,还原数据库最新状态
#二进制日志独立存放
[mysqld]
log-bin=/data/mysql/mysql-bin
#完全备份,并记录备份的二进制位置
mysqldump -uroot -p123456 -A -F --default-character-set=utf8 --singletransaction
--master-data=2 | gzip > /backup/all_`date +%F`.sql.gz
#修改数据库
insert students (name,age,gender)value(moore,20,M);
insert students (name,age,gender)value(mooreyxia,22,M);
#损坏数据库
rm -rf /var/lib/mysql/*
#还原
cd /backup
gzip -d all_2019-11-25.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_2019-11-25.sql
[root@centos8 ~]#grep ^-- CHANGE MASTER TO /data/all_2019-11-25.sql
-- CHANGE MASTER TO MASTER_LOG_FILE=mysql-bin.000001, MASTER_LOG_POS=328;
#二进制日志的备份
[root@centos8 mysql]#mysqlbinlog mysql-bin.000001 --start-positinotallow=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;
#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 #假设mariadbbin.
000003是后续生成的二进制日志
[root@centos8 ~]#mysqlbinlog backup/mariadb-bin.000003 > /backup/inc.sql
我是moore,大家一起加油!
以上是关于mysql数据库备份和还原的主要内容,如果未能解决你的问题,请参考以下文章