数据库Mysql主从同步

rbirmysql主从操作如下,目前只有一台mysql服务器,现添加一台数据库服务器作为从服务器,用来做数据查询,下面是操作步骤(mysql5.5)

现有数据库服务器A(192.168.2.3)在整个过程具体执行的操作:

A的/etc/my.cnf 里面server-id       = 1

1.   给予从数据库权限:

/usr/local/mysql/bin/mysql �Curoot -p

grant replication slave on *.* to username@'192.168.2.7' identified by 'userpasswd';

flush privileges;

2. 刷新二进制日志:

reset master;

quit;

3. 完整备份整个数据库

/usr/local/mysql/bin/mysqldump -uroot -p --master-data=2 --databases date1date2 date3  > /root/mysqlbak.sql

scp -P 4000 mysqlbak.sql 192.168.2.7:/root  #scp推送到从服务器

head -n 23 mysqlbak.sql      #得到mysql-bin的日志文件名称和MASTER_LOG_POS的值,从数据库同步需要用

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=458;


说明:自己做过实验,用来证实mysqldump操作的时候,MASTER_LOG_POS的值是什么时间点产生的,得到的结果是执行mysqldump命令前,在mysqldump过程中,数据库是锁定的,不能写,所以在从数据库执行的时候,把master_log_pos指向这个数字就是正确的


从数据库(192.168.2.7)上执行的操作:

B的/etc/my.cnf 里面

server-id = 2
read-only = 1
max_relay_log_size = 2G
relay_log_purge = 1
relay_log_recovery = 1

1. 导入整个数据库备份:

/usr/local/mysql/bin/mysql -uroot -p

source /root/mysqlbak.sql

2. 配置主从:

reset master;

slave stop;

change master to MASTER_HOST='192.168.2.3', MASTER_PORT=3306,MASTER_USER='username', MASTER_PASSWORD='userpasswd',master_log_file='mysql-bin.000001', master_log_pos=458;

slave start;

show slave status\G;


同步需要的库及表

如果只对于A中某一个库的一个表做同步,那么在B中/etc/my.cnf 添加

[mysqld]

replicate-wild-do-table=database.table

(如果只同步某一个库,那么 replicate-wild-do-table=database.%)


主服务器配置:

binlog-do-db   //指定要记录二进制日志的数据库

binlog-ignore-db  //指定要忽略记录二进制日志的数据库


从服务器配置:

replicate-do-table=   //指定要记录二进制日志的表

replicate-ignore-table=  //指定要忽略记录二进制日志的表

replicate-do-db=  //指定要记录二进制日志的数据库

replicate-ignore-db=  //指定要忽略记录二进制日志的数据库

replicate-wild-do-table=  //指定要记录二进制日志的表(支持通配符)

replicate-wild-ignore-table=  //指定要忽略记录二进制日志的表(支持通配符)


比如数据库中有DBA,DBB,DBC       DBC中有表 ca,cb,cc

现在只需要同步DBC 中的cb和cc两个表,那么在从库如下配置即可
replicate-ignore-db = DBA

replicate-ignore-db = DBB

replicate-wild-do-table = DBC.cb
replicate-wild-do-table = DBC.cc


注意:

replicate-wild-ignore-table=db_name.%   #复制时忽略数据库及表

replicate-ignore-db 是通过use db来确定是否过滤的,而wild-ignore是通过真实被修改的表进行过滤的,更为准确,使用 replicate_wild_do_table和 replicate_wild_ignore_table 来解决跨库更新的问题

如果你不想复制某些临时表,请使用 --replicate-wild-ignore-table 选项。如:--replicate-wild-ignore-table=foo%.bar% , 意思是告诉slave线程不要复制匹配以foo开头和以bar开头的表

#需要同步的数据库
replicate-do-db=cnb
#启用从库日志,这样可以进行链式复制
log-slave-updates
#从库是否只读,0表示可读写,1表示只读
read-only=1
#只复制某个表

replicate-do-table=tablename
#只复制某些表(可用匹配符)

replicate-wild-do-table=tablename%
#只复制某个库
replicate-do-db=dbname
#不复制某个表
replicate-ignore-table=tablename
#不复制某些表
replicate-wild-ignore-table=tablename%
#不复制某个库
replicate-ignore-db=dbname

前面用了do-db  后面的ignore-db不生效


在主和从的my.cnf里面[mysqld]下添加

log-slave-updates = true  //是否记录从服务器同步数据动作

sync-master-info = 1  

report-port = 3306

binlog_format=mixed  //设置二进制日志格式


登录mysql

slave stop;

在主show master status\G 记下mysql-bin.num和Position

在从执行 change master to master_log_file='mysql-bin.num', master_log_pos=____;

slave start;

show slave status\G

你可能感兴趣的:(mysql,数据库,主从同步)