mysql主从配置

2017/07/05 mysql

1、主从服务器分别作以下操作: 1.1、版本一致 1.2、初始化表,并在后台启动mysql 1.3、修改root的密码

2、修改主服务器master: #vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[必须]启用二进制日志 server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

===================== log-bin=mysql-bin server-id=1 innodb_flush_log_at_trx_commit=1 sync_binlog=1 binlog-do-db=wordpress binlog_ignore_db=mysql

server-id=1中的1可以任定义,只要是唯一的就行。 binlog-do-db=wordpress是表示只备份wordpress。 binlog_ignore_db=mysql表示忽略备份mysql。 不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。

3、修改从服务器slave: #vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[不是必须]启用二进制日志 server-id=226 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

=========================

配置slave Slave的配置与master类似,你同样需要重启slave的MySQL。如下: log_bin = mysql-bin server_id = 2 relay_log = mysql-relay-bin log_slave_updates = 1 read_only = 1 server_id是必须的,而且唯一。slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果slave为其它slave的master,必须设置bin_log。在这里,我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。

relay_log配置中继日志, log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处)。

有些人开启了slave的二进制日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误的配置。所以,尽量使用read_only,它防止改变数据(除了特殊的线程)。但是,read_only并是很实用,特别是那些需要在slave上创建表的应用。

4、重启两台服务器的mysql /etc/init.d/mysql restart

5、在主服务器上建立帐户并授权slave: #/usr/local/mysql/bin/mysql -uroot -pmttang
mysql>GRANT REPLICATION SLAVE ON . to ‘mysync’@’%’ identified by ‘q123456’; //一般不用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=’10.0.0.35’,master_user=’root’,master_password=’123456’,master_log_file=’mysql-bin.000001’,master_log_pos=437; //注意不要断开,308数字前后无单引号。

Mysql>start slave; //启动从服务器复制功能

============================ 接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:

mysql> CHANGE MASTER TO MASTER_HOST=’server1’,

-> MASTER_USER='repl',

-> MASTER_PASSWORD='p4ssword',

-> MASTER_LOG_FILE='mysql-bin.000001',

-> MASTER_LOG_POS=0;

MASTER_LOG_POS的值为0,因为它是日志的开始位置。

8、检查从服务器复制功能状态:

mysql> show slave status\G

mysql> SHOW SLAVE STATUS\G ********* 1. row ************* Slave_IO_State: Waiting for master to send event Master_Host: 10.0.0.35 Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 437 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 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: 437 Relay_Log_Space: 527 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: b97d2ddb-e1d8-11e5-b720-02420a000023 Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates 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 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)

=============

你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接: 在master上输入show processlist\G;

MASTER:

mysql> show processlist\G; ********* 1. row *********** Id: 3 User: root Host: localhost db: NULL Command: Query Time: 0 State: starting Info: show processlist *********** 2. row ************* Id: 4 User: root Host: 10.0.0.36:50445 db: NULL Command: Binlog Dump Time: 873 State: Master has sent all binlog to slave; waiting for more updates Info: NULL 2 rows in set (0.00 sec)

=================== SLAVE

mysql> show processlist\G; ********* 1. row *********** Id: 2 User: root Host: localhost db: NULL Command: Query Time: 0 State: starting Info: show processlist *********** 2. row *********** Id: 4 User: system user Host: db: NULL Command: Connect Time: 919 State: Waiting for master to send event Info: NULL *********** 3. row ************* Id: 5 User: system user Host: db: NULL Command: Connect Time: 917 State: Slave has read all relay log; waiting for more updates Info: NULL 3 rows in set (0.00 sec)

9、主从服务器测试:

主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:

mysql> create database hi_db; Query OK, 1 row affected (0.00 sec)

mysql> use hi_db; Database changed

mysql> create table hi_tb(id int(3),name char(10)); Query OK, 0 rows affected (0.00 sec)

mysql> insert into hi_tb values(001,’bobu’); Query OK, 1 row affected (0.00 sec)

mysql> show databases; +——————–+ | Database | +——————–+ | information_schema | | hi_db | | mysql | | test | +——————–+ 4 rows in set (0.00 sec)

从服务器Mysql查询:

mysql> show databases;

+——————–+ | Database | +——————–+ | information_schema | | hi_db | //I’M here,大家看到了吧 | mysql | | test |

+——————–+ 4 rows in set (0.00 sec)

mysql> use hi_db Database changed mysql> select * from hi_tb; //查看主服务器上新增的具体数据 +——+——+ | id | name | +——+——+ | 1 | bobu | +——+——+ 1 row in set (0.00 sec)

2.5、添加新slave服务器

假如master已经运行很久了,想对新安装的slave进行数据同步,甚至它没有master的数据。 此时,有几种方法可以使slave从另一个服务开始,例如,从master拷贝数据,从另一个slave克隆,从最近的备份开始一个slave。Slave与master同步时,需要三样东西: (1)master的某个时刻的数据快照; (2)master当前的日志文件、以及生成快照时的字节偏移。这两个值可以叫做日志文件坐标(log file coordinate),因为它们确定了一个二进制日志的位置,你可以用SHOW MASTER STATUS命令找到日志文件的坐标; (3)master的二进制日志文件。

可以通过以下几中方法来克隆一个slave: (1) 冷拷贝(cold copy) 停止master,将master的文件拷贝到slave;然后重启master。缺点很明显。 (2) 热拷贝(warm copy) 如果你仅使用MyISAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。 (3) 使用mysqldump 使用mysqldump来得到一个数据快照可分为以下几步: <1>锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下: mysql> FLUSH TABLES WITH READ LOCK; <2>在另一个连接用mysqldump创建一个你想进行复制的数据库的转储: shell> mysqldump –all-databases –lock-all-tables >dbdump.db <3>对表释放锁。 mysql> UNLOCK TABLES;

10、完成: 编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。


Search

    Table of Contents