MySQL主从复制

 MySQL主从复制介绍

1.1.1 作用
1.数据安全(异机实时备份)
2.持续服务(宕机接管)
1.1.2 主从复制实现基本原理
1.自带功能。
2.通过把主库的binlog传送到从库,从新解析应用到从库。
1.1.3 复制架构
1.2 MySQL主从复制的企业应用场景
应用场景1:从服务器作为主服务器的实时数据备份
应用场景2:主从服务器实现读写分离,从服务器实现负载均衡
应用场景3:把多个从服务器根据业务重要性进行拆分访问

1.3 MySQL主从复制原理介绍
1、开启binlog日志,通过把主库的binlog传送到从库,从新解析应用到从库。
2、复制需要3个线程完成,5.6从库多个sql。
3、复制是异步的过程。
 主从复制是异步的逻辑的SQL语句级的复制。

主从复制实践

1、主库开启binlog日志

/etc/my.cnf:
log_bin = /application/mysql/logs/mcw01-bin
server-id = 52
从库调整(从库不开binlog)
server-id = 53
各自重启。
/etc/init.d/mysqld restart

[root@mcw01 ~]$ grep -v "^#" /etc/my.cnf|egrep "server_id|log_bin"   #主库
log_bin = /application/mysql/logs/mcw01-bin
server_id = 52
[root@mcw01 ~]$

[root@mcw02 ~]$ grep -v "^#" /etc/my.cnf|egrep "server_id|log_bin"  #从库
server_id = 53
[root@mcw02 ~]$ 


[root@mcw02 ~]$ /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@mcw02 ~]$ 

[root@mcw01 ~]$ /etc/init.d/mysqld start  
Starting MySQL. SUCCESS! 
[root@mcw01 ~]$ 

[root@mcw01 ~]$ mysql -uroot -p123456 -e "show variables like 'log_bin'"  #主库查看
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
[root@mcw01 ~]$ mysql -uroot -p123456 -e "show variables like 'server_id'"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 52    |
+---------------+-------+
[root@mcw01 ~]$ 

2、主库建立账号给从库用的

grant replication slave on *.* to rep@'172.16.0.%' identified by '123456';

[root@mcw01 ~]$ mysql -uroot -p123456
.....
mysql> grant replication slave on *.* to rep@'172.16.0.%' identified by '123456';
Query OK, 0 rows affected (0.23 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+--------+------------+
| user   | host       |
+--------+------------+
| root   | %          |
| root   | 127.0.0.1  |
| rep    | 172.16.0.% |
| rep    | 172.16.1.% |
| root   | ::1        |
|        | localhost  |
| backup | localhost  |
| root   | localhost  |
|        | mcw01      |
| root   | mcw01      |
+--------+------------+
10 rows in set (0.07 sec)

mysql> show grants for rep@'172.16.0.%';
+-------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@172.16.0.%                                                                                               |
+-------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'172.16.0.%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3、主库锁表备份

对主库锁表只读,当前窗口不能关闭
flush table with read lock;

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mcw-bin.000017 | 405 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
重开窗口导出数据。
mysqldump -A -B |gzip>/opt/bak.sql.gz

第一窗口解锁。
unlock table;

scp -rp /opt/bak.sql.gz root@172.16.1.53:/opt

不停库不锁表:定时任务。
mysqldump -A -B --master-data=2 |gzip>/opt/bak.sql.gz
数据量大 物理打包。

mysql> flush table with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "%timeout%";
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 10       |
| delayed_insert_timeout      | 300      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 50       |
| innodb_rollback_on_timeout  | OFF      |
| interactive_timeout         | 28800    |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| rpl_stop_slave_timeout      | 31536000 |
| slave_net_timeout           | 3600     |
| wait_timeout                | 28800    |
+-----------------------------+----------+
12 rows in set (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mcw01-bin.000010 |      611 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


[root@mcw01 ~]$ mysqldump -uroot -p123456 -A -B |gzip>/opt/bak.sql.gz
Warning: Using a password on the command line interface can be insecure.
[root@mcw01 ~]$ ls /opt/bak.sql.gz 
/opt/bak.sql.gz
[root@mcw01 ~]$ 


mysql> unlock table;
Query OK, 0 rows affected (0.00 sec)

mysql> \q
Bye
[root@mcw01 ~]$ scp  -rp /opt/bak.sql.gz root@172.16.0.12:/opt
root@172.16.0.12's password: 
bak.sql.gz                                                                                                        100%  176KB   5.1MB/s   00:00    
[root@mcw01 ~]$ 

4、从库恢复

gzip -d bak.sql.gz
mysql <bak.sql

[root@mcw02 ~]$ gzip -d /opt/bak.sql.gz 
[root@mcw02 ~]$ ls /opt/
bak.sql
[root@mcw02 ~]$ mysql -uroot -p123456 </opt/bak.sql 
Warning: Using a password on the command line interface can be insecure.
[root@mcw02 ~]$ mysql -uroot -p123456 -e 'select * from mcw.test;'
Warning: Using a password on the command line interface can be insecure.
+----+------------------+
| id | name             |
+----+------------------+
|  1 | mcw              |
|  2 | xiaoma           |
|  3 | inca             |
|  4 | zuma             |
|  5 | kaka             |
|  6 | mingming         |
|  7 | baibai           |
|  8 | mcw_inc1_1       |
|  9 | mcw_inc1_2       |
| 10 | mcw_zengliang2_1 |
| 11 | mcw_zengliang2_2 |
+----+------------------+
[root@mcw02 ~]$ 

5、从库 change master

文件和日志位置,是前面show master status 查看的,

CHANGE MASTER TO
MASTER_HOST='172.16.0.11',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mcw01-bin.000010',
MASTER_LOG_POS=611;

 

也可以不用进入mysql的命令行执行

[root@mcw02 ~]$ mysql -uroot -p123456 <<EOF
> CHANGE MASTER TO  
> MASTER_HOST='172.16.0.11', 
> MASTER_PORT=3306,
> MASTER_USER='rep', 
> MASTER_PASSWORD='123456', 
> MASTER_LOG_FILE='mcw01-bin.000010',
> MASTER_LOG_POS=611;
> EOF
Warning: Using a password on the command line interface can be insecure.
[root@mcw02 ~]$ 
[root@mcw02 ~]$ ls /application/mysql/data/
auto.cnf  ib_logfile0  master.info  mcw02.pid               mcw02-relay-bin.index  mysql               relay-log.info
ibdata1   ib_logfile1  mcw          mcw02-relay-bin.000001  mcw_db2                performance_schema  test
[root@mcw02 ~]$ cat /application/mysql/data/master.info  上面命令的实际作用是将信息写入从库这个文件中
23
mcw01-bin.000010
611
172.16.0.11
rep   #用户
123456 #密码等信息
3306
60
0





0
1800.000

0

86400


0
[root@mcw02 ~]$ 

6、启动从库同步开关并测试主从复制

mysql> start slave;
mysql> show slave status\G

[root@mcw02 ~]$ mysql -uroot -p123456 -e 'start slave;'
Warning: Using a password on the command line interface can be insecure.
[root@mcw02 ~]$ mysql -uroot -p123456 -e "show slave status\G"|egrep -i "IO_Running|SQL_Running:|Seconds_Behind_Master"
Warning: Using a password on the command line interface can be insecure.
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
        Seconds_Behind_Master: 0
[root@mcw02 ~]$ 
[root@mcw02 ~]$ mysql -uroot -p123456 -e "show slave status\G"
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.0.11
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mcw01-bin.000010
          Read_Master_Log_Pos: 611
               Relay_Log_File: mcw02-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mcw01-bin.000010
             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: 611
              Relay_Log_Space: 456
              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: 52
                  Master_UUID: 0598e4cb-9858-11ec-9444-000c294f4092
             Master_Info_File: /application/mysql/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
[root@mcw02 ~]$ 


[root@mcw01 ~]$ mysql -uroot -p123456 -e "create database mcw_zhucong;"  #主库创建
Warning: Using a password on the command line interface can be insecure.

[root@mcw02 ~]$ mysql -uroot -p123456 -e "show databases;"  #从库查询到数据库mcw_zhucong
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mcw                |
| mcw_db2            |
| mcw_zhucong        |
| mysql              |
| performance_schema |
| test               |
+--------------------+
[root@mcw02 ~]$ 

查看主从线程
[root@mcw01 ~]$ mysql -uroot -p123456 -e "show processlist\G;"
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
Id: 7
User: rep
Host: 172.16.0.12:15729
db: NULL
Command: Binlog Dump
Time: 1210
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 2. row ***************************
Id: 11
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: init
Info: show processlist
[root@mcw01 ~]$

 

[root@mcw02 ~]$ mysql -uroot -p123456 -e "show processlist\G;"
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row *************************** #io线程
Id: 5
User: system user
Host:
db: NULL
Command: Connect
Time: 1261
State: Waiting for master to send event
Info: NULL
*************************** 2. row *************************** #sql线程
Id: 6
User: system user
Host:
db: NULL
Command: Connect
Time: 217
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 14
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: init
Info: show processlist
[root@mcw02 ~]$

 

上一篇:《金三银四》27道MySQL经典面试题和参考解答


下一篇:MySQL优化