数据库损坏了(业务不能使用数据库)
缘由:mysql
解决方案:linux
复制是MySQL的一项功能,容许服务器将更改从一个实例复制到另外一个实例。web
异步复制过程
整体来讲,复制有3个步骤:sql
两台主机安装mysql 5.6
注意在两台主机的配置文件中/etc/my.cnf中须要添加server-id=
参数。shell
建立复制用户数据库
grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
初始化从库安全
[root@db01 ~]# mysqldump -uroot -poldboy123 -A -F > /tmp/server.sql [root@db01 ~]# scp /tmp/server.sql 10.0.0.8:/tmp 在从库中source执行
开启主从复制服务器
mysql> mysql> show master; +----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------+----------+--------------+------------------+-------------------+ | log-bin.000013 | 120 | | | | +----------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
mysql> change master to master_host='10.0.0.51', master_port=3306, master_user='repl', master_password='123', master_log_file='log-bin.000013', master_log_pos=120;
注意:也能够设置relay-bin的名称。网络
检查状态架构
start slave; show slave status\G
成功的标志是:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.0.51 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: log-bin.000014 Read_Master_Log_Pos: 120 Relay_Log_File: web01-relay-bin.000002 Relay_Log_Pos: 281 Relay_Master_Log_File: log-bin.000014 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 120 Relay_Log_Space: 454 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: d4519488-d005-11e7-a4ac-000c2924dc94 Master_Info_File: /application/mysql-5.6.38-linux-glibc2.12-x86_64/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec)
Slave_*_Running:
主服务器日志坐标:
中继日志坐标:
Last_IO_Error、Last_SQL_Error:
+分别致使I/O 线程或SQL 线程中止的最新错误的错误消息。在正常复制过程当中,这些字段是空的。若是发生错误并致使消息显示在以上任一字段中,则错误值也显示在错误日志中。
Last_IO_Errno、Last_SQL_Errno:
从库binlog落后于主库
Master_Log_File: log-bin.000014 Read_Master_Log_Pos: 120
从库的logbin比主库的logbin慢的缘由:
【扩展】
延时节点概念:是SQL线程延时,不是IO线程延时。
解决方法:
stop slave; set global sql_slave_skip_counter = 1; start slave;
也能够在配置文件中跳过错误号码:
[mysqld] slave-skip-errors = 1032,1062,1007
stop slave; #<==临时中止同步开关。 set global sql_slave_skip_counter= 1 ; #<==将同步指针向下移动一个,若是屡次不一样步,能够重复操做。 start slave; /etc/my.cnf slave-skip-errors = 1032,1062,1007
备份
问题:
若是从库只是做为备份服务器使用,那么主库的压力会增长,由于全部的业务都在主库进行读写(dump线程读取并发送给binlog)
解决方法:
性能
相似于一主一从的部署
不一样之处在于主从之间多了一个中间服务器
[mysqld] basedir = /application/mysql/ datadir = /application/mysql/data/ socket = /application/mysql/tmp/mysql.sock character_set_server=utf8 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES server-id = 2 log-bin=/tmp/log-bin binlog-format=row autocommit=1 log-slave-updates [client] socket = /application/mysql/tmp/mysql.sock
在中间服务器的my.cnf文件中须要开启binlog并添加log-slave-updates
参数,表示强制刷新binlog,不然binlog日志不会刷新。
至关于作了两套主从。
reset slave;
重置slave(关闭状态)
复制延时是在SQL线程的层面进行控制,不容许SQL线程实时的执行relay log中的操做。
stop slave;
change master to master_delay = 30; #单位是秒
start slave;
结果: ```shell mysql> show slave status\G SQL_Delay: 30 SQL_Remaining_Delay: NULL
生产场景中通常延时3-6小时
部署:
一、加载插件
主:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
从:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
二、查看是否加载成功:
show plugins;
三、启动:
主:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
只是临时启动,须要写入配置文件中。
四、重启从库上的IO线程
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
五、查看是否在运行
主:
show status like 'Rpl_semi_sync_master_status';
从:
show status like 'Rpl_semi_sync_slave_status';
MHA设计理念:
主服务器宕掉了,可是多台从服务器的数据和主服务器同步不完整,这时就须要整合多台从服务器中的同步的数据到新的主服务器中,尽可能保证数据的完整性。
中继日志(relay log):记录了events和position号
在执行的事务中打上一个惟一标签,这样就能够保证事务之间的连续性及惟一性
为了failover出现的更好的复制,5.6出现,5.7完善
GTID(Global Transaction ID)是对于一个已提交事务的编号,而且是一个全局惟一的编号。
它的官方定义以下:
GTID = source_id :transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29
[root@web01 ~]# cat /application/mysql/data/auto.cnf [auto] server-uuid=0b920fba-d0fa-11e7-aae4-000c292741de
注意:若是是克隆的mysql数据库,那么server-uuid相同会致使slave-IO没法启动,须要修改server-uuid
一、修改配置文件
主:
[mysqld] log_bin = /tmp/log-bin binlog-format = row basedir = /application/mysql/ datadir = /application/mysql/data socket = /application/mysql/tmp/mysql.sock server_id = 1 gtid-mode = on #启用gtid类型,不然就是普通的复制架构 enforce-gtid-consistency = true #强制GTID的一致性 log-slave-updates = 1 #slave更新是否记入日志 autocommit = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES character_set_server=utf8 [client] socket = /application/mysql/tmp/mysql.sock
从:
[mysqld] log_bin = /tmp/log-bin binlog-format=ROW basedir = /application/mysql/ datadir = /application/mysql/data/ server_id = 2 socket = /application/mysql/tmp/mysql.sock gtid-mode = on enforce-gtid-consistency = true log_slave_updates = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES character_set_server=utf8 autocommit = 1 [client] socket = /application/mysql/tmp/mysql.sock
注意:若是是新建的数据库能够不须要从库初始化;若是不是须要从库初始化,同步主从的结构属性
二、在主服务器添加复制用户
grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
三、在从服务器上设置change master
mysql> change master to master_host='10.0.0.51', master_port=3306, master_user='repl', master_password='123', master_auto_position=1;
四、开启slave
start slave;
五、查看效果
在主库中添加一个数据,查看master
mysql> show master status; +----------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------+----------+--------------+------------------+------------------------------------------+ | log-bin.000003 | 552 | | | ff185ff4-cec5-11e7-9c86-000c2924dc94:1-2 | +----------------+----------+--------------+------------------+------------------------------------------+ 1 row in set (0.00 sec)
再从库中查看slave:
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.0.51 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: log-bin.000003 Read_Master_Log_Pos: 552 Relay_Log_File: db02-relay-bin.000004 Relay_Log_Pos: 442 Relay_Master_Log_File: log-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 552 Relay_Log_Space: 1252 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: ff185ff4-cec5-11e7-9c86-000c2924dc94 Master_Info_File: /application/mysql-5.6.38/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: ff185ff4-cec5-11e7-9c86-000c2924dc94:1-2 Executed_Gtid_Set: ff185ff4-cec5-11e7-9c86-000c2924dc94:1-2 Auto_Position: 1 1 row in set (0.00 sec)