您的位置:首页 > 数据库 > MySQL

windows 下面 配置 mysql 主从数据库

2016-04-20 17:42 771 查看
上篇文章讲了如何在windows下面创建两个mysql服务,就是为下面讲主从配置做好铺垫的


一.打开第一个数据库的my.ini文件。

[mysqld]
server-id = 1
#要同步的数据库
binlog-do-db=sdk_test
#binlog-ignore-db=mysql
#不同步的数据库,如果指定了binlog-do-db这里应该可以不用指定的
#要生成的二进制日记文件名称
log-bin=mysql-bin
binlog_format=MIXED
# The TCP/IP Port the MySQL Server will listen on
port=3306
#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
#Path to the database root
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"


二.打开第二个数据库的my.ini文件

[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3307
server-id=2
log-bin=mysql-bin
#master-connect-retry=60
binlog_format=MIXED
replicate-do-db=sdk_test
#Path toinstallation directory. All paths are usually resolved relative to this.
basedir=E:/MySQL/MySQL Server 5.5/
#Path to the database root
datadir=E:/MySQL/MySQL Server 5.5/data/
下面解释上面参数的意思:

1.port  端口号,两个端口号必须不能一样;

2.server-id,两个server-id也不能一样,好像不能超过多大??

3.log-bin就是数据库日志保存的文件,上面都是mysql-bin,默认的会产生如下的日志文件,mysql-bin.000001 默认大小为1G,超过就会产生第二个日志文件mysql-bin.000002,如果数据库重启,就会重新产生一个日志文件

以此类推下去,日志文件产生在data目录下面,但是安装在c盘下的mysql产生在,C盘下面的programdata目录下面,具体的请看上一篇文章。两个log-bin名称不需要一样

expire_logs_days=10
max_binlog_size=100M

上面expire_logs_days 定义了过期日志清除的时间,不设置默认0,代表不清除,上面是10,表示10天。

max_binlog_size=100M 表示 最大 日志100M,超过这个大小 ,就会创建新的日志文件。

可以通过命令:show variables like 'expire_logs_days';  等等,或者 查看日志文件 ,show variables like '%logs_%'; 等等,具体日志相关的详细资料这里不作详解,具体文章请看mysql
日志解析

4.binlog_format 有三种选择,statement,row,mixed ,mysql 默认的是statement,这里设置binlog_format
为mixed
,具体的文章看binlog_format

5.binlog-do-db 表示 为要主库要同步的数据库,而binlog-ignore-db表示主要不需要同步的数据库

replicate-do-db表示从库需要同步的数据库

注意:上面配置信息更改完成之后,重新启动mssql服务。


三.在主库上面创建一个lj用户并指定其具有replication slave 的权限 这个权限可以被其它库同步;目的是为slave创建连接账号,用于同步

create user  'lj'@'127.0.0.1' identified by 'lj';
grant replication slave on *.* to 'lj'@'127.0.0.1';
flush privileges;

如果想要更改权限:

grant replication slave on *.* to 'lj'@'127.0.0.1' identified by 'lj';   更改权限,必须由root账号进行更改。

还有的赋予如下权限:grant replication slave,reload,super
on 

注意:对于权限replication slave的解释,如果你之前是认为replication
slave 是复制所必须的权限,那么你就错了,为了安全性一般都需要replication slave 。如果单独设置replication slave,replication client 复制其实都可以运行的。mysql有一些特殊的权限允许复制进程运行,运行在从服务器上的I/O线程创建了到master的连接,这就意味着必须在主服务器上创建一个用户并且需要授予特殊的权限。这样I/O线程就会一特定的身份连接到主服务器上并且读取二进制日志。但是需要说明的一点是,复制用户在主服务器上实际只需要replication 
client  权限就可以运行的,这里授予replication  slave的原因是用于监视和管理复制账号需要这个权限,并且这两个功能(复制需要的权限,监视和管理复制账号权限)通常是一个账号在管理,而不是为了达到这两个目标而分别设置2个账号,在实际开发过程中,主库的用户名密码,必须填写root,,而不能填写只有replication slave权限的账号,否则执行CRUD操作时,报没有权限。

具体的赋予权限请参考:mysql 权限

四.将主库上面的数据同步到,从库中。

1.在从库上面创建需要同步的数据库。

2.在主库中使用root账号登录:输入命令,

FLUSH TABLES WITH READ LOCK; #首先执行这个,对主服务器加写锁
导出整个数据库结构和数据:mysqldump -u用户名 -p密码 -h主机 database > filename.sql
导出某个表的数据和结构:mysqldump -u用户名 -p密码 -h主机 database table > filename.sql
只导出数据库中表的数据:mysqldump -u用户名 -p密码 -h主机 -T database table > filename.sql
只导出数据库中表的结构:mysqldump -u用户名 -p密码 -h主机 -d database table > filename.sql


3.将数据备份后,进入从库mysql,使用

mysql -uroot -p;
use sdk_test;
source D:/filename.sql


执行sql数据。

4.将从库的状态设置成与主库一致

mysql -uroot -p;

show master status\G; -- 查看主库

<span style="font-family:SimHei;">+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | sdk_test | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)</span>


进入从库
slave stop;
change master to master_host='127.0.0.1',master_port=3306,master_user='lj',master_password='lj',master_log_file='mysql-bin.000001',master_log_pos=107;
slave start; -- 开户同步
show slave status \G;
Slave_IO_Running 和 Slave_SQL_Running 两列的值都为 "Yes",这表明 Slave 的 I/O 和 SQL 线程都在正常运行。


最后在主库上面释放锁:UNLOCK TABLES;



如果,主从数据未同步,那么上面这种方法,可以完全使主从数据一致,如果主从数据库差距不是很大,可以使用如下
方法。




stop slave;

#表示跳过一步错误,后面的数字可变

set global sql_slave_skip_counter =1;

start slave;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息