Q:MySQL主从是啥意思?作用是?原理是?怎么实现?
A:MySQL主从:两台主机master和slave,实现同步备份数据库,读写分离等等.....(详细请戳 http://my.oschina.net/cimu/blog/165019)
环境准备(都是CentOS release 6.4 Final):
① 虚拟机上的:192.168.5.167【Linux version 2.6.32-358.23.2.el6.i686】
② 台式机上:192.168.5.19【Linux version 2.6.32-358.el6.x86_64】
【为了避免不必要的麻烦,主从服务器的MySQL版本尽量保持一致】
软件包:
① mysql-5.5.33.tar.gz(http://mysql.llarian.net/Downloads/MySQL-5.5/mysql-5.5.33.tar.gz)提示:安装ncurses-devel包
② cmake(mysql5.5都需cmake来编辑)提示:安装gcc-c++包
搭建服务器的MySQL出现错误:
【mysql启动失败 The server quit without updating PID file】一度重装cmake和mysql达N次(想重装系统的心都有了),网上搜索答案许久,一堆解决方法如下:
① 1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限
解决方法 :给予权限,执行 chown -R mysql:mysql /var/data chmod -R 755 /usr/local/mysql/data然后重新启动mysqld!
② 可能进程里已经存在mysql进程
解决方法:用命令ps -ef|grep mysqld查看是否有mysqld进程,如果有使用kill -9 进程号杀死,然后重新启动mysqld!
③ 可能是第二次在机器上安装mysql,有残余数据影响了服务的启动。
解决方法:去mysql的数据目录/data看看,如果存在mysql-bin.index,就赶快把它删除掉吧,它就是罪魁祸首了。本人就是使用第三条方法解决的 !
④ mysql在启动时没有指定配置文件时会使用/etc/my.cnf配置文件,请打开这个文件查看在[mysqld]节下有没有指定数据目录(datadir)。
解决方法:请在[mysqld]下设置这一行:datadir = /usr/local/mysql/data
⑤ skip-federated字段问题
解决方法:检查一下/etc/my.cnf文件中有没有没被注释掉的skip-federated字段,如果有就立即注释掉吧。
⑥ 错误日志目录不存在
解决方法:使用chown chmod命令赋予mysql所有者及权限
⑦ selinux惹的祸,如果是centos系统,默认会开启selinux
解决方法:关闭它,打开/etc/selinux/config,把SELINUX=enforcing改为SELINUX=disabled后存盘退出重启机器试试。但是没有解决,最后直接给/usr/local/mysql/data 目录 chmod 777 -R /usr/local/myql/data 问题解决应该是权限问题,不能生成localhost.localdomain.pid 文件
配置单向主从服务器:
①. 主服务器上授权从服务器的账号:
grant replication slave on *.* to 'backup'@'192.168.5.167' identified by 'backup';
show databases;
flush tables with read lock; #锁定数据库写入
show master status;
(此处需重启一下)
【查看master的二进制文件mysql-bin.000001和位置107】
②设置主服务器的/etc/my.cnf里面需要同步复制的数据库和忽略数据库
binlog_do_db=bss_box
binlog_ignore_db=information_schema
binlog_ignore_db=performance_schema
binlog_ignore_db=mysql
binlog_ignore_db=test
③保证主从需要同步的数据库data的一致性
打包 mysql/data
cd /mysql/
tar cvf data.tar data/
------------------------------------------------------
unlock tables;
flush tables;
------------------------------------------------------s
数据转移到从机,然后解压从机相应的数据目录到对应的目录
scp data.tar root@192.168.5.167:/usr/local/mysql/data/
tar -xf data.tar
------------------------------------------------------
④从服务器配置/etc/my.cnf
vi /etc/my.cnf
------------------------------------------------------
log-bin=mysql-bin #【必填】启动二进制文件
server-id=2 #【必填】服务器ID,默认是1,一般取IP的最后一段
------------------------------------------------------
启动MYSQL
service mysqld start
登录MYSQL:
mysql -uroot -pxxx
------------------------------------------------------
change master to master_host='192.168.5.19',master_user='backup',master_password='backup',master_log_file='mysql-bin.000001',master_log_pos=696;
------------------------------------------------------
启动主从:
start slave;
检查主从同步
show slave status\G
【疑难杂症】
1. 设置了master的主服务器数据库删除了mysql-bin.0000XX志文件导致mysql启动不了
【实践过程】网上说:删除日志文件前应停止mysql服务,误操作先删了文件再停止mysql服务导致,实践证明不是这样....
【解决】:主要是是因为没有删干净日志,mysql-bin.index也要删掉(注释my.cnf中的log-bin=mysql-bin后可用,但是这样就不在保存日志文件了,可用改成其他名称)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2. 修改配置文件etc/my.cnf的log-bin=mysql-bin的路径为log-bin=/var/log/mysql/mysql-bin时出现mysql启动失败
【原因】该路径没有mysql权限,访问不了....
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3. 主从数据库的数据是否需要完全一致?设置Binlog_Do_DB为bss_box,只同步bss_box过去
【实践证明】只要保证需要复制同步的数据库数据一致即可
配置双向主从服务器:
①. 主服务器上配置/etc/my.cnf
server-id=19 //ip的最后一段
log-bin=mysql-bin //可自定义目录,目录赋予权限为mysql
binlog_formate=mixed //复制的类型
binlog-do-db=bss_box //需要复制数据库【不填的话,更新其他数据库数据会影响file和position】
binlog-ignore-db= XXXX //忽略复制数据库,选填项
replicate-do-db=bss_box //slave同步的数据库【指定同步主数据库数据】
replicate-ignore-db=XXXXX //slave忽略数据库,选填项
②. 从服务器上配置/etc/my.cnf(同上)
保证主从需要复制同步的数据库数据一致
③. 主从数据库:mysql -uroot -p
各自授权同步账号和设置同步主服务器参数
grant replication slave on *.* to 'backup'@'192.168.5.xx' identified by 'backup';
show master status; //记录file和position
change master to master_host='192.168.5.xx',master_user='backup',master_password='backup',master_log_file='mysql-bin.000001',master_log_pos=107;
start slave;
show slave status\G;
测试...