几个月没写文章了,最近有个mysql数据库备份的任务,整理了一份教程。

在软件开发过程中,保障数据的安全一定是最重要的部分之一了。而数据都是保存在数据库中,如何合理的备份数据库也是至关重要。

一、几种备份方案

简单介绍下几种备份的方案

按是否影响数据库

按数据量

按备份工具

二、使用mysqldump进行备份

使用原理:假如,我们会每周执行一次全量备份,然后根据log-bin日志文件进行每天增量备份,定期操作可以使用window的任务计划执行我们的bat文件

1. 首先开启日志功能、执行全量备份的命令,会保存备份sql文件与新旧日志文件

注意:如果mysql服务启动不起来可能是log-bin设置的目录(截图中的H:/mysqlbak/log-bin/)不存在

2. 执行完全备份命令(我们用脚本写成bat文件,将下面的完全备份命令写入其中,windows任务计划每周执行该文件,bat文件请看文章结尾)

mysqldump --no-defaults -hlocalhost -uroot -proot --single-transaction --flush-logs --master-data=2 -R -E --databases test > H:\mysqlbak\BAK_ALL_test.sql

其中
–no-defaults: 代表不使用默认配置
-hlocalhost: mysql服务ip地址
-uroot: mysql账号
-proot: mysql密码
–databases: test 代表备份的数据库为test
–single-transaction: 只使用于INNODB存储引擎,
–flush-logs: 代表结束当前日志,生成新的日志文件
-R: 代表备份存储过程和函数
-E: 代表备份事件 –master-data=2: 代表在输出的备份sql文件中会记录下新日志的文件名称和位置,用于日后恢复,在sql文件中会以注释的方式记录该内容如:

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=120; 

注意:如果没有在mysql的安装目录下的my.ini文件设置log-bin参数开启日志功能的话则会报错

mysqldump: Error: Binlogging on server not active 

3. mysql自动日志,用于增量备份

因为我们在mysql的安装目录下的my.ini文件设置了log-bin参数,即设置了日志保存路径,执行完全备份时的–flush-logs参数会生成新的日志文件,所以在该路径上会出现mysql-bin.000001、mysql-bin.000002、mysql-bin.index..等日志文件
mysql-bin.000001为旧的日志文件 mysql-bin.000002为新的日志文件 后面的mysql所有操作都会实时记录到mysql-bin.000002文件中,直到下次我们再进行备份为止

三、然后我们进行恢复(假如哪天mysql数据库数据丢了)

1.关闭日志功能,重启mysql

注意:因为备份的语句也会记录到日志,利用日志恢复的语句也会记录到日志、并且日志恢复语句还执行不成功,所以备份前先关闭日志功能 打开mysql的安装目录下的my.ini文件找到log-bin参数,加上#号注释掉 log-bin=H:/mysqlbak/log-bin/mysql-bin

2.先恢复完成备份

注意:需要设置mysql安装目录下的bin目录为环境变量 此时的备份sql也会记录到日志文件中,所以最好应该先关闭日志,不然的话后面增量恢复又重新执行了一次全量备份的sql

mysql.exe -hlocalhost -uroot -proot --default-character-set=utf8 < H:\mysqlbak\BAK_ALL_test.sql

3.恢复增量备份

利用日志文件恢复增量备份(mysqlbinlog –no-defaults 日志文件地址 | mysql -uroot -proot db_name),只需要备份最后一个日志文件即可

mysqlbinlog --no-defaults H:\mysqlbak\log-bin\mysql-bin.000002 | mysql  -uroot -proot test

可以查看日志内容

mysqlbinlog --no-defaults H:\mysqlbak\log-bin\mysql-bin.000002

可以导出为sql查看

mysqlbinlog --no-defaults H:\mysqlbak\log-bin\mysql-bin.000002 -r test.sql

结束

操作到这里就完成了,下面的内容可用可不用

以下是bat文件的操作流程,附bat文件脚本内容

  1. 修改备份huaantest_all_bak.bat文件(忽略则默认使用该配置)
    –修改备份文件保存目录 set BACKUP_PATH=H:\mysqlbak\
    –修改mysql bin目录:找到set MYSQL=D:\dev\mysql\mysql\MySQL Server 5.6\bin\ 修改为自己的目录
    –修改数据库 set DATABASES=huaantest 为自己的数据库
    –修改数据库 set HOST=192.168.1.137
    –修改用户名 set USERNAME=root
    –修改密码 set PASSWORD=123456
  2. 设置环境变量 –设置mysql安装目录下的bin目录为环境变量
  3. 配置Mysql日志文件以便后期增量备份还原
    –创建目录H:/mysqlbak/log-bin,修改mysql安装目录下my.ini文件添加log-bin=H:/mysqlbak/log-bin/mysql-bin
    (详细:https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#option_mysqld_log-bin)
    –重启mysql
  4. 执行备份(保存在“H:\mysqlbak\”目录下,可修改,会生成备份sql文件) –huaantest_all_bak.bat文件为执行备份文件,可手动双击启动备份,也可以设置windows定时计划定期执行
    –文件内可配置备份数据库名,mysql地址账号密码以及备份的保存路径
  5. 还原执行 –注释mysql安装目录下my.ini文件添加log-bin=H:/mysqlbak/log-bin/mysql-bin,重启mysql
    –完全备份还原命令:mysql.exe -hlocalhost -uroot -p123456 –default-character-set=utf8 < H:\mysqlbak\xxxx.sql
    –执行增量还原命令:mysqlbinlog –no-defaults H:\mysqlbak\log-bin\mysql-bin.xxxxx | mysql -uroot -p123456 huaantest

bat文件内容

@echo off & setlocal ENABLEEXTENSIONS

:: ---------- 配置项 ----------

:: 备份放置的路径,加 \
set BACKUP_PATH=H:\mysqlbak\

:: 要备份的数据库名称,多个用空格分隔
set DATABASES=test

:: MySQL IP地址
set HOST=localhost

:: MySQL 用户名
set USERNAME=root

:: MySQL 密码
set PASSWORD=root

:: MySQL Bin 目录,加 \
:: 如果可以直接使用 mysqldump(安装时添加 MySQL Bin 目录到了环境变量),此处留空即可
set MYSQL=D:\dev\mysql\mysql\MySQL Server 5.6\bin\

:: WinRAR 自带命令行工具的可执行文件路径,长文件名注意用 Dos 长文件名书写方式
set WINRAR=C:\Progra~1\WinRAR\Rar.exe

:: ---------- 以下请勿修改 ----------

set YEAR=%date:~0,4%
set MONTH=%date:~5,2%
set DAY=%date:~8,2%
:: 如果在 dos 下输入 time 返回的不是 24 小时制(没有 0 填充),请自行修改此处
set HOUR=%time:~0,2%
set MINUTE=%time:~3,2%
set SECOND=%time:~6,2%

:: set DIR=%BACKUP_PATH%%YEAR%\%MONTH%\%DAY%\
set DIR=%BACKUP_PATH%%YEAR%\%MONTH%\%DAY%\
set ADDON=%YEAR%%MONTH%%DAY%%HOUR%%MINUTE%%SECOND%

:: create dir
if not exist %DIR% (
mkdir %DIR% 2>nul
)
if not exist %DIR% (
echo Backup path: %DIR% not exists, create dir failed.
goto exit
)

:: backup
echo Start dump databases...
for %%D in (%DATABASES%) do (
echo Dumping database %%D ...
:: 备份包括存储过程和函数和事件,-R存储过程和函数  -E事件
mysqldump --no-defaults -h%HOST% -u%USERNAME% -p%PASSWORD% --single-transaction --flush-logs --master-data=2 -R -E --databases %%D > %DIR%BAK_ALL_%%D_%ADDON%.sql
:: winrar
if exist %WINRAR% (
%WINRAR% a -k -r -s -m1 -ep1 %%D.%ADDON%.rar %%D.%ADDON%.sql
del /F /S /Q %%D.%ADDON%.sql 2>nul
)
)
echo Done

:exit