相关学习:

环境:centos6.4+mysql-5.5.37                     mysql5.5以后都用cmake编译,需要安装cmake

因为mysql环境包蛮多,我们需要指定yum源。用163或官方yum源也是可以的
安装目录:/usr/local/mysql/
数据目录:/data/mysql/data/
二进制日志:/data/msyql/binlog/
relay日志:/data/mysql/relaylog/
配置文件:/data/mysql/my.cnf
mysql.sock文件:/data/mysql/mysql.sock
1、将cmake和mysql源码包弄到 /data/soft 目录内,配置好yum源
cmake下载地址    http://www.cmake.org/files/v2.8/cmake-2.8.12.2.tar.gz
mysql下载地址    ftp://mirror.switch.ch/mirror/my ... mysql-5.5.37.tar.gz

#!/bin/bash#时间:2014-5-4#指定源码包目录、mysql数据目录、mysql安装目录MYSQL_DIR="/data/soft"DATA_DIR="/data/mysql/data"BASE_DIR="/usr/local/mysql"echo "please input mysql version:"read VERSIONecho “"Your mysql version is mysql-$VERSION.tar.gz"if [ -e "$MYSQL_DIR/mysql-$VERSION.tar.gz" ]thenecho "Please waitting"sleep 3#Install mysql package dependent.yum -y install gcc gcc-c++ gcc-g77 autoconf openssl zlib* fiex* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel* &&#Install cmakeecho "The system is be install cmakemplease waitting..."sleep 3tar -zxvf $MYSQL_DIR/cmake-2.8.12.2.tar.gz -C $MYSQL_DIR &&cd $MYSQL_DIR/cmake-2.8.12.2 &&./configure --prefix=/usr/local/cmake && make && make install &&#creating mysql account and group/usr/sbin/groupadd mysql &&/usr/sbin/useradd -s /sbin/nologin -g mysql -M mysql &&#Install mysql.tar -zxvf $MYSQL_DIR/mysql-$VERSION.tar.gz -C $MYSQL_DIRcd $MYSQL_DIR/mysql-$VERSIONecho "PATH=$PATH:/usr/local/cmake/bin" >> /etc/profile && source /etc/profile#编译mysql,可以按自己需求编译cmake $MYSQL_DIR/mysql-$VERSION-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-DYSQL_TCP_PORT=3306-DMYSQL_DATADIR=$DATA_DIR-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock-DWITH_MYISAM_STORAGE_ENGING=1-DWITH_INNOBASE_STORAGE_ENGINE=1  -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci  -DEXTRA_CHARSETS=all -DWITH_DEBUG=0make && make install &&mkdir -p $DATA_DIRmkdir -p `dirname $DATA_DIR`/binlogmkdir -p `dirname $DATA_DIR`/relaylogcp $MYSQL_DIR/mysql-$VERSION/support-files/my-small.cnf.sh `dirname $DATA_DIR`/my.cnfcp $MYSQL_DIR/mysql-$VERSION/support-files/mysql.server.sh /etc/init.d/mysqldchmod +x /etc/init.d/mysqldsed -i 's/^basedir=/basedir=\/usr\/local\/mysql/' /etc/init.d/mysqldsed -i 's/^datadir=/datadir=\/data\/mysql\/data/' /etc/init.d/mysqldsed -i 's/`@HOSTNAME@`/lqx.com/' /etc/init.d/mysqld#初始化mysqlsh /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=$DATA_DIR  &&/etc/init.d/mysqld startelseecho "Your input mysql version  is not in $MYSQL_DIR"fi

执行脚本一键安装mysql 

sh mysql_install.sh

最后进行检验

mysql -u root -p

mysql 数据库自动备份

[root@client100 ~]# vim backup.sh  # 备份脚本如下:    #! /bin/bash    # 进入mysqldump命令目录  cd /usr/bin/    # 设置备份的时间,备份信息存放文件,备份路径,压缩路径,备份的用户,密码,主机,端口,数据库  DD=`date +%y-%m-%d==%H:%M:%S`  LOGFILE=/var/lib/mysql/mysqlbackup.log  backup_dir=/var/lib/mysql/dbbackup/  zip_dir=/var/lib/mysql/zipdir/  dbusername=backup  dbpassword=kongzhong  host=127.0.0.1  port=3306  # port2=3307  database1=login  # database2=  # database3=    # 指定生成备份的文件名,压缩后的文件名  DumpFile="$database1"$(date +%y%m%d).dump  NewFile="$database1"$(date +%y%m%d).tgz    # 查看备份的目录是否存在,不存在建立,并修改为mysql权限,并将相应输出信息写入日志文件  echo "check directory..." >> $LOGFILE  if [ ! -d $backup_dir ] ;then    mkdir -p $backup_dir    chown mysql:mysql $backup_dir  fi  echo $DD " backup start..." >> $LOGFILE  echo $DD >>$LOGFILE  echo "backup "$database1" ..." >> $LOGFILE    # 备份数据库  ./mysqldump -h$host -P$port -u$dbusername -p$dbpassword  $database1 > $backup_dir$DumpFile    # 进入数据备份目录,压缩备份的文件,压缩完后删除dump文件  cd $backup_dir  tar czvf $NewFile $DumpFile >> $LOGFILE 2>&1  rm -rf $DumpFile    # 判断压缩存放目录是否存在,不存在,建立,修改权限,并将压缩过的备份文件移送到压缩目录  echo "moving zipfiles ..." >> $LOGFILE  cd $backup_dir  if [ ! -d $zip_dir ] ;then    mkdir -p $zip_dir    chown mysql:mysql $zip_dir  fi   mv *.tgz  $zip_dir    # 删除3天前的备份  #remove before 3 days  echo "remove before 3 days..." >> $LOGFILE  find $zip_dir -type f -mtime +3 -exec rm -f {} \;  echo "remove before 3 days OK" >>$LOGFILE    echo "backup over" >> $LOGFILE 2.给备份文件执行的权限[root@client100 ~]# chmod +x backup.sh3.先执行脚本测试,是否报错[root@client100 ~]# ./backup.sh4.如果测试正常,切换到mysql用户目录下,建立计划任务(假设每天凌晨3点备份)[root@client100 ~]# su - mysql# 下面就是建立计划任务(分 时 日 月 周 执行脚本的路径文件名)[mysql@client100 ~]#crontab -e0 3 * * * ./tmp/backup.sh# 如果计划任务建好后,使用下面命令可以看到[mysql@client100 ~]#crontab -l

远程连接mysql授权方法

在使用下面命令

mysql -u root -p -h 192.168.100.210 -P3306

#其中后边的 -P(大写) 用来指定远程主机mysql绑定端口,默认都是3306, -h 用来指定远程主机的IP.

    出现以下错误:

    ERROR 1130: Host '192.168.100.210' is not allowed to connect to this MySQL server

    解决方法:

可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"

wKiom1ONOnyiuWMpAAGuCkk1avc321.jpg

结果出现如下错误:

ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY' 

然后查看下数据库中host的信息如下:

wKioL1ONOvCCWwjfAACda4G-fms230.jpg

host已经有了%这个值,所以直接运行命令: 

flush privileges;

wKiom1ONO1mCfDDNAABKuilMolU588.jpg

下面就可以连接了。

使用了远程连接后在本地mysql服务器就不能管理root用户了,只能是匿名用户,要改变按照下面的步骤:

先在远程连接到mysql服务器

mysql> use mysql;

mysql> update user set host='localhost'where user='root';

mysql> select host from user where user='root';    #查看下host文件,发现原先的%已经变成localhost了

mysql> flush privileges;                   #这个命令是一定要输入的,不然不会生效

下面只能在mysql本地服务器用mysql -p 连接了。

使用mysql客户端工具远程管理mysql服务器

  1. 把mysql服务器设置成开启远程连接

    mysql> use mysql;

    mysql> update user set host='%'where user='rot';

    mysql> select host from user where user='root';

    mysql> flush privileges;

  2. 测试下是否成功

在本地测试:

mysql -u root -p -h 192.168.100.210 -P330

3.下载windows下远程连接工具

http://www.3000f.com/upload_files/soft/HeidiSQL%207.0.rar

打开这个软件后按照下面的图输入地址,把认证提示勾上就是在稍候弹出的认证框中输入密码。

wKiom1ONVlmwbAqpAAFATIYn64s155.jpg

将这个工具配置mysql.exe使用更加方便

打开工具----首选项---其它选项---看到mysql命令行程序这行,选择你mysql.exe放的目录,我放在c盘下,直接指定目录即可。

wKioL1ONWTWBUC4lAAO_wuO4BlQ666.jpg

添加完后,选择工具-----运行命令行,就可以用命令管理mysql服务器

mysql.exe下载地址:

shell实现自动恢复mysql主从错误

#!/bin/sh# check_mysql_slave statusip=eth0mysql_command=/application/mysql/bin/mysqlmysql_user=rootmysql_pass=123456mysql_sockfile=/data/3306/mysql.sockdatetime=`date +"%Y-%m-%d_%H:%M:%S"`mysql_slave_logfile=/server/script/logs/check_mysql_slave.logslave_ip=`ifconfig $ip|grep "inet addr" | awk -F[:" "]+ '{print $4}'`#status=$($mysql_command -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "show slave status\G" | grep -i "running")Slave_IO_Running=`grep Slave_IO_Running $mysql_slave_logfile| awk ' {print $2}'`Slave_SQL_Running=`grep Slave_SQL_Running $mysql_slave_logfile | awk '{print $2}'`if [ "$Slave_IO_Running" = "Yes" -a "$Slave_SQL_Running" = "Yes" ]then        echo "Slave is Running!"        else        echo " $datetime $slave_ip Slave is not running!" >> $mysql_slave_logfilecat | $mysql_command -u$mysql_user -p$mysql_pass -S $mysql_sockfile << EOFstop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;start slave;exitEOFfi

MySQL数据的主从复制、半同步复制和主主复制详解

    MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

   单向复制有利于健壮性、速度和系统管理:

   健壮性:主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。

   速度快:通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。

系统管理:使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

   ⑵、MySQL数据复制的原理

   MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、***等等)。因此,要进行复制,必须在主服务器上启用二进制日志。

   每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。

   认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。

MySQL数据复制的原理图

082139520.png

可以看出MySQL数据库的复制需要启动三个线程来实现:

   其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。

   在前面的描述中,每个从服务器有3个线程。有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。

   这样读取和执行语句被分成两个独立的任务。如果语句执行较慢则语句读取任务没有慢下来。例如,如果从服务器有一段时间没有运行了,当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程远远滞后。如果从服务器在SQL线程执行完所有索取的语句前停止,I/O 线程至少已经索取了所有内容,以便语句的安全拷贝保存到本地从服务器的中继日志中,供从服务器下次启动时执行。这样允许清空主服务器上的二进制日志,因为不再需要等候从服务器来索取其内容。

一:实列说明MySQL的主从复制架构和实现详细过程

主从架构数据库的复制图

232014198.png

配置详细过程如下

   1. 环境架构:

       centos6.4-x64                         mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz

       Master:172.16.7.1/16                 Slave:172.16.7.2/16

  

   2.Master:安装环境准备

为mysql的安装提供前提环境和初始化安装mysql创建数据库目录# mkdir /mydata/data –pv创建mysq用户# useradd -r mysql修改权限# chown -R mysql.mysql /mydata/data/使用mysql-5.5通用二进制包安装解压mysql软件包# tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/创建连接,为了方便查看mysql的版本等信息#cd /usr/local/#ln -sv mysql-5.6.12-linux-glibc2.5-x86_64/ mysql修改属主属组# cd mysql# chown -R root.mysql ./*初始化数据库# yum -y install libaio# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/提供配置文件# cp support-files/my-default.cnf /etc/my.cnf提供服务脚本# cp support-files/mysql.server /etc/init.d/mysqld添加至服务列表# chkconfig --add mysqld# chkconfig --list mysqld# chkconfig mysqld on编辑配置文件,提供数据目录# vim /etc/my.cnf# The MySQL server  修改mysqld服务器端的内容log-bin=master-bin 主服务器二进制日志文件前缀名log-bin-index=master-bin.index  索引文件innodb_file_per_table= 1     开启innodb的一表一个文件的设置server-id       = 1          必须是唯一的datadir =/mydata/data        数据目录路径启动mysql服务# service mysqld start为了便于下面的测试,设置环境变量# vim/etc/profile.d/mysql.shexport PATH=$PATH:/usr/local/mysql/bin执行环境变量脚本,使其立即生效# . /etc/profile.d/mysql.sh创建软连接# mkdir -pv /var/lib/mysql# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

mysql的安装配置完成,下面增加一个用于同步数据的账户并设置相关的权限吧!

建立用户账户mysql> grant replication slave on *.* to 'admin'@'172.16.%.%' identified by '123456';刷新数据使其生效mysql> flush privileges;

至此我们mysql的Master设置完成.

Slave:安装环境配置:

创建mysql数据库目录# mkdir /mydata/data –pv创建mysql用户# useradd -r mysql修改数据目录权限# chown -R mysql.mysql /mydata/data/使用mysql-5.5通用二进制包安装mysql解压mysql软件包# tar xf mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz -C /usr/local创建连接,便于查看mysql的版本等信息# cd /usr/local/# ln -sv mysql-5.6.12-linux-glibc2.5-x86_64/ mysql修改mysql属主属组# cd mysql# chown -R root.mysql ./*# yum -y install libaio初始化mysql数据库# scripts/mysql_install_db --user=mysql--datadir=/mydata/data/提供mysql配置文件# cp support-files/my-default.cnf /etc/my.cnf提供服务脚本# cp support-files/mysql.server /etc/init.d/mysqld添加至服务列表# chkconfig --add mysqld编辑配置文件# vim /etc/my.cnf# The MySQL server#log-bin=mysql-bin      禁用二进制日志,从服务器不需要二进制日志文件datadir = /mydata/data  mysql的数据目录relay-log = relay-log   设置中继日志relay-log-index = relay-log.index  中继日志索引innodb_file_per_table = 1server-id       = 2    id不要和主服务器的一样设置环境变量# vim/etc/profile.d/mysql.shexport PATH=$PATH:/usr/local/mysql/bin执行此脚本(导出环境变量)# . /etc/profile.d/mysql.sh启动服务# service mysqld start

到这slave服务的mysql安装和配置完成,下面启动slave复制吧,开启之前先查看下从服务上的二进制文件吧

mysql> show master status; #在Master上执行查看二进制文件在从服务器上开启复制功能change master to master_host='172.16.7.1',master_user='admin',master_password='123456',master_log_file='master-bin.000001',master_log_pos=407;开启复制功能mysql>start slave;

至此我们的mysql服务器的主从复制架构已经基本完成,下面开启服务并测试测试吧~

在从服务器开启复制进程:mysql>start slave;

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

至此我们mysql服务器的主从复制架构已经完成,但是我们现在的主从架构并不完善,因为我们的从服务上还可以进行数据库的写入操作,一旦用户把数据写入到从服务器的数据库内,然后从服务器从主服务器上同步数据库的时候,会造成数据的错乱,从而会造成数据的损坏,所以我们需要把从服务器设置成只读~方法如下:

注意:read-only = ON ,这项功能只对非管理员组以为的用户有效!

编辑从服务器配置文件my.cnf

vim /etc/my.cnfread-only = ON   增加这行内容

service mysqld reload

此致我们的mysql基于主从架构的复制功能已经搭建全部完成.

由于二进制文件的缓冲区内,当我们的服务器宕机的时候,缓存区内的数据并没有同步到二进制日志文件内的时候,那就悲剧了,缓冲区内的数据就无法找回了,为了防止这种情况的发送,我们通过设置mysql直接把二进制文件记录到二进制文件而不再缓冲区内停留。

sync-binlog = ON 在主服务器上进行设置,用于事务安全

从上面我们可以看到从服务器启动的时候其Slave_IO_Running: Yes和Slave_SQL_Running: Yes是自动启动的,但是有时候我们在主服务上进行的误操作等,也会直接同步到从服务器上的,要想恢复那就难了,所以我们需要关闭其自动执行功能,让其能够停止,skip-slave-start = 1 ,让其不开启自动同步,但是遗憾的是mysql5.28上已经没有了,我们可以通过停止相关线程来实现:

mysql>STOP SLAVE 或STOP SLAVE  IO_THREAF或STOP SLAVE SQL_THREAD

注意:从服务器的所有操作日志都会被记录到数据目录下的错误日志中!

二:MySQL的半同步复制

可以参考:

   实现半同步复制的功能很简单,只需在mysql的主服务器和从服务器上安装个google提供的插件即可实现,

   主服务上使用semisync_master.,从服务器上使用sosemisync_slave.so插件即可实现,插件在mysql通用二进制的mysql/lib/plugin目录内。

其配置步骤如下

1.在master和slave 查询数据库是否支持动态添加插件

mysql> select @@have_dynamic_loading ; +------------------------+| @@have_dynamic_loading |+------------------------+| YES                    |+------------------------+1 row in set (0.00 sec)#YES表示支持。  从库查询此处略过.

2. 在master和slave分别查看目前mysql状态有没有启用半同步

mysql>  show variables like 'rpl%';+-------------------+-------+| Variable_name     | Value |+-------------------+-------+| rpl_recovery_rank | 0     |+-------------------+-------+1 row in set (0.00 sec)# Value为0表示目前 未启用.  #从库操作也是这样,此处略过.

3. 在master和slave上,分别安装半同步插件

# master端mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; Query OK, 0 rows affected (0.05 sec) # slave端mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; Query OK, 0 rows affected (0.03 sec)

4. 在master端启用半同步

#未启动前状态查看mysql> show variables like 'rpl%';+------------------------------------+-------+| Variable_name                      | Value |+------------------------------------+-------+| rpl_recovery_rank                  | 0     || rpl_semi_sync_master_enabled       | OFF   || rpl_semi_sync_master_timeout       | 10000 || rpl_semi_sync_master_trace_level   | 32    || rpl_semi_sync_master_wait_no_slave | ON    |+------------------------------------+-------+5 rows in set (0.00 sec)# 启动, 并查看启动结果mysql>  set global rpl_semi_sync_master_enabled=1;Query OK, 0 rows affected (0.00 sec) mysql>  show variables like 'rpl%';               +------------------------------------+-------+| Variable_name                      | Value |+------------------------------------+-------+| rpl_recovery_rank                  | 0     || rpl_semi_sync_master_enabled       | ON    || rpl_semi_sync_master_timeout       | 10000 || rpl_semi_sync_master_trace_level   | 32    || rpl_semi_sync_master_wait_no_slave | ON    |+------------------------------------+-------+5 rows in set (0.00 sec)# rpl_semi_sync_master_timeout 默认为10000,单位是毫秒,可以根据实际环境修改# 修改命令为:set global rpl_semi_sync_master_timeout=1000;# 发现 rpl_semi_sync_master_enabled --> Value: ON,表示启用“主”角色的半同步插件

5. 在slave端启用半同步

# 未启动前状态mysql> show variables like 'rpl%';+---------------------------------+-------+| Variable_name                   | Value |+---------------------------------+-------+| rpl_recovery_rank               | 0     || rpl_semi_sync_slave_enabled     | OFF   || rpl_semi_sync_slave_trace_level | 32    |+---------------------------------+-------+3 rows in set (0.00 sec)# 启动,并查看执行结果mysql> set global rpl_semi_sync_slave_enabled=1;Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'rpl%';              +---------------------------------+-------+| Variable_name                   | Value |+---------------------------------+-------+| rpl_recovery_rank               | 0     || rpl_semi_sync_slave_enabled     | ON    || rpl_semi_sync_slave_trace_level | 32    |+---------------------------------+-------+3 rows in set (0.00 sec)# 发现 rpl_semi_sync_slave_enabled --> Value: ON,表示启用“从”角色的半同步插件.但是此时# 仅仅是启用,并未在当前运行状态激活. 所以还需要执行下面的步骤. # 步骤1:# 此时查看运行状态mysql> show status like 'rpl%';+----------------------------+-------------+| Variable_name              | Value       |+----------------------------+-------------+| Rpl_semi_sync_slave_status | OFF         || Rpl_status                 | AUTH_MASTER |+----------------------------+-------------+ #发现为OFF状态.2 rows in set (0.00 sec)# 步骤2:激活半同步--> 也就是restart  io线程mysql> stop slave io_thread;Query OK, 0 rows affected (0.00 sec) mysql> start slave io_thread;    Query OK, 0 rows affected (0.00 sec) mysql> show status like 'rpl%';+----------------------------+-------------+| Variable_name              | Value       |+----------------------------+-------------+| Rpl_semi_sync_slave_status | ON          || Rpl_status                 | AUTH_MASTER |+----------------------------+-------------+2 rows in set (0.00 sec)# 发现Rpl_semi_sync_slave_status Value为ON。

#到此,MySQL半同步部署完成. 此时可以到master端查看运行状态了。

mysql> show status like 'rpl%';+--------------------------------------------+-------+| Variable_name                              | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients               | 1     || Rpl_semi_sync_master_net_avg_wait_time     | 0     || Rpl_semi_sync_master_net_wait_time         | 0     || Rpl_semi_sync_master_net_waits             | 0     || Rpl_semi_sync_master_no_times              | 0     || Rpl_semi_sync_master_no_tx                 | 0     || Rpl_semi_sync_master_status                | ON    || Rpl_semi_sync_master_timefunc_failures     | 0     || Rpl_semi_sync_master_tx_avg_wait_time      | 0     || Rpl_semi_sync_master_tx_wait_time          | 0     || Rpl_semi_sync_master_tx_waits              | 0     || Rpl_semi_sync_master_wait_pos_backtraverse | 0     || Rpl_semi_sync_master_wait_sessions         | 0     || Rpl_semi_sync_master_yes_tx                | 0     |+--------------------------------------------+-------+14 rows in set (0.02 sec)# 关键看Rpl_semi_sync_master_status

上面的设置时在mysql进程内动态设定了,会立即生效但是重启服务以后就会失效,为了保证永久有效,需要把相关配置写到主、从服务器的配置文件my.cnf内:

Master上:[mysqld]rpl_semi_sync_master_enabled=1rpl_semi_sync_master_timeout=1000  #此单位是毫秒 Slave上:[mysqld]rpl_semi_sync_slave_enabled=1

确认半同步功能已经启用,通过下面的操作进行查看

master上面

mysql> create database asyncdb;Query OK, 1 row affected (0.19 sec)mysql> show status like 'rpl_semi_sync_master_yes_tx';+-----------------------------+-------+| Variable_name               | Value |+-----------------------------+-------+| Rpl_semi_sync_master_yes_tx | 2     |+-----------------------------+-------+1 row in set (0.00 sec)mysql> show global status like 'rpl%';+--------------------------------------------+--------+| Variable_name                              | Value  |+--------------------------------------------+--------+| Rpl_semi_sync_master_clients               | 1      || Rpl_semi_sync_master_net_avg_wait_time     | 127295 || Rpl_semi_sync_master_net_wait_time         | 127295 || Rpl_semi_sync_master_net_waits             | 1      || Rpl_semi_sync_master_no_times              | 0      || Rpl_semi_sync_master_no_tx                 | 0      || Rpl_semi_sync_master_status                | ON     || Rpl_semi_sync_master_timefunc_failures     | 0      || Rpl_semi_sync_master_tx_avg_wait_time      | 127147 || Rpl_semi_sync_master_tx_wait_time          | 127147 || Rpl_semi_sync_master_tx_waits              | 1      || Rpl_semi_sync_master_wait_pos_backtraverse | 0      || Rpl_semi_sync_master_wait_sessions         | 0      || Rpl_semi_sync_master_yes_tx                | 2      |+--------------------------------------------+--------+14 rows in set (0.00 sec)

slave上面:

mysql> stop slave io_thread;Query OK, 0 rows affected (0.08 sec)mysql> start slave io_thread;Query OK, 0 rows affected (0.03 sec)mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || asyncdb            || db                 || mysql              || performance_schema || test               |+--------------------+6 rows in set (0.12 sec)

我们至此已经实现了mysql数据库复制的半同步方式的架构,并且通过测试查看了复制功能。

三:MySQL设置主-主复制:master<-->slave 

1、在两台服务器上各自建立一个具有复制权限的用户;让两个数据库互为主从的关系

2、修改配置文件:

把上面的连个数据库的配置文件重新配置,其配置如下 

主服务器上面

[mysqld]log-bin=mysql-binrelay-log = relay-mysqlrelay-log-index = relay-mysql.indexserver-id       = 1datadir = /mydata/dataauto-increment-increment = 2     #每次跳两个数。auto-increment-offset = 1       #从1开始。

从服务器上面

[mysqld]server-id = 2log-bin = mysql-binrelay-log = relay-mysqlrelay-log-index = relay-mysql.indexauto-increment-increment = 2auto-increment-offset = 2

 如果此时两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可。

master:查看日志文件信息mysql> show master status;+------------------+----------+--------------+------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000001 |      107 |              |                  |+------------------+----------+--------------+------------------+Slave:查看服务器日志文件信息mysql> show master status;+------------------+----------+--------------+------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000001 |      107 |              |                  |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)

 在各个服务器上建立账号和权限,来进行同步设置

master上面:mysql> GRANT REPLICATION SLAVE ON *.* TO 'boss'@'172.16.%.%' IDENTIFIED BY '123456';mysql> flush privileges;slave上面:mysql> GRANT REPLICATION SLAVE ON *.* TO 'chrisli'@'192.168.%.%' IDENTIFIED BY 'work';mysql> flush privileges

在每一个服务器上指定对另一台服务器为自己的主服务器即可:

server1mysql> CHANGE MASTER TO MASTER_HOST='172.16.7.2',MASTER_USER='chrisli',MASTER_PASSWORD='work',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=344;

215313264.png

server2:mysql> CHANGE MASTER TO MASTER_HOST='172.16.7.1',MASTER_USER='boss',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=345;

215339601.png

双主架构配置基本完成,下面在各自上面启动复制进程吧~并进行测试:

215419531.png

215419915.png

至此我们通过上面的测试,可以看出已经实现了主主复制的功能.

MySQL 主主(双主)实施部署

MySQL-Proxy实现读写分离部署文档

MySQL读写分离之Amoeba实现

CentOS6.4+MySQL-5.6.12 二种安装详解

MySQL 5.5.35 单机多实例配置详解

mysql-mmm实现对mysql replication进行监控和故障迁移

amoeba+keepalived+mmm实现mysql读写分离高可用架构

Linux下编译安装配置MariaDB数据库的方法

源代码编译MYSQL5.6 环境下的MHA+KEEPALIVED的安装和维护

 

MySQL备份与恢复常用方法总结(mysqldump/xtrabackup/lvm快照备份/逻辑备份与恢复/二进制日志及时点恢复)