小Q:手把青秧插满田,低头便见水中天;身心清净方为道,退步原来是向前;

            世间本来无一物,何必处处惹尘埃;


今天早早就起床了,宿舍送电送得早,于是制定了一个新时间表;不过本来预期的是把这一章看完了呢,不过因为中途解决问题总是会消耗大量的时间,所以还差一个重要知识点;

mysql主从配置:又称AB复制,官方用语replication;

主要是把 主 上的数据复制到 从 上;首先要把 主 打开,推送记录到 从 上;

A  --change data  --bin_log   ---->  B = repl_log  --change database

这需要两台机子;不过我们实验用一台机子就够了,而且还能练习一台机子如何装多个mysql


看了几篇文章,才明白主从配置又叫双机热备。。。。。

配置主从配置挺简单的,感觉我的还挺全,嘿嘿;推荐我看过的比较系统的文档

http://www.cnblogs.com/cchun/p/3712637.html 

http://blog.chinaunix.net/uid-26610882-id-4083396.html 

---------------------安 装-----------------------

删  除:    rm  -rf  /usr/local/mysql    /data/mysql

建用户: useradd   -s   /sbin/nologin  mysql   

下 载 :  cd     /usr/local/src/                                     因为之前已经下过,所以这步可以略过了

wget  http://www.lishiming.net/data/p_w_upload/forum/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz

tar   zxvf     /usr/local/src/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz

mv    mysql-5.1.40-linux-i686-icc-glibc23      /usr/local/mysql

配置文件:

cp   support-files/my-small.cnf     /etc/my.cnf                     上次我们拷贝的large文件,覆盖原文件

启动脚本:

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

添 加:basedir  =  /usr/local/mysql

          datadir   =  /data/mysql

初始化: 

./scripts/mysql_install_db   --user=mysql   --datadir=/data/mysql    成功后会在mysql下生成俩文件

启 动:

/etc/init.d/mysqld    start                  我在这启动失败,因为我没把以前进程关掉, kill  -9  进程号


-----------------------安装第二个mysql-----------------------

 cd    /usr/local                                cp   -r   mysql    mysql_slave

配置文件:

cp   /etc/my.conf     /usr/local/mysql_slave/                             这是一个大的区别

更 改 :        

port = 3307

soket  =  /tmp/mysql_slave.sock

添 加 :datadir = /data/mysql_slave


wKiom1YY-ezwqSs0AAEbTRDXQZM899.jpg

初始化:                                                  成功后mysql_slave下有两个目录

. /scripts/mysql_install_db   --user=mysql   --datadir=/data/mysql_slave


启动脚本:

cd   /etc/init.d              cp   mysqld   mysqld_slave

编辑设置: 

basedir  =  /usr/local/mysql_slave

datadir   =  /data/mysql_slave

搜索my.cnf   

改   conf = etc/my.cnf     为    conf=$basedir/my.cnf              

或   在datadir下一行添加  conf=$basedir/my.cnf    配置文件路径

 

wKioL1YY-l2DDxS2AABkjzpIwio493.jpg

启 动:/etc/init.d/mysqld    start                    

查 看:ps aux |grep mysql                    netstat -lnp | grep mysql

当理解这种配置方式后,我们就可以在一台机子上配置多个mysql服务了;


---------------------------------安装第三个mysql------------------------------------


---------------主从同步配置----------------------

随机选一个3306进程为主;3307为从

主 A : 建一个测试库

登 录: 

mysql   -S    /tmp/mysql.sock              或  mysql   -h127.0.0.1    -p3306              登录3306

mysql   -S    /tmp/mysql_slave.sock  或  mysql   -h127.0.0.1    -p3307              登录3307


mysql的真实命令是/usr/local/mysql/bin/mysql,因为以前我们设置过path,所以可以直接用;

建 库 :create  database  db1;                                   注意分号

退 出 :quit   或  exit

拷贝一个库测试:

mysqldump    -S    /tmp/mysql.sock  mysql  >  123.sql               mysql库拷贝到123.sql

mysql        -S      /tmp/mysql.sock   db1    <   123.sql               库转到db1中

登录查看:

mysql   -S    /tmp/mysql.sock

use  db1;          >>>          show  tables;      >>>      quit

编辑配置:vim    /etc/my.cnf

        打开    server-id  = 1                               随意指定,不跟 从 的id一样即可

                    log-bin  =  teng                           自定义,会在mysql目录下生成名字的文件

        添加    binlog-do-db = db1,db2                白名单,允许同步这俩库

                   #binlog-ignore-db = db1              黑名单

wKioL1YY-y-Am8xaAACkahhz_iQ790.jpg

重 启 :/etc/init.d/mysqld    restart


登 录 :

授权一个可以传输bin_log的用户,也可以多个;

grant    replication    slave   on   *.*        to    'repl'@'127.0.0.1'    identified   by   'rep1';  

授权      权限              从      on   所有文件  to  用户名@主机IP         密码;

flush   privileges;                            刷新权限    

flush tables with read lock;              表锁为只读 

show  master  status;                       读取 主 的一个状态


从:需要另开一个终端测试

编辑配置文件:  vim   /usr/local/mysql_slave/my.cnf

                        server-id     =  11                                           随意,跟主id不一样就行

wKiom1YY-9bD475BAACaMeKYbmA142.jpg

也可以实现只同步哪个库,或不同步哪个库的功能;

创建库:  

mysql   -S   /tmp/mysql_slave.sock   -e    "create database db1"

mysql   -S   /tmp/mysql_slave.sock   db1  <  123.sql

想要同步数据库,前提必须先有个一模一样的库;因为我们用的是一个主机,所以直接重定向就可以了;否则我们要把源文件库123拷过来,再传给新建的库db1;


登 录 : mysql   -S    /tmp/mysql_slave.sock

连 接 :  change master to  master_host='127.0.0.1', master_port=3306, master_user='repl', master_password='repl', master_log_file='teng.000001',master_log_pos=330;


后边的file和pos都需要根据主服务器的show  master  status中的数据写;

出现下行则配置成功

Query OK, 0 rows affected (0.09 sec)

打开 从 :

slave   start;

查 看:

show   salve  status\G;

wKiom1YY_ImSv04NAACSyXprVbk212.jpg

这两行为yes则配置成功。

问题:

wKiom1YY_XGx32emAAHta0OCXg8109.jpg

解决当法:http://www.jb51.net/article/48625.htm 


-----------------测试主从------------------------

主: mysql -S /tmp/mysql.sock      >>>    use  db1;  >>>    show   tables;

删 除:drop  table   proc;        

从:mysql  -S  /tmp/mysql_slave.sock     >>>   use  db1;   >>>    show  tables;


或者去主中增加一个库·表,改动表中数据等;去从上都能看到;

注意:千万不要在 从 上建表,改动什么的,那样 主 在操作时会因为找不到 从 上对应的库,而发生紊乱的

这种机制很容易中断,因此我们要给他做个监控程序脚本,监听最重要的slave-io 和slave-sql 的状态,当不是yes的时候,马上发邮件或者短信给你;



wKiom1YY_cuCC82KAAE99SfwYjY259.jpg

wKioL1YY_eWjh_u4AAGXOVGB3Uk217.jpg


========================================================================================

关于log_bin日志 

  my.conf 文件中的[mysqld]标签下的log_bin指定日志文件,如果不提供文件名,mysql将自己产生缺省文件名。mysql会在文件名后面自动添加数字引,每次启动服务时,都会重新生成一个新的二进制文件。此外,使用log-bin-index可以指定索引文件;

使用binlog-do-db可以指定记录的数据库;使用binlog-ignore-db可以指定不记录的数据库。

而且,MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,否则不会起作用。以后对数据库每做的一次操作,都会在binlog中有所记录。



FAQ:

mysql> show slave status; 执行后部分结果如下

Slave_IO_State:Waiting for master to send event

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

查看数据库却依然无法同步,原因在哪里?

解决办法:

1) 尝试重启master数据库;

2) 在重启slave数据库之前,必须先删除data目录下的master.info文件,因为master.info记录了上次要连接主库的信息,如果不删除,即使my.cnf里进行了修改,手动修改Position(偏移量)也还是同步不了,因为读取的还是偏移量出错时的master.info文件信息。

# rm -f data/master.info

# support-files/mysql.server start

Starting MySQL.           [  OK  ]

再次查看slave,同步终于成功了。

mysql> show processlist;

id|User          |Host|db      |Command  |Time      |state

1| system user |       | NULL   | Connect |1196 | Waiting for master to send event

2 | system user |    | NULL   | Connect |-55692 | Slave has read all relay log; waiting for the slave I/O thread to

3 | root   |localhost|icinga| Query|  0 |NULL | show processlist





mysql> show slave status;命令,看到下面的显示结果

Slave_IO_Running:Connecting

Slave_SQL_Running:Yes 

看到上面的问题,说明是从服务器无法正常连接到主服务器导致。原因一般和下面几种情况有关:

  Iptables防护墙阻止了3306端口

  主mysql服务器的grant授权命令有误

  主mysql服务器的监听端口不是0.0.0.0:3306,导致别的服务器无法连接到主mysql

解决办法:

首先,关闭了iptables;

然后,检查主mysql服务器的grant授权命令,正确无误,这一点排除。

其次,查看主mysql的监听端口,默认是:::3306,不知道是否因为这个问题导致

修改主服务器的my.cnf文件,添加下面语句

bind-address = 0.0.0.0

重启mysq.server服务

再次netstat –an|more 查看3306端口,出现了0.0.0.0:3306,说明修改成功。

登录到从mysql服务器上,远程连接

# bin/mysql -h 192.168.123.75 -umysync -p123456

Your MySQL connection id is 8

Server version: 5.6.10-log Source distribution

mysql>

连接成功。

最后重新执行主从操作:

主mysql服务器:mysql> show master status;

从mysql服务器:mysql> stop slave;

从mysql服务器:mysql> change master to……;

从mysql服务器:mysql> start slave;

从mysql服务器:mysql> show slave status;

Slave_IO_Running:Yes

Slave_SQL_Running:Yes 

再次测试主从同步,成功。