[Linux]-MySQL主从复制
MySQL支持的复制类型:
1) 基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高;
2) 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍;
3) 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制;
MySQL主从复制的原理:
1) 在Master中每个事物更新数据完成之后,写入二进制日志中;
2) slave的I/O线程监控Master的二进制日志,一旦日志发生变化,就将变化的部分读取并写入到slave的中继日志中去;
3) slave中的SQL线程监控中继日志,一旦发生变化读取变化的内容,之后重放(重新执行一遍SQL语句),实现mysql数据的同步。
主MySQL服务器(master)------从MySQL服务器(slave)
配置
mount /dev/cdrom /mnt/ //挂载光盘使用yum
1、安装yum,把需要的安装包放在服务器里面,yum会自动安装依赖关系
[root@bogon ~]# rm -rf /etc/yum.repos.d/* [root@bogon ~]# vim /etc/yum.repos.d/yum.repo
[yum] name=yum install baseurl=file:///mnt/ enabled=1 gpgcheck=0
2、安装mysql服务器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/bin/bash #安装Mysql服务 #初始化当前所处的路径 pwd_dir=`pwd` #######################[初始化变量]####################### #mysql源码包的名称 mysql_package_name='mysql-5.5.22.tar.gz' #cmake源码包的名称 cmake_package_name='cmake-2.8.6.tar.gz' #mysql安装路径 mysql_install='/usr/local/mysql' #mysql解压出源码包目录的名称 mysql_package_dir='mysql-5.5.22' #cmake解压出源码包目录的名称 cmake_pachage_dir='cmake-2.8.6' #源码包解压存放路径 code_package_dir='/usr/src/' #依赖包的文件名称 subjoin_package_file='ncurses-devel-5.7-3.20090208.el6.x86_64.rpm' ###########################[END]############################ #卸载rpm方式的安装的mysql服务 rpm -e mysql-server --nodeps &> /dev/null #检查依赖包 rpm -q ncurses-devel &> /dev/null if [ $? -ne 0 ] then rpm -ih $subjoin_package_fiel --nodeps fi #编译安装cmake tar zxvf $cmake_package_name -C $code_package_dir &> /dev/null cd $code_package_dir$cmake_pachage_dir ./configure &> /dev/null gmake &> /dev/null gmake install &> /dev/null cd $pwd_dir #编译安装msyql tar zxf $mysql_package_name -C $code_package_dir &> /dev/null cd $code_package_dir$mysql_package_dir cmake -DCMAKE_INSTALL_PREFIX=$mysql_install -DSYSCONFDIR=/etc/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWHIT_CHARSETS=all &> /dev/null make &> /dev/null make install &> /dev/null #配置msyql userdel mysql &> /dev/null useradd -M -s /sbin/nologin mysql &> /dev/null chown -R mysql:mysql $mysql_install &> /dev/null cp -f ${mysql_install}/support-files/my-medium.cnf /etc/my.cnf ln -s ${mysql_install}/bin/* /usr/local/bin/ cp ${mysql_install}/support-files/mysql.server /etc/rc.d/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on #初始化mysql $mysql_install/scripts/mysql_install_db --user=mysql --basedir=$mysql_install --datadir=${mysql_install}/data/ &> /dev/null service mysqld start &> /dev/null echo 'mysql install successful'
3、配置主要的MySQL服务器(master)
修改mysql的配置文件
[root@bogon ~]# vim /etc/my.cnf ...... //省略部分配置内容 # Replication Master Server (default) # binary logging is required for replication log-bin=master-bin //修改 server-id = 1 //主服务器,数字越小等级越高 log-slave-updates=true //修改
[root@bogon ~]# service mysqld restart //重启服务
主服务器登录MySQL给从服务器同步的权限
[root@bogon ~]# mysql -u root -p
mysql> grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123.com'; mysql> flush privileges; //强制刷新
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 | 338 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
其中File列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器的时候需要。
Slave应从该点在Master上进行新的更新
配置mysql从服务器(slave)
server-id = 2 //修改,要低于主mysql,更不能一样 relay-log=relay-log-bin //添加 relay-log-index=slave-relay-bin.index //添加
[root@bogon ~]# service mysqld restart //重启服务
登录MySQL,配置同步
按主服务器的file信息和Position位置号更改下面命令中的master_log_file和master_log_pos参数;
[root@bogon ~]# mysql -u root -p mysql> change master to master_host='192.168.1.9',
master_user='myslave',master_password='123.com',
master_log_file='master-bin.000001',
master_log_pos=338;
mysql> start slave; //开始实时同步
mysql> show slave status\G; //查看同步的状态信息 *************************** 1. row *************************** Slave_IO_State: Connecting to master Master_Host: 192.168.1.9 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 338 Relay_Log_File: relay-log-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Connecting 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: 338 Relay_Log_Space: 107 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: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 2003 Last_IO_Error: error connecting to master 'myslave@192.168.1.9:3306' - retry-time: 60 retries: 86400 Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0
验证
在主服务器上创建一个库,然后在从服务器上刷,就可以看到我们所创建的库
master-bin.000001 是一个二进制的文件,里面存放的是我们创建库写入的sql语句
我们可以用mysqlbinlog命令可以查看mysql的二进制日志文件,后面跟路径