主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)
同个mysql数据库服务器的数据同步,目前使用触发器实现。 mysql触发器的使用笔记_倪时鸿的博客-CSDN博客
根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
备注:复制是异步的 从站不需要永久连接以接收来自主站的更新。
注意:前提是作为主服务器角色的数据库服务器必须开启二进制日志
MySQL中复制的优点包括:
************************************************************以下是重点 开始**********************************************************
主服务器设置
my.cnf
配置文件 find / -name my.cnf
[mysqld]
log-bin=mysql-bin
#binlog_format=mixed
server-id=1
#expire_logs_days = 6
#binlog_checksum =none
#innodb-file-per-table =ON
#skip_name_resolve=ON
#指定复制的数据库
#binlog-do-db = kksystem
#binlog-ignore-db = mysql,performance_schema,information_schema
设置 log-bin
时必须同时设置 server-id
创建日志目录并赋予权限
shell> mkdir /var/log/mysql
shell> chown mysql.mysql /var/log/mysql
重启服务
systemctl restart mysqld
或者
service mysql restart
从服务器设置
my.cnf
配置文件
[mysqld]
log-bin=mysql-bin
#binlog_format=mixed
server-id = 2
#expire_logs_days = 6
slave-skip-errors = all #设置忽略错误
#指定要复制的数据库
#replicate-rewrite-db= kksystem->kkcloud
#指定要复制的表
#replicate-do-table = kkcloud.kk_user //要同步的master数据表,要同步多个数据表,就多加几个
#replicate-do-table = kkcloud.czcs //要同步的master数据库,要同步多个数据库,就多加几个replicate-db-db=数据库名
重启服务
systemctl restart mysqld
或者
service mysql restart
5、在主服务器上建立帐户并授权slave:
#/usr/local/mysql/bin/mysql -uroot -pmttang
mysql>GRANT REPLICATION SLAVE ON *.* to 'master用户名'@'%' identified by 'master密码';
//一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
6、登录主服务器的mysql,查询master的状态
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 308 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7、配置从服务器Slave:
mysql>change master to master_host='27.148.190.82',master_user='master用户名',master_password='master密码',master_log_file='mysql-bin.000001',master_log_pos=0; //注意不要断开,308数字前后无单引号。
Mysql>start slave; //启动从服务器复制功能
8、检查从服务器复制功能状态:
mysql> show slave status\G
报错解决
mysql> show slave status\G;
问题1:Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
问题提示主从使用了相同的server UUID,一个个的检查:
检查主从server_id
show variables like 'server_id';
如果一样要修改
问题2:Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
方法1:在主服务器那边,执行:
flush logs;
show master status;
记下File, Position。
在从服务器端,执行:
slave stop;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000039',MASTER_LOG_POS=107;
slave start;
show slave status \G
******** 这样做会丢数据。"在主库执行show master status记下file和pos" 这个是最新的主库最新log和file,所以从库在这个位置进行同步的话,在挂掉期间的数据是无法恢复的
方法2: 优先用这个先试试
stop slave;
reset slave;
start slave;
问题3:Got fatal error 1236 from master when reading data from binary log: 'Slave can not handle replication events with the checksum that master is configured to log; the first event 'mysql-bin.000001' at 4, the last event read from './mysql-bin.000001' at 120, the last byte read from './mysql-bin.000001' at 120.'
方法:在主服务器中设置binlog_checksum =none;重启mysql
主服务器运行 show master status; 记录File,Position
从服务器运行:change master to master_host='27.148.190.82',master_user='test_zcfz',master_password='test_zcfz',master_log_file='mysql-bin.000002',master_log_pos=120;
再查看状态 show slave status; 可以了
问题4:mysql 主从 Last_Errno: 1146错误
方法:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n;
START SLAVE;
跳过主服务器中的接下来的 n 个事件。此命令对于由语句引起的复制终止有效。
此语句仅在从服务器线程没运行的时候有效。否则,它将产生一个错误。
************************************************************结束**********************************************************
问题:删除了一些日志,导致mysql启动不了。
解决清除所有的master.bin 日志即可,重新生成新的日志
或者关闭主从的配置,也可以开启mysql
查看主服务器的二进制日志的名称
通过使用命令行客户端连接到主服务器来启动主服务器上的会话,并通过执行以下FLUSH TABLES WITH READ LOCK语句来刷新所有表和阻止写语句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> show master status \G
在从服务器的 mysql 中执行如下语句
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master1',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
mysql> start slave;
在master上执行show binlog events命令,可以看到第一个binlog文件的内容。
mysql> show binlog events\G
*************************** 1. row ***************************
Log_name: mysql-bin.000001
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 107
Info: Server ver: 5.5.28-0ubuntu0.12.10.2-log, Binlog ver: 4
1 rows in set (0.00 sec)
在从站上暂停复制
您可以使用STOP SLAVE和 START SLAVE语句停止并启动从站上的复制 。
编辑主服务器的配置文件 my.cnf
,添加如下内容
编辑文件 vi /etc/my.cnf
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
创建日志目录并赋予权限
shell> mkdir /var/log/mysql
shell> chown mysql.mysql /var/log/mysql
重启服务
systemctl restart mysqld
或者
service mysql restart
注意:
如果省略server-id(或将其显式设置为默认值0),则主服务器拒绝来自从服务器的任何连接。
为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,
您应该在master my.cnf文件中使用以下配置项:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
确保在主服务器上 skip_networking
选项处于 OFF
关闭状态, 这是默认值。
如果是启用的,则从站无法与主站通信,并且复制失败。
show variables like '%skip_networking%';
主服务器中有数据
1.在主服务器中导出现有的数据
如果主数据库包含现有数据,则必须将此数据复制到每个从站。有多种方法可以实现:
mysqldump -u用户名 -p密码 --all-databases --master-data=1 > dbdump.db
mysqldump -uroot -p --databases kws >/tmp/db_out.sql (这个成功)
如果时间出现相差8小时
timestamp 的类型里面备份出来的数据,是不是少了8小时
解决方案就是在导出的时候加上参数 --skip-tz-utc,带上时区信息,就可以导出正确的时间。
mysqldump -uroot -p --skip-tz-utc --databases kws >/tmp/db_out.sql
这里的用户是主服务器的用户,如果不使用 --master-data
参数,则需要手动锁定单独会话中的所有表。
2.从主服务器中使用 scp
或 rsync
等工具,把备份出来的数据传输到从服务器中。
在主服务中执行如下命令
scp dbdump.db root@mysql-slave1:/root/
scp -P 10000 xxx.tar.gz root@xxx:/home/
这里的 mysql-slave1
需要能被主服务器解析出 IP 地址,或者说可以在主服务器中 ping
通。
3.配置从服务器,并重启
在从服务器
上编辑其配置文件 my.cnf
并添加如下内容:
[mysqld]
server-id=2
导入数据到从服务器,并配置连接到主服务器的相关信息
登录到从服务器上,执行如下操作
/*导入数据*/
mysql> source /root/fulldb.dump
source /root/db_out.sql (成功)
在从服务器配置连接到主服务器的相关信息
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master1', -- 主服务器的主机名(也可以是 IP)
MASTER_USER='repl', -- 连接到主服务器的用户
MASTER_PASSWORD='123'; == 到主服务器的密码
change master to master_host='27.148.190.82',
master_user='master用户名',master_password='master密码',
master_log_file='mysql-bin.000001',master_log_pos=0;
//注意不要断开,308数字前后无单引号。
启动从服务器的复制线程
mysql> start slave;
检查是否成功
在从服务上执行如下操作,加长从服务器端 IO线程和 SQL 线程是否是 OK
mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES
, 就表示成功
1、bin-log日志的使用 binary log
首先我们来认识几个与bin-log相关的MySQL命令:
flush logs; 会多一个最新的bin-log日志
show master status; 查看最后一个bin-log日志的相关信息
reset master; 清空所有的bin-log日志
show slave status 查看
如果用vi打开二进制日志的乱码的,所以我们需要使用下面的命令进行打开:
/usr/local/mysql/bin/mysqlbinlog --no-defaults mysql-bin.000002
如果找不到my.cnf可以通过
mysql --help | grep my.cnf
linux下该文件在/etc/下。
1、登录到mysql查看binlog
只查看第一个binlog文件的内容
mysql> show binlog events;
查看指定binlog文件的内容
mysql> show binlog events in 'mysql-bin.000002';
***1.用工具会导致运行同步,记得不要使用工具运行命令,要写sql语句。 目前原因不明
邦华那边的教程。有空实践一下
摘自:https://cloud.tencent.com/developer/article/1842806
不停机搭建同步库
前提条件:
1、确认主库和从库的server-id必须不一致
2、主库log-bin = mysql-bin #开启binlog日志
执行步骤:
1、主库导出kws数据库
mysqldump -uroot -ppassword --single-transaction --master-data=2 --databases kwddfasas > databases.sql
2、打包压缩并拷贝到从库
tar -zcvf databases.sql.tar.gz databases.sql
scp databases.sql.tar.gz root@slave_ip:/root
3、在从库的服务器上解压缩
tar -zxvf databases.sql.tar.gz
mysql -uroot -p123 -e 'create database kws;'
#建议从库设置 set global max_allowed_packet=1024*1024*16
mysql -uroot -p123 kws < databases.sql
stop slave;
#其中master_log_file和master_log_pos就是上面通过master-data=2参数导出的,在sql文件里面开头部分 ,
#可以通过 head -25 databases.sql 找到对应的数值
change master to master_host='ip',master_user='root',master_port=3306,master_password='password',master_log_file='mysql-bin.file',master_log_pos=POS;
start slave;
show slave status\G;