一步一步搭建mysql主从同步
下载mysql数据库
$ wget http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz
tar vzxf mysql-5.1.73.tar.gz
编译安装
最好专门创建一个用户mysql来安装数据库。
MYSQL_BASEDIR=$HOME/mysql
cd mysql-5.1.73
./configure
--prefix=${MYSQL_BASEDIR}
--with-charset=utf8
--with-extra-charsets=gbk,utf8,ascii,big5,latin1,binary
--with-unix-socket-path=${MYSQL_BASEDIR}/tmp/mysql.sock
--with-mysqld-user=mysql #以哪个用户执行mysqld进程
make
make install
初始化数据库
复制必要的配置文件和启停脚本
cd ${MYSQL_BASEDIR}
mkdir etc log tmp var
cp share/mysql/my-medium.cnf etc/my.cnf
cp share/mysql/mysql.server bin/
修改配置文件
vim etc/my.cnf
在[mysqld]下添加配置项:
basedir= ${MYSQL_BASEDIR} # ${MYSQL_BASEDIR}是你的mysql安装目录
datadir = ${MYSQL_BASEDIR}/var # mysql数据路径
tmpdir = ${MYSQL_BASEDIR}/tmp # 临时文件路径
slave-load-tmpdir = ${MYSQL_BASEDIR}/tmp # 从服务器同步LOAD DATA INFILE语句时创建临时文件的目录名
port = 3306 # 如果修改port,[mysqld] 和 [client]下的port都要修改
pid-file = ${MYSQL_BASEDIR}/var/mysql.pid # mysqld PID文件位置
#以下为可选
socket = ${MYSQL_BASEDIR}/tmp/mysql.sock # 用于指定本地连接的Unix套接字文件位置,[mysqld] 和 [client]下的port都要修改
#skip-name-resolve # 是否仅使用ip验证客户端
#skip-symbolic-links #忽略MyISAM表的数据及索引文件连接到另一个目录下
max_connect_errors = 10000
max_connections = 500
wait-timeout = 30
启动数据库
$ ./bin/mysql_install_db #安装数据库文件
$ ./bin/mysql.server start #出现下面这行说数据库启动ok了
Starting MySQL. [ OK ]
配置mysql用户
使用./bin目录下的mysql命令可以登录到数据库,登录后删除匿名用户并且为root设置密码:
$ mysql -u root
> delete from mysql.user where user='';
> UPDATE mysql.user SET Password = PASSWORD('password') WHERE user='root';
按照以上同样的步骤再搭建一个mysql,注意,如果在同一主机搭建多个mysql实例,那么就需要将端口改成不同才行。
下面开始配置主从同步。
首先在主库新建专门用于同步的数据库账号mysqlsync
> GRANT REPLICATION SLAVE ON *.* TO 'mysqlsync'@'%' IDENTIFIED BY 'password';
主库配置
所有的配置项还是在my.cnf中的[mysqld]下添加。
首先server-id作为MySQL服务器的标识,具有相关联上下游同步系统需具有全局唯一性。主库我们将server-id配置为1。其他主库需要添加的配置有:
server-id=1
# 同步过程中需要忽略的表,支持正则表达式。全库同步时,必须屏蔽mysql系统库和test测试库。
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = test.%
# 需要同步的表,多个表需多次指定,这里我们使用全库同步,方便点
# replicate-do-table = database.table
log-bin = mysql-bin #二进制日志,强制开启
log-bin-index = mysql-bin.index # 记录二进制日志索引文件
relay-log-index = relay-log.index # 记录中继日志索引文件
从库配置
server-id=2
read-only # 在从库开启该选项,避免在从库上进行写操作,导致主从数据不一致(不过对super权限无效哦)
skip-slave-start # 在从库开启该选项,启动数据库后,需手动开启同步进程
relay-log = mysql-relay #中继日志,从库开启
relay-log-index = relay-log.index
log-bin = mysql-bin
log-bin-index = mysql-bin.index
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = test.%
同步设置
启动主数据库,并查看主库状态:
$ ./bin/mysql.server start
$ mysql -u root -p
mysql> show master status;
记下来log文件名和位置,这里是“mysql-bin.000005”和”106“。
然后启动从库,
$ ./bin/mysql.server start
$ mysql -u root -p
mysql> change master to master_host='your_host',master_port=3307,master_user='mysqlsync',master_password='pasword',master_log_file='mysql-bin.000005',master_log_pos=106;
mysql> startslave; #启动从库
mysql> show slave status\G;
最后一条sql命令得到如图结果:
其中Slave_IO_Running和Slave_SQL_Running是yes就对了。
最后,可以验证一下,在主库修改记录,从库可以看到同步过来的变化。