您的位置:首页 > 数据库 > MySQL

第 二 十 六 天 :mysql 主 从 配 置

2015-10-10 20:23 609 查看
小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/attachment/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




初始化: 成功后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 配置文件路径




启 动:/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 黑名单



重 启 :/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不一样就行



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

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;



这两行为yes则配置成功。
问题:



解决当法: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的时候,马上发邮件或者短信给你;








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

关于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

再次测试主从同步,成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux