(迁移)mysql主从复制的使用笔记

主从复制(也称 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

(迁移)mysql主从复制的使用笔记_第1张图片

从服务器运行: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)
  • Log_name 是二进制日志文件的名称,一个事件不能横跨两个文件
  • Pos 这是该事件在文件中的开始位置
  • Event_type 事件的类型,事件类型是给slave传递信息的基本方法,每个新的binlog都以Format_desc类型开始,以Rotate类型结束
  • Server_id 创建该事件的服务器id
  • End_log_pos 该事件的结束位置,也是下一个事件的开始位置,因此事件范围为Pos~End_log_pos - 1
  • Info 事件信息的可读文本,不同的事件有不同的信息

在从站上暂停复制

您可以使用STOP SLAVE和 START SLAVE语句停止并启动从站上的复制 。


 

主服务器中有数据

  1. 在主服务器上,您必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。

编辑主服务器的配置文件 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工具创建要复制的所有数据库的转储。这是推荐的方法,尤其是在使用时 InnoDB。
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.从主服务器中使用 scprsync 等工具,把备份出来的数据传输到从服务器中。

在主服务中执行如下命令

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;
    
    
    

你可能感兴趣的:(个人笔记,mysql)