Linux下配置MySQL主从复制(r5笔记第13天)

MySQL的主从复制是自己一直想学习的一个实战经历,因为Oracle中的主从复制也是需要不少的配置选项,相比来说感觉重量级一些(数据量也重量级).今天试了一下,在本地的一台Linux虚拟机上简单模拟了一把,发现还是蛮有趣的。因为也是外行,所以为了快速达到效果,自己看了一个很早的视频,结果实际操作的时候,有好几个配置参数都已经没有了。看来还是需要静下心来慢慢做,在Windows上配置了一下,因为各种各样的原因,就是没有配置出来,个人还是喜欢Linux环境下弄,今天加了把劲总算有点苗头了。大体的步骤有几个,创建两个操作系统用户,加入dba组。在master库所在用户上安装MySQL在slave库所在的用户上安装MySQL配置主从复制关系启动slave检查首先来看看原理图,估计这个图都被共享得无处不在了。可以从图中看到主从复制的基本原理就是使用binlog来完成的。这个binlog(二进制日志)可以很灵活地解析出对应的sql语句来,基本上就是在slave端做一个类似回放的工作了。不过这个过程相对持续时间很短,数据量小,事务小的情况下,完全感觉不到延时。Linux下配置MySQL主从复制(r5笔记第13天)我们来看看怎么做吧。因为使用MySQL自己想尽量不取默认值,就没有选择rpm包安装和yum安装等方式,直接从网站上得到了Lib包。直接解压就能运行的。对于默认的端口3306自己就指定为1550,日志路径等配置都是通过手动完成,也算能够感受到MySQL在后台处理的时候那些是必要的。安装的过程很容易。在glibc多的解压文件的路径,我配置了一个MYSQL_BASE的变量,通过手工命令来安装。[[email protected] mysql-advanced-5.6.23-linux-glibc2.5-i686]$ lltotal 288-rw-r--r-- 1 mysql dba 120908 Apr 7 16:11 a.logdrwxr-xr-x 2 mysql dba 4096 Apr 5 15:41 bindrwxr-xr-x 2 mysql dba 4096 Apr 5 15:41 docsdrwxr-xr-x 3 mysql dba 4096 Apr 5 15:41 include-rw-r--r-- 1 mysql dba 102509 Jan 29 21:11 INSTALL-BINARYdrwxr-xr-x 3 mysql dba 4096 Apr 5 15:42 lib-rw-r--r-- 1 mysql dba 2729 Jan 29 21:11 LICENSE.mysqldrwxr-xr-x 4 mysql dba 4096 Apr 5 15:41 man-rw-r--r-- 1 mysql dba 1029 Apr 5 15:49 my.cnf-rw-r--r-- 1 mysql dba 1029 Apr 14 18:56 my-new.cnfdrwxr-xr-x 10 mysql dba 4096 Apr 5 15:41 mysql-test-rw-r--r-- 1 mysql dba 1449 Jan 29 21:11 READMEdrwxr-xr-x 2 mysql dba 4096 Apr 5 15:41 scriptsdrwxr-xr-x 28 mysql dba 4096 Apr 5 15:42 sharedrwxr-xr-x 4 mysql dba 4096 Apr 5 15:41 sql-benchdrwxr-xr-x 2 mysql dba 4096 Apr 5 15:45 support-files配置的profile变量如下:PATH=$PATH:$HOME/binexport MYSQL_BASE=/u02/mysql/mysql-advanced-5.6.23-linux-glibc2.5-i686export MYSQL_DATA=/u02/mysql/dataexport PATH=$PATH:$MYSQL_BASE/bin:$MYSQL_DATA然后运行命令安装,其实也就是初始化工作了,指定的端口是1550$MYSQL_BASE/scripts/mysql_install_db --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550然后我们启动mysql就可以了。启动的命令相对选项要多一些,我们不适用.cnf文件来配置了,纯手工方式来看看。$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin --log-error=/u02/mysql/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log --socket=/u02/mysql/mysqld_mst.sock --server-id=1 &这样在master端就搞定了。slave端的工作也是类似,或者如果偷懒自己也可以直接把解压包拷贝过去。如果安装初始化的时候就需要重新制定端口了,我们定位1551吧。先不配置slave,看能不能启动。$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1551 --log-bin=mysql_oel1_slv1_bin --log-error=/u02/mysqlslv1/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysqlslv1/log/slow_qeury.log --socket=/u02/mysqlslv1/mysql_slv1.sock 启动之后,验证无误,我们就可以开始配置了。主从配置相对来说还是很简单的,如果过多的规则要求,还是很容易的。在主库我们需要配置一个用户作为复制所用。mysql> grant replication slave on *.* to 'slaveuser'@'192.168.27.130' identified by 'slaveuser';Query OK, 0 rows affected (0.00 sec)这个新建用户在user中就有所体现了。mysql> select host,user,password from user;+----------------+-----------+-------------------------------------------+| host | user | password |+----------------+-----------+-------------------------------------------+| localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B || oel1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B || 127.0.0.1 | root | || ::1 | root | || % | test | || 192.168.27.130 | slaveuser | *7890E850D4C4DF85267DEC80307D6CCAEC115B2F |+----------------+-----------+-------------------------------------------+6 rows in set (0.00 sec)查看master的情况mysql> show master status;+-----------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+-----------------------+----------+--------------+------------------+-------------------+| mysql_oel1_bin.000004 | 520 | | | |+-----------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)然后到slave端,重新启动一下,配置一下server-id我们设置为2,指定端口为1551$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1551 --log-bin=mysql_oel1_slv1_bin --log-error=/u02/mysqlslv1/log/log_error.log --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysqlslv1/log/slow_qeury.log --socket=/u02/mysqlslv1/mysql_slv1.sock --server-id=2 &启动完成之后,运行下面的语句来在slave端配置就可以了,这个过程就如同一个db link的感觉。mysql> change master to master_host='192.168.27.130', master_user='slaveuser', master_password='slaveuser',master_port=1550;Query OK, 0 rows affected, 2 warnings (0.04 sec)mysql> start slave;Query OK, 0 rows affected (0.01 sec)启动之后。直接查看show slave status \G就能看到slave端的一个基本情况了。很可能由于操作原因,出现一些复制的问题,我们可以指定skip的范围,下面这样操作。mysql> stop slave;Query OK, 0 rows affected (0.01 sec)mysql> SET GLOBAL sql_slave_skip_counter =100;Query OK, 0 rows affected (0.02 sec)mysql> start slave;Query OK, 0 rows affected (0.01 sec)mysql> show slave status \G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.27.130 Master_User: slaveuser Master_Port: 1550 Connect_Retry: 60 Master_Log_File: mysql_oel1_bin.000005 Read_Master_Log_Pos: 436 Relay_Log_File: oel1-relay-bin.000010 Relay_Log_Pos: 288 Relay_Master_Log_File: mysql_oel1_bin.000005 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: 98 Exec_Master_Log_Pos: 436 Relay_Log_Space: 628 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: 0Master_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: 02c8b5e4-e295-11e4-8db2-000c296415de Master_Info_File: /u02/mysqlslv1/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: 01 row in set (0.00 sec)然后我们在master端删除一个表new,可以从slave端看不到这个表了。创建之前,slave中的表mysql> show tables;+----------------+| Tables_in_test |+----------------+| innodb_test || myisam_test || new || new_test || test3 || test4 |+----------------+6 rows in set (0.00 sec)创建之后,马上查看,很快就同步了。mysql> show tables;+----------------+| Tables_in_test |+----------------+| innodb_test || myisam_test || new_test || test3 || test4 |+----------------+5 rows in set (0.00 sec)然后依次类推,很轻松就在十多分钟内又弄了一套slave环境。总体感觉就是轻巧和简便。