当前位置:  数据库>mysql

Mysql主从复制(master-slave)实际操作案例

    来源: 互联网  发布时间:2014-10-15

    本文导语:  在这一章节里, 我们来了解下如何在 Mysql 中进行用户授权及主从复制   这里先来了解下 Mysql 主从复制的优点:   1、 如果主服务器出现问题, 可以快速切换到从服务器提供的服务 2、 可以在从服务器上执行查询操作, 降...

在这一章节里, 我们来了解下如何在 Mysql 中进行用户授权及主从复制
 
这里先来了解下 Mysql 主从复制的优点:
 
1、 如果主服务器出现问题, 可以快速切换到从服务器提供的服务
2、 可以在从服务器上执行查询操作, 降低主服务器的访问压力
3、 可以在从服务器上执行备份, 以避免备份期间影响主服务器的服务
注意一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询, 实时性要求高的数据仍然需要从主数据库获得
 
在这里我们首先得完成用户授权, 目的是为了给从服务器有足够的权限来远程登入到主服务器的 Mysql
 
在这里我假设
主服务器的 IP 为: 192.168.10.1
从服务器的 IP 为: 192.168.10.2
 
Mysql grant 用户授权
 
查看 Mysql 的用户表

代码如下:

msyql> mysql -uroot -p123123;
msyql> select user, host, password from mysql.user;

结果如下:
代码如下:
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| root             | 127.0.0.1 | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
+------------------+-----------+-------------------------------------------+

从如上表中看以看出 root 用户只能从本机登入 Mysql, 也就是来自 localhost 或者 127.0.0.1
 
现在来通过 grant 命令来添加授权用户
代码如下:

msyql> ? grant   //查看 grant 的详细用法
 
msyql> grant all on *.* to user1@192.168.10.2 identified by "123456"; // *.* = 所有的数据库.所有的表
//或者
msyql> grant replication slave on *.* to 'user2'@'192.168.10.%' identified by "123456"; // %代表通配符

通过了 grant 命令给予了来自 192.168.10.2 的用户 user1 权限, 允许其远程登录, 如下:
代码如下:

+------------------+--------------+-------------------------------------------+
| user             | host         | password                                  |
+------------------+--------------+-------------------------------------------+
| root             | localhost    | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| root             | 127.0.0.1    | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| user1            | 192.168.10.2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| user2            | 192.168.10.% | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------------+--------------+-------------------------------------------+

此时就可以在 192.168.10.2 的机器上访问 10.1 的 Mysql 了, 如下:
代码如下:

msyql> mysql -uuser1 -p123456 -h192.168.10.1;


Mysql bin-log 日志
 
开启 bin-log 二进制日志, 它保存了所有增删改的操作, 以便于数据恢复或同步

修改主服务器 mysql 配置文件:

代码如下:
shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;
 
/********** my.cnf **********/
[mysqld]
 
#开启慢查询日志, 记录查询过长的 sql 语句,以便于优化
log_slow_queries   = /var/log/mysql/mysql-slow.log
 
#开启 bin-log 日志
log-bin            = /var/log/msyql/mysql-bin.log

添加完成后重启 Mysql 服务
代码如下:

shawn@Shawn:~$ sudo /etc/init.d/mysql restart

现在你可以通过如下命令来查看 bin-log 日志是否成功开启
代码如下:

mysql> show variables like "%log_%";
 
| log_bin                 | ON        |
| log_slow_queries        | ON        |

如果显示为 ON, 那么就可以在 /var/log/mysql/ 文件夹看到 mysql-bin.000001 二进制文件
 
关于 bin-log 日志的相关操作:
代码如下:

mysql> flush logs;

此时就会多一个最新的 bin-log 日志
代码如下:

mysql> show master status;

查看最后一个 bin-log 日志, 如下:
代码如下:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      107 |              |                  |
+------------------+----------+--------------+------------------+
 
mysql> show master logs;

查看所有 bin-log 日志, 如下:
代码如下:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      4340 |
| mysql-bin.000002 |       107 |
+------------------+-----------+
 
mysql> reset master;

清空所有 bin-log 日志
代码如下:

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000001 | more

查看 bin-log 日志内容
代码如下:

#如果有字符集问题的话可以执行:
shawn@Shawn:~$ mysqlbinlog --no-defaults /var/log/mysql/mysql-bin.000001

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000002 | mysql -uroot -p123123 test;
恢复 mysql-bin.000002 中所有的操作到 test 数据库中

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000002 --start-position="193" --stop-position="398" | mysql -uroot -p123123 test;
恢复 mysql-bin.000002 中指定的操作(position)到 test 数据库中


 
Mysql 主从复制 - 数据同步
 
到这一步的时候首先确保 Mysql 用户授权已经完成以及 Mysql bin-log 日志已经成功开启
并确保每台服务器的 server-id 是唯一的
 
再次修改主服务器(192.168.10.1)的 mysql 配置文件:
代码如下:

shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;
 
/********** my.cnf **********/
#取消 server-id 注释符号
server-id   = 1
/****************************/
 
#重启 Mysql 服务
shawn@Shawn:~$ sudo /etc/init.d/mysql restart

到这里, 主服务器的配置已经完成, 很简单
 
这次我们主要做的是让从服务器同步主服务器的数据, 同步的是将来所有对主服务做的增删改操作, 但是现有主服务器中的大量数据得先手动同步到从服务器, 操作如下:
代码如下:

#清空一下主服务器的 bin-log 日志, (可选: 保险操作, 防止主从 bin-log 日志混乱)
mysql> reset master;
 
#然后备份导出主服务器中现有的 test 数据库
shawn@Shawn:~$ mysqldump -uroot -p123123 test -l -F > /tmp/test.sql;
 
-F = flush logs, 生成新的日志文件, 包括 bin-log 日志
-l = lock 数据库, 防止在导出的时候被写入数据, 完成后自动解锁
 
#完成后把文件传输给从服务器
shawn@Shawn:~$ scp /tmp/test.sql 192.168.10.2:/tmp/
 
#然后再查询确保一下从服务器已经成功授过权
mysql> show grants for user1@192.168.10.2G
 
*************************** 1. row ***************************
Grants for user1@192.168.10.2:
GRANT ALL PRIVILEGES ON *.* TO 'user1'@'192.168.10.2'
IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'

完成后, 现在我们到从服务器 (192.168.10.2) 导入现有的数据:
代码如下:

#清空一下从服务器的 bin-log 日志, (可选: 保险操作)
mysql> reset master;
 
#然后导入主服务器中现有的数据
shawn@Shawn:~$ mysqldump -uroot -p123123 test -v -f < /tmp/test.sql;

 
-v = 查看导入的详细信息
-f = 是当中间遇到错误时, 可以 skip 过去, 继续执行下面的语句
当然你也可以用 source 命令导入
好了, 目前为止主服务器(192.168.10.1)和从服务器(192.168.10.2)现有的数据已经成功手动同步
 
接下来修改从服务器(192.168.10.2)的 mysql 配置文件:
代码如下:

shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;
 
/********** my.cnf **********/
#取消 server-id 注释符号, 并修改值
server-id       = 2
 
#取消 master-host 注释符号, 并修改值
master-host     = 192.168.10.1
 
#取消 master-user 注释符号, 并修改值
master-user     = user1
 
#取消 master-password 注释符号, 并修改值
master-password = 123456
 
#取消 master-port 注释符号, 并修改值, 主服务器默认端口号为: 3306
master-port     = 3306
/****************************/
 
#重启 Mysql 服务
shawn@Shawn:~$ sudo /etc/init.d/mysql restart

配置文件修改完成, 此时在从服务器中登入自己的 Mysql, 而不是远程登入主服务器(192.168.10.1)
代码如下:

#在从服务器中登入自身的 Mysql
msyql> mysql -uroot -p123123;
 
#查看是否已经取得同步
msyql> show slave statusG
 
*************************** 1. row ***************************
      Connect_Retry: 60
    Master_Log_FIle: mysql-bin.000002
Read_Master_Log_Pos: 106
   Slave_IO_Running: Yes 
  Slave_SQL_Running: Yes

Slave_IO_Running 如果是 Yes 的话代表成功从主服务器中同步到 bin-log 日志
Slave_SQL_Running 如果是 Yes 的话代表成功执行 bin-log 日志中的 SQL 语句
此时的 Master_Log_FIle 和 Read_Master_Log_Pos 的值应该对应主服务器中的 show master status 命令的值
Connect_Retry 中的 60 代表每 60 秒就去主服务器同步 bin-log 日志
 
OK, 如果你看到的是那两个关键的 Yes, 那你就可以去测试了, 在主服务器插入新的数据, 再去从服务器查看, 不出意外的话, 你会兴奋一下, 数据已经同步了
 
这里再说一下其他经常用到的命令:
代码如下:

#启动复制线程
msyql> start slave
 
#停止复制线程
msyql> stop slave
 
#动态改变到主服务器的配置
msyql> change master to
 
#查看从数据库运行进程
msyql> show processlist

这里也同时说一下操作中的常见错误:
 
问题: 从数据库无法同步
Slave_SQL_Running 值为 NO, 或 Seconds_Bebind_Master 值为 Null

原因:
一、 程序有可能在 slave 上进行了写操作
二、 也有可能是 slave 机器重启后, 事务回滚造成的

解决方法一:

代码如下:

msyql> stop slave;
 
msyql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
 
msyql> start slave;

解决方法二:
代码如下:

msyql> stop slave;
 
#查看主服务器上当前的 bin-log 日志名和偏移量
msyql> show master status;
 
#获取到如下内容:
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |      286 |              |                  |
+------------------+----------+--------------+------------------+
 
#然后到从服务器上执行手动同步
msyql> change master to
    -> master_host="192.168.10.1"
    -> master_user="user1"
    -> master_password="123456"
    -> master_post=3306
    -> master_log_file="mysql-bin.000005"
    -> master_log_pos=286;
    
msyql> start slave;

再次通过 show slave status 查看:
如果 Slave_SQL_Running 的值变为 Yes, Seconds_Bebind_Master 的值为 0 时, 即正常
 
好了, 如上是我自己在操作中所总结的一些内容, 如有更好的建议, 欢迎留言一起探讨
顺便说一下, 我使用的是 Ubuntu 12.04

    
 
 

您可能感兴趣的文章:

  • 主从多线程同步工具 MySQL-Transfer
  • 谁有做linux mysql主从互备啊
  • mysql主从连接失败,怎样通过binlog日志恢复呢?
  • mysql主从服务器配置特殊问题
  • mysql主从库不同步问题解决方法
  • shell脚本监控mysql主从状态
  • 减少mysql主从数据同步延迟问题的详解
  • mysql主从数据库不同步的2种解决方法
  • Ubuntu配置Mysql主从数据库
  • shell监控脚本实例—监控mysql主从复制
  • MYSQL主从库不同步故障一例解决方法
  • centos下mysql主从同步快速设置步骤分享
  • mysql主从同步复制错误解决一例
  • MYSQL主从不同步延迟原理分析及解决方案
  • win2003 安装2个mysql实例做主从同步服务配置
  • 深入mysql主从复制延迟问题的详解
  • mysql5.5 master-slave(Replication)主从配置
  • MySQL主从复制配置心跳功能介绍
  • linux下指定mysql数据库服务器主从同步的配置实例
  • mysql主从同步快速设置方法
  • 基于MySQL数据库复制Master-Slave架构的分析
  • mysql5.5 master-slave(Replication)配置方法
  • 解读mysql主从配置及其原理分析(Master-Slave)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我用kylix上的sql connection连接同一网段的linux上的MYSQL,但总是提示用户及密码不下确,但实际上用户及密码肯定是正确的呀?
  • MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项
  • mysql免安装版的实际配置方法
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • Mysql查询错误:ERROR:no query specified原因
  • MySQL 重装MySQL后, mysql服务无法启动
  • php安装完成后如何添加mysql扩展
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin
  • MySQL Workbench的下载安装与使用教程
  • 在Linux内安装了Mysql,无法进入Mysql.
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 怎样在linux终端输入mysql直接进入mysql?
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • c++中关于#include <mysql/mysql.h>的问题?
  • MySQL索引基本知识
  • mysql -u root mysql 怎么解释
  • Mysql设置查询条件(where)查询字段为NULL
  • mm.mysql那里可以下载?www.mysql.com根本下载不了。谢谢了
  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)
  • MySQL集群 MySQL Cluster


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3