MySQL Replication 即主从复制

MySQL Replication主要用于MySQL的时时备份或者读写分离。在配置之前先做一下准备工作,配置两台mysql服务器,或者在一台服务器上配置两个端口也可以。
流程示意图:

A-->change data-->bin_log-->transfer-->B-->repl_log-->change data

一、搭建好了一个mysql,跑的是3306端口。

1、下载mysql到/usr/local/src/

wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz

2、解压缩

tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz

3.把解压完的数据移动到/usr/local/mysql

mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql

4.建立mysql用户

useradd?-s?/sbin/nologin?mysql

5.初始化数据库

cd /usr/local/mysql
mkdir -p /data/mysql
chown -R mysql:mysql ?/data/mysql
./scripts/mysql_install_db ?--user=mysql ?--datadir=/data/mysql 

6.拷贝配置文件
cp support-files/my-large.cnf ? /etc/my.cnf拷贝配置文件
7.拷贝启动脚本文件并修改其属性

cp support-files/mysql.server ? ?/etc/init.d/mysqld
chmod 755 ?/etc/init.d/mysqld

8.修改启动脚本

vim /etc/init.d/mysqld

需要修改的地方有 “datadir=/data/mysql”
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?basedir=/usr/local/mysql
9.把启动脚本加入系统服务项,并设定开机启动,启动mysql

chkconfig --add mysqld
chkconfig  mysqld on 或service  mysqld  start或/etc/init.d/mysqld  start

检查mysqld是否启动的命令为:ps aux |grep mysqld
二、下面再搭建一个3307端口的mysql:

[[email protected]?~]#? mkdir  /data/mysql_slave
[[email protected]?~]# chown  -R  mt=ysql:mysql  /data/mysql_slave
[[email protected]?~]#?cd?/usr/local/
[[email protected]?local]#?cp?-r?mysql?mysql_slave
[[email protected]?local]#?cd?mysql2
[[email protected] mysql_slave]#./scripts/mysql_install_db   --user=mysql? --datadir=/data/mysql_slave
 [[email protected]_slave]#?cp?/etc/my.cnf? .
[[email protected]?mysql_slave]#?vim?my.cnf
【mysqld】
?改为:port = 3307 ?
?改为:socket = /tmp/mysql_slave.sock
在这一行的下面再加一行:
?datadir=?/data/mysql_slave?

保存后就可以启动它了:

[[email protected] mysql_slave]#?cd bin/
[[email protected] bin]# ./mysqld_safe --defaults-file=../my.cnf --user=mysql &

重启:pid=`ps aux|grep mysql2.sock|grep -v grep|awk ‘{print $2}‘`;kill $pid;cd /usr/local/mysql2/bin/; ./mysqld_safe --default-file=../my.cnf --user=mysql &

若开机启动,需要把启动命令加入到/etc/rc.local中
如果想跟mysqld一样脚本启动,则:


[[email protected] mysql_slave]#?cd /etc/init.d/
[[email protected] init.d]# cp mysqld ?mysqldslave
vim mysqldslave
改datadir=/data/mysql” ? ?为 ? datadir=/data/mysql_slave
?? basedir=/usr/local/mysql 为 ? basedir=/usr/local/mysql_slave
改conf=/etc/my.cnf ? ? ? ? ? ?为 ? conf=$basedir/my.cnf

也可以配置到/etc/init.d/mysqlslave

cp -r mysql mysql_slave

同样修改

basedir=/usr/local/mysql_slave
datadir=/data/mysql_slave
conf=$basedir/my.cnf

后面的conf路径

conf=$basedir/my.cnf

但是不能使用/etc/init.d/mysqlslave start启动
可以使用service mysqlslave start

[[email protected] bin]# chkconfig --add mysqldslave
[[email protected] bin]# chkconfig mysqldslave on
[[email protected] bin]# chkconfig --add mysqld
[[email protected] bin]# chkconfig mysqld on  

也可以将写入到/etc/rc.d/rc.local文件中:

echo?"./mysqld_safe?--defaults-file=../my.cnf?--user=mysql?&"?>>/etc/rc.d/rc.local

三、在主服务器上创建测试数据库:
三、在主服务器上创建测试数据库:
登录两台mysql

mysql -h127.0.0.1 -P3306    #通过主机端口登陆
mysql -h127.0.0.1 -P3307
mysql -S /tmp/mysql.sock    #通过sock登陆
mysql -S /tmp/mysql_slave.sock
mysql -uroot  -p密码  #通过密码登陆

登录mysql:/usr/local/mysql/bin/mysql -uroot -p199610
? ? ? ? 或mysql -S ?/tmp/mysql.sock ?
登录mysql_slave:mysql -S ?/tmp/mysql_slave.sock ?或者mysql -h127.0.0.1 -P3307 (无密)
?
把3306端口的mysql作为主(master),而把3307的mysql作为从(slave)
为了让实验更加像生产环境,先在master上创建一个库db1
[[email protected]?bin]#?mysql?-uroot?-S?/tmp/mysql.sock -p199610

mysql>?create?database?db1;
Query?OK,?1?row?affected?(0.01?sec)

mysql>?quit
Bye
// -S 后面指定mysql的socket文件路径,这也是登陆mysql的一种方法,因为在一台服务器上跑了两个mysql端口,所以,只能用 -S 这样的方法来区分。
?
创建了db1库,然后把mysql库的数据复制给它:

mysqldump?-uroot?-S?/tmp/mysql.sock? mysql?>?123.sql ? ? #备份?
mysql?-uroot?-S?/tmp/mysql.sock?db1?<?123.sql ? ? #恢复
  1. 设置主master
    修改配置文件:

    vim?/etc/my.cnf

    在[mysqld]部分查看是否有以下内容,如果没有则添加:

    server-id=1

    log-bin=mysql-bin //可以修改为aiker等等
    除了这两行是必须的外,还有两个参数,你可以选择性的使用其中一个:
    #指定库的主从

    #binlog-do-db=db1,db2

    #忽略指定库主从,黑名单

    #binlog-ignore-db=mysql

    binlog-do-db= #需要复制的数据库名,多个数据库名,使用逗号分隔。
    binlog-ignore-db= #不需要复制的数据库库名,多个数据库名,使用逗号分隔。这两个参数其实用一个就可以
    重启mysql服务:

    /etc/init.d/mysqld restart
    ls ?/data/mysql

    查看/data/mysql下,会出现以log-bin值文件:

    aiker.000001??

    ?
    设置mysql数据库的root访问密码:
    设置密码:mysqladmin?-uroot?-S?/tmp/mysql.sock?password?‘199610‘
    登录:mysql?-uroot?-S?/tmp/mysql.sock?-p‘199610‘
    ?

    mysql>?grant?replication?slave?on?*.*?to?‘repl‘@‘127.0.0.1‘?identified?by?‘123456‘;

    //这里的repl是为slave端设置的访问master端mysql数据的用户,密码为123456,这里的127.0.0.1为slave的ip(因为我们配置的master和slave都在本机)。

    mysql>?flush privileges;     ? ? ? #刷新??
    mysql>flush tables with read lock;   #锁定数据库,此时不允许更改任何数据
    mysql>unlock tables;
    mysql> show master status;  #查看状态,这些数据是要记录的,一会要在slave端用到
    +--------------+----------+--------------+------------------+
    | File         | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +--------------+----------+--------------+------------------+
    | aiker.000001 |      587 |              |                  |
    +--------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
  2. 设置slave
    先修改slave的配置文件my.cnf:
    vim?/usr/local/mysql_slave/my.cnf

    找到 “server-id = 1” 这一行,删除掉或者改为 “server-id = 2” 总之不能让这个id和master一样,否则会报错。
    另外在从上,如下两行,黑白名单,看主mysql有没有配置

    replicate-do-db=db1,db2
    replicate-ignore-db=db1,db2

改完后,重启slave:

service mysqld_slave restart

拷贝master上的db1库的数据到slave上,因为master和slave都在一台服务器上,所以操作起来简单了很多,如果是不同的机器,可能就需要远程拷贝了,希望你注意这一点:

[[email protected]?~]#?mysqldump?-uroot?-S?/tmp/mysql.sock?-pyourpassword db1?>?123.sql
[[email protected]?~]#?mysql?-uroot?-S?/tmp/mysql_slave.sock?-pyourpassword?-e?"create?database?db1"
[[email protected]?~]#?mysql?-uroot?-S?/tmp/mysql_slave.sock?-pyourpassword?db1?<?db1.sql

二行中,-e选项,它用来把mysql的命令写到shell中,这样可以方便把mysql操作写进脚本中,它的格式就是?-e?"commond"?它很实用。
把数据拷贝过来后,就需要在slave上配置主从了:

mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host=‘127.0.0.1‘,master_port=3306,master_user=‘repl‘, master_password=‘123123‘,master_log_file=‘aiker.000001‘, master_log_pos=587;
Query OK, 0 rows affected (0.02 sec)

mysql> slave start;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G

在主mysql上解锁

mysql -uroot -S  /tmp/mysql_slave.sock -p123123 -e  "unlock tables"

或者

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

3、测试主从
在master上执行如下命令:

[[email protected] bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
|        2 |
+----------+
[[email protected] bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;truncate table db" 清空db1的表
[[email protected] bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
|        0 |
+----------+

[[email protected] ~]# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
|        0 |
+----------+

slave上的该表也被清空了。这样好像不太明显,不妨继续把db表删除试试:

[[email protected] ~]# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
ERROR 1146 (42S02) at line 1: Table ‘db1.db‘ doesn‘t exist

主从配置起来很简单,但是这种机制也是非常脆弱的,一旦我们不小心在从上写了数据,那么主从也就被破坏了。另外如果重启master,务必要先把slave停掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 slavestart.

原文地址:http://blog.51cto.com/m51cto/2070286

时间: 2024-10-12 09:32:48

MySQL Replication 即主从复制的相关文章

第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)

Linux运维 第四阶段 (七)MySQL REPLICATION(主从复制.半同步复制.复制过滤) 一.MySQL Replication相关概念: 1.复制的作用:辅助实现备份:高可用HA:异地容灾:分摊负载(scaleout):rw-spliting(mysql proxy工作在应用层). 2.master有多个CPU允许事务并行执行,但往二进制日志文件只能一条条写:slave比master要慢:master-slave默认异步方式传送. 3.半同步:仅负责最近一台slave同步成功,其它

mysql replication(主从复制)实验学习笔记

1.理论部分 1.1.mysql replication的概念: enables data from one mysql database server(the master) to be replicated to one or more mysql database servers(the slaves). 1.2.mysql replication的实现基础: Binary Log(二进制日志)是实现mysql主从复制的基础 Binary Log的概念:所有的.无论是明确的或隐含的可以引起

mysql replication(主从复制)实验学习笔记(二)

1.理论部分 1.1.One Master-Muti Slave 工作原理: 一台到多台Slave 缺陷: I/O压力集中在Master上 1.2.M-S-S 工作原理: 1)使用一台Slave作为中继,分担Master的压力. 2)中继SLave上需要开启二级制日志,并配置log-slave-updates. 1.3.M-M 工作原理: 相互负载均衡 缺点: 破坏了事物的隔离性何数据一致性(不建议使用) 1.4.M-M-M 工作原理: 通过Monitor监控其他三台机器运行 DML发送到其中一

浅析 MySQL Replication(本文转自网络,非本人所写)

作者:卢飞 来源:DoDBA(mysqlcode) 0.导读 本文几乎涵盖了MySQL Replication(主从复制)的大部分知识点,包括Replication原理.binlog format.复制中如何保证数据一致性.组提交.复制优化.半同步复制.多源复制. 目前很多公司中的生产环境中都使用了MySQL Replication ,也叫 MySQL 复制,搭建配置方便等很多特性让 MySQL Replication 的应用很广泛,我们曾经使用过一主拖20多个从库来分担业务压力.关于 MySQ

MySQL Replication主从复制—(实例)

主从复制原理 MySQL Replication是一个从Master复制到一台或多台Slave的异步复制过程. Master和Slave之间实现整个复制过程主要由三个线程来完成,其中一个IO线程在Master端,两个线程(SQL线程和IO线程)在Slave端. 通过Master服务器打开Binary Log(二进制日志文件)的功能,Slave端从Master端获取该日志信息,然后将二进制文件解析为SQL语句,并完全顺序地执行SQL语句所记录的各种操作.(Slave获取到的二进制文件同时也会写入到

MySQL Replication 主从复制全方位解决方案

原文:MySQL Replication 主从复制全方位解决方案 1.1 主从复制基础概念 在了解主从复制之前必须要了解的就是数据库的二进制日志(binlog),主从复制架构大多基于二进制日志进行,二进制日志相关信息参考:http://www.cnblogs.com/clsn/p/8087678.html#_label6 1.1.1 二进制日志管理说明 二进制日志在哪?如何设置位置和命名? 在my.cnf文件中使用 log-bin = 指定:命名规则为 mysql-bin.000000 (后为6

MySQL 5.6 主从复制配置

一.前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载.而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失. 二.MySQL主从复制(读写分离)和集群的区别: 1.主从复制(读写分离):一般需要两台及以上数据库服务器即可(一台用于写入数据,一台用于同步主的数据并用于数据查询操作).局限性:(1)配置好主从复制之后,

mysql 5.5主从复制配置

首先将主库现有的要实现主从的数据库原原本本地复制到从库上,目的是一开始就让主从同步,让binlog日志从最新的记录开始同步! 备份: 1 导出所有库 系统命令行 mysqldump -uusername -ppassword --all-databases > all.sql 2 导入所有库 mysql命令行 mysql>source all.sql; 远程复制:将192.168.80.145上的test.sql拷到本机上 scp 192.168.80.145:/tmp/test.sql /t

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

一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制.单向.异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环