Mysql主从同步部署
概述
1、Mysql主从同从优点
在从服务器可以执行查询工作,降低主服务器压力。
在从主服务器进行备份,避免备份期间影响主服务器服务。
当主服务器出现问题时,可以切换到从服务器。
2、Mysql复制概述
复制过程中一台服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
Mysql使用3个线程来执行复制功能,其中两个线程(Sql线程和IO线程)在从服务器,另外一个线程(IO线程)在主服务器。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程执行更新的远远滞后。
一、Mysql安装(主从)
1、环境介绍
主服务器:
IP地址:192.168.0.10 主机名称:masterdb01
从服务器:
IP地址:192.168.0.11 主机名称:slavedb02
2、安装依赖包
[root@masterdb01 ~]# yum -y install gcc perl-DBI perl-DBD-MySQL unixODBC ncurses-devel
3、安装Mysql
[root@masterdb01 ~]# tar xvf mysql-5.1.44.tar.gz -C /usr/local/src/
[root@masterdb01 ~]# cd /usr/local/src/mysql-5.1.44/
[root@masterdb01 ~]# useradd mysql -M -s /sbin/nologin
[root@masterdb01 mysql-5.1.44]# vim configure
注释$RM "$cfgfile" 这一行(否则编译时会报错)
[root@masterdb01 mysql-5.1.44]# ./configure --prefix=/usr/local/mysql-5.1.44 --with-unix-socket-path=/usr/local/mysql-5.1.44/data/mysql.sock --localstatedir=/usr/local/mysql-5.1.44/data/ --without-debug --enable-thread-safe-client --enable-assembler --enable-profiling --enable-community-features --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-extra-charsets=all --with-plugins=innobase --with-mysqld-user=mysql --without-embedded-server --with-server-suffix=-community
[root@masterdb01 mysql-5.1.44]# make
[root@masterdb01 mysql-5.1.44]# make install
[root@masterdb01 mysql-5.1.44]# chown -R root.mysql /usr/local/mysql-5.1.44/
[root@masterdb01 mysql-5.1.44]# ./scripts/mysql_install_db --user=mysql
[root@masterdb01 mysql-5.1.44]# cp support-files/my-medium.cnf /etc/my.cnf
[root@masterdb01 mysql-5.1.44]# chown -R mysql.mysql /usr/local/mysql-5.1.44/data/
[root@masterdb01 mysql-5.1.44]# cd /usr/local/mysql-5.1.44/libexec/
[root@masterdb01 libexec]# cp mysqld mysqld.old
[root@masterdb01 libexec]# strip mysqld
[root@masterdb01 libexec]# echo "/usr/local/mysql-5.1.44/lib/mysql/" >> /etc/ld.so.conf
[root@masterdb01 libexec]# ldconfig
[root@masterdb01 libexec]# /usr/local/mysql-5.1.44/bin/mysqld_safe &
[root@masterdb01 libexec]# /usr/local/mysql-5.1.44/bin/mysqladmin -u root password "redhat"
[root@masterdb01 libexec]# export PATH=$PATH:/usr/local/mysql-5.1.44/bin/
[root@masterdb01 libexec]# echo "export PATH=$PATH:/usr/local/mysql-5.1.44/bin/" >> /etc/profile
[root@masterdb01 libexec]# echo "/usr/local/mysql-5.1.44/bin/mysqld_safe &" >> /etc/rc.local
[root@masterdb01 libexec]# /usr/local/mysql-5.1.44/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.44-community-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql>
到此mysql安装完毕
注:上述配置主从机器都需要配置。
二、Mysql主从配置
1、主服务器配置
1、创建同步用户
mysql> grant replication slave on *.* to 'replication'@'192.168.0.11' identified by 'replication';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Slave上测试: mysql -h 192.168.0.10 -u replication -preplication
2、修改主服务器mysql主配置文件
首先关闭数据库在修改
[mysqld]
socket = /usr/local/mysql-5.1.44/data/mysql.sockserver-id = 1 log-bin=mysql-bin binlog_format=mixed
Log-slave-updates
log = /var/log/mysql.log
log-error = /var/log/mysql_error.log
long_query_time = 2
log-slow-queries = /var/log/mysql_slow.log
log_queries_not_using_indexes
注释如下三行
#log-bin=mysql-bin
#binlog_format=mixed
#server-id = 1
配置文件详解:
server-id=1 代表主库,2代表从库 配置一个唯一的ID编号,编号范围1-32
log-bin=mysql-bin 这个是必须的表示开启二进制日志计入。
bin-do-db=test 需要同步的数据库,如果没有本行 表示同步所有的数据库。
binlog-ignore-db=test1 表示不需要同步的数据库名。
log-slave-updates 这个参数一定要加上,否则不会给更新的记录写到二进制文件里(不打开也可以,只是开了以后你可以在从上时时日志恢复)。
expire_logs_days=5 (为避免日志文件过大,设置过期时间为5天超过5天自动删除,一般生产系统设置为0) 。
slave-skip-errors 跳过错误,继续执行复制操作。
重启mysql
[root@masterdb01 ~]# mysqladmin shutdown -u root -predhat
[root@masterdb01 ~]# /usr/local/mysql-5.1.44/bin/mysqld_safe &
启动时报错
mysqld_safe mysqld from pid file /usr/local/mysql-5.1.44/data/masterdb01.pid ended
[root@masterdb01 ~]# mysql -u root -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/usr/local/mysql-5.1.44/data/mysql.sock' (2)
问题解决
原来是mysql用户和权限的问题,重建mysql用户重新修改权限
[root@masterdb01 ~]# useradd mysql -M -s /sbin/nologin
[root@masterdb01 ~]# chown -R root.mysql /usr/local/mysql-5.1.44/
[root@masterdb01 ~]# chown -R mysql.mysql /usr/local/mysql-5.1.44/data/
再从新启动mysql ok问题解决
Mysql启动时可以查看日志有没有报错
[root@masterdb01 ~]# tailf /usr/local/mysql-5.1.44/data/masterdb01.err
3、数据同步
第一次同步之前,确保两边的数据是同步的。
拷贝时首先需要关闭mysql数据库。
2、从服务器配置
1、修改从服务器mysql主配置文件
首先关闭数据库在修改
[root@slavedb02 ~]# vim /etc/my.cnf
socket = /usr/local/mysql-5.1.44/data/mysql.sock
server-id = 2
log-bin=mysql-bin
binlog_format=mixed
log-slave-updates
log = /var/log/mysql.log
log-error = /var/log/mysql_error.log
long_query_time = 2
log-slow-queries = /var/log/mysql_slow.log
log_queries_not_using_indexes
注释如下三行
#log-bin=mysql-bin
#binlog_format=mixed
#server-id = 1
重新启动mysql
[root@slavedb02 ~]# mysqld_safe &
2、指定同步位置(change master)
主服务器查看
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
从服务器设置
mysql> change master to master_host='192.168.0.10',master_user='replication',master_password='replication',master_log_file='mysql-bin.000003',master_log_pos=106;
Query OK, 0 rows affected (0.03 sec)
3、启动从服务器线程
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
查看从服务器状态
mysql> show slave status\G;
Slave_IO_Running: No
Slave_SQL_Running: Yes
问题处理
查看原来主从两边的数据不一直导致的
主服务器上 /usr/local/mysql-5.1.44/data下多一个masterdb01.err文件
将其拷贝到从服务器修改属主属组
mysql> slave stop;
mysql> slave start;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok问题解决
3、验证过程
1、在主服务器创建库和表
mysql> create database test1;
Query OK, 1 row affected (0.03 sec)
mysql> use test1;
Database changed
mysql> create table name (id int(4),name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into name values (1,'test');
Query OK, 1 row affected (0.00 sec)
mysql> select * from name;
+------+------+
| id | name |
+------+------+
| 1 | test |
+------+------+
1 row in set (0.00 sec)
2、在从服务器确认
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| test1 |
+--------------------+
4 rows in set (0.00 sec)
mysql> use test1;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| name |
+-----------------+
1 row in set (0.03 sec)
mysql> select * from name;
+------+------+
| id | name |
+------+------+
| 1 | test |
+------+------+
1 row in set (0.00 sec)
mysql>
Ok同步
三、Mysql双向同步配置
从服务器配置
1、在从服务器创建同步帐号
mysql> grant replication slave on *.* to 'replication'@'192.168.0.10' identified by 'replication';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Master上测试: mysql -h 192.168.0.11 -u replication -preplication
2、指定同步位置
从服务器上查看
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
主服务器配置
mysql> change master to master_host='192.168.0.11',master_user='replication',master_password='replication',master_log_file='mysql-bin.000005',master_log_pos=106;
Query OK, 0 rows affected (0.03 sec)
3、启动服务器线程
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
查看从服务器状态
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4、测试
在从库上创建库,看主是否可以正常同步
四、日常维护
1、查看binlog是否开启
mysql> show variables like '%log%';
2、查看mysql的server_id
mysql> show variables like 'server_id';
3、查看所有二进制文件和大小
mysql> show binary logs;
删除二进制文件
mysql> purge binary logs to 'mysql-bin.0000010';
删除二进制文件mysql-bin.0000010,保留后面的。
4、查看mysql主的状态
mysql> show master status;
5、查看mysql从的状态
mysql> show slave status\G;
确认Slave_IO 和 Slave_SQL是否都为yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6、mysql启动关闭
[root@slavedb02 ~]# mysqladmin shutdown -u root -predhat
[root@slavedb02 ~]# mysqld_safe &
7、Slave线程启动和关闭
mysql> slave stop;
mysql> slave start;