环境介绍 

1.两台服务器进行主从同步复制(安装可以通过google查询相关资料或者看笔者的这篇免安装版)

2.利用Windows脚本和Windows自带的计划任务,将主服务器进行实时备份(下面进行演示)

Maseter MySQL: 192.168.1.253

Slave    MySQL: 192.168.1.254

3.在主服务器上开启二进制日志功能,设置唯一的服务器ID编号,这些设置需要重启MySQL服务

4.在从服务器上设置唯一的服务器ID编号,这些设置需要重启MySQL服务

5.在主服务器上为了不用从服务器创建可以读取主服务器日志文件的用户,或使用相同的统一用户

6.在进行数据复制之前,需要记录主服务器上二进制文件的位置的标记

7.在进行数据复制之前,保证从服务器和主服务器上的数据一致

主服务器的配置

在实际的环境中,可能在我们还没有部署数据库的同步前,数据库中就已经存在大量的数据。所以,在操作数据库的时候一定记住备份

mysqldump -u root -p --all-databases --lock-all-tables > G:/dbdump.sql
Enter password: ******

我们需要在主服务器上开启二进制日志并设置服务器编号,服务器唯一编号是2的32次方减1之间的整数,根据自己的实际情况而设置

C:\Users\Administrator>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。

[mysqld]
log-bin=mysql-bin
server-id=1

C:\Users\Administrator>net start mysql
MySQL 服务正在启动 .
MySQL 服务已经启动成功。

为了使从服务器能够同步复制,我们需要创建一个同步复制的用户

1.执行数据复制时,所有的从服务器都需要使用用户与密码连接MySQL主服务器,所以在主服务器上必须存在至少一个用户及相应的密码提供从服务器来连接

2.但是这个用户必须拥有"REPLICATION SLAVE" 权限,当然你可以给不同的从服务器创建不用的用户与密码,也可以使用统一的用户与密码

3.如果该用户仅为数据库复制所使用,则该用户仅需要"REPLICATION SLAVE"权限即可

1 C:\Users\Administrator>mysql -u root -p
 2 Enter password: ******
 3 Welcome to the MySQL monitor.  Commands end with ; or \g.
 4 Your MySQL connection id is 1
 5 Server version: 5.6.25 MySQL Community Server (GPL)
 6  
 7 Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
 8  
 9 Oracle is a registered trademark of Oracle Corporation and/or its
10 affiliates. Other names may be trademarks of their respective
11 owners.
12  
13 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
14 mysql> CREATE USER 'slave'@'%' IDENTIFIED BY 'slaveAdmin';
15 Query OK, 0 rows affected (0.02 sec)
16  
17 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
18 Query OK, 0 rows affected (0.00 sec)
19  
20 mysql> FLUSH PRIVILEGES;
21 Query OK, 0 rows affected (0.00 sec)
22  
23 mysql> exit
24 Bye

获取主服务器二进制日志信息

1.首先我们来了解一下二进制文件的基本信息,这些信息在对从服务器的设置需要用到,它包括服务器二进制文件名称及当前日志记录位置,这样从服务器就可以知道哪里开始进行复制操作

2.当我们得到二进制文件名以及二进制当前记录的位置时请牢记,在从服务器上会用到

1 mysql> FLUSH TABLES WITH READ LOCK;
 2 Query OK, 0 rows affected (0.00 sec)
 3  
 4 mysql> SHOW MASTER STATUS;
 5 +------------------+----------+--------------+------------------+-------------------+
 6 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
 7 +------------------+----------+--------------+------------------+-------------------+
 8 | mysql-bin.000004 |  9876212 |              |                  |    |
 9 +------------------+----------+--------------+------------------+-------------------+
10 1 row in set (0.00 sec)
11  
12 mysql> UNLOCK TABLES;
13 Query OK, 0 rows affected (0.00 sec)

1.File列显示的是二进制日志文件名,Position为当前日志记录位置

2.FLUSH TABLES WITH READ LOCK 命令的作用是对所有数据库的表执行只读锁定,当只读锁定后所有数据库写操作都将被拒绝,但读操作可以继续

3.执行锁定可以防止在查看二进制日志信息的同时有人对操作进行修改操作,最后使用 UNLOCK TABLES 命令对全局锁执行结束操作

从服务器的配置

和主服务器一样,需要配置my.ini或者my.cnf 文件,注意这里的从服务器ID编号

C:\Users\Administrator>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。

[mysqld]
server-id=2

C:\Users\Administrator>net start mysql
MySQL 服务正在启动 .
MySQL 服务已经启动成功。

对于复制而言,MySQL从服务器二进制功能是不需要开启的,当然也可以开启从服务器上的二进制功能来实现数据备份与恢复

在介绍里面我已经说到在进行数据复制之前,保证从服务器和主服务器上的数据一致,还记得我刚才将主服务器的MySQL进行备份吗?! 可以将这备份还原到从服务器上面,这样主从的数据就是一样的了

mysql -u root -p < D:/dbdump.sql
Enter password: ******

配置从服务器连接主服务器进行数据复制

1.其实数据复制的关键操作是配置从服务器去连接主服务器进行数据复制,我们需要告诉从服务器建立网络连接所有必要的信息

2.使用 CHANGE MASTER TO 语句完成与主服务器的连接工作

† MASTER_HOST 指定主服务器主机名或者Ip地址

† MASTER_USER 为刚才在主服务器上创建的拥有复制权限的用户

† MASTER_PASSWORD 为改用户的秘密

†  MASTER_LOG_FILE 指定主服务器二进制日志文件名称

† MASTER_LOG_POS 指定主服务器二进制日志文件当前的位置

START LSAVE 开启从服务器功能进行主从连接

SHOW SLAVE STATUS 查看从服务器状态

1 mysql> CHANGE MASTER TO
2     -> MASTER_HOST='192.168.1.253',
3     -> MASTER_USER='slave',
4     -> MASTER_PASSWORD='slaveAdmin',
5     -> MASTER_LOG_FILE='mysql-bin.000004',
6     -> MASTER_LOG_POS=9876212;
7 Query OK, 0 rows affected (0.00 sec)
1 mysql> START SLAVE;
2 Query OK, 0 rows affected (0.00 sec)
3 mysql> SHOW SLAVE STATUS\G;

查看状态时,下面两个都要为 YES 说明才是正常运行状态,如果IO为No 则检查密码或者从新写入

  1. Slave_IO_Running: 
  2. Slave_SQL_Running:

现在当我们在主服务器上创建一个数据库时,我们再到从服务器上查看,这时就可以看到已经把主服务器上新创建数据库的同步过来了

1 mysql> create database vforbox;
 2 Query OK, 1 row affected (0.00 sec)
 3  
 4 mysql> show databases;
 5 +--------------------+
 6 | Database           |
 7 +--------------------+
 8 | information_schema |
 9 | mysql              |
10 | performance_schema |
11 | test               |
12 | vforbox            |
13 +--------------------+

Windows 定时备份数据库脚本

上面介绍中已经提到用Windows脚本和Windows自带的计划任务,将主服务器进行实时备份

新建一个 "mysql_auto_bak.bat"

1 @echo off
 2 cls
 3 color 3E
 4 title %date% %time:~,5% 备份MySQL数据库 By:vforobx
 5 ::::::::::::::::::::::::以下是需要配置的参数::::::::::::::::::::::::::::::::::::::::
 6  
 7         rem 设置 MySQL服务器root账号的密码,特殊符号需要在其前添加两个^
 8         SET MySQL_pw=123456
 9         rem 设置 数据库备份目录
10         SET BAK_dir=D:\mysqlbak
11         rem 设置 需要备份的myisam格式数据库
12         SET BAK_db_myisam=myisam_db
13         rem 设置 需要备份的innodb格式数据库
14         SET BAK_db_innodb=innodb
15         rem 设置 WinRAR压缩软件的路径
16         SET RAR_dir="C:\Program files (x86)\WinRAR\WinRAR.exe"
17         rem 设置 以2015-10-01格式的日期为子目录
18         SET BAK_dir2=%date:~0,4%-%date:~5,2%-%date:~8,2%
19         rem 设置 备份文件名
20         SET BAK_file=%%i_%BAK_dir2%.sql
21         rem 设置日志文件里面指向的rar文件路径
22         SET BAK_file2=%%i_%BAK_dir2%
23         rem 设置 日志文件名
24         SET LOG_file=%BAK_dir%\%BAK_dir2%\Mysql_bak.log
25  
26 ::::::::::::::::::::::::以上是需要配置的参数::::::::::::::::::::::::::::::::::::::::
27  
28 ::::::::::::::::::::::::以下是判断变量是否定义::::::::::::::::::::::::::::::::::::::
29  
30 if not defined MySQL_pw (echo MySQL_pw 尚未定义!)
31 if not defined BAK_dir (echo BAK_dir 尚未定义!)
32 if not defined RAR_dir (RAR_dir 尚未定义!)
33  
34 ::::::::::::::::::::::::以下是记录时间日志::::::::::::::::::::::::::::::::::::::::::
35  
36 if not defined BAK_db_myisam (goto innodb)
37 echo. 开始以当前日期创建文件夹
38 if not exist %BAK_dir%\%BAK_dir2% md %BAK_dir%\%BAK_dir2%
39 cd /d %BAK_dir%\%BAK_dir2%
40 echo. 开始建立(%BAK_dir2%)的备份
41 ::::::::::::::::::::::::以下是备份的核心代码::::::::::::::::::::::::::::::::::::::::
42  
43 echo 备份时间: %BAK_dir2% %time:~0,8%  >> %LOG_file%
44 echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> %LOG_file%
45 SETLocal DisableDelayedExpansion
46 for %%i in (%BAK_db_myisam%) do (
47 mysqldump -h 192.168.1.253 -uroot -p%MySql_pw% --all-databases >%BAK_file%
48 %RAR_Dir% a %BAK_file:~0,-4%.rar %BAK_file%
49 DEL /F /A /Q %BAK_file%
50 echo 数据库【%%i 格式】已经备份到: %BAK_dir%\%BAK_dir2%\%BAK_file2%.rar >> %LOG_file%)
51 ::::::::::::::::::::::::以下是 innodb格式的备份代码::::::::::::::::::::::::::::::::::
52  
53 if not defined BAK_db_innodb (goto exitbat)
54 echo. 开始以当前日期创建文件夹
55 if not exist %BAK_dir%\%BAK_dir2% md %BAK_dir%\%BAK_dir2%
56 cd /d %BAK_dir%\%BAK_dir2%
57 echo. 开始建立今天(%BAK_dir2%)的备份
58 SETLocal DisableDelayedExpansion
59 for %%i in (%BAK_db_innodb%) do (
60 mysqldump -h 192.168.1.253 -uroot -p%MySQL_pw% --all-databases >%BAK_file% 
61 %RAR_dir% a %BAK_file:~0,-4%.rar %BAK_file%
62 DEL /F /A /Q %BAK_file%
63 echo 数据库【%%i 格式】已经备份到:%BAK_dir%\%BAK_dir2%\%BAK_file2%.rar >> %LOG_file%)
64 echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> %LOG_file%
65 echo. 所有备份建立完毕
66 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
67 rem 清除变量
68         SET MySQL_pw=
69         SET BAK_dir=
70         SET RAR_dir=
71         SET BAK_dir2=
72         SET BAK_file=
73         SET BAK_file2
74         SET LOG_file=

如果觉得复制麻烦-点击下载

然后将脚本加入Windwos自带计划任务,这里笔者将不截图演示如何创建计划任务了,如需帮助请自行google