Mysql主从同步实现教程
启动 service mysqld restart
mysqld_safe &
源码 :
./configure --prefix=/usr/local/mysql
make
make install
初始化密码:用mysqladmin
mysqladmin -u root password “newpass”
如果root已经设置过密码,采用如下方法
mysqladmin -u root password oldpass “newpass”
实现原理:
主服务器将更新写入二进制日志文件binlog,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后*并等待主服务器通知新的更新。
增量更新
复制如何工作:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
主从复制解决的问题:
数据分布
负载平衡
备份
高可用性和容错性
mysql不同版本之间能否进行数据的同步?
可以,但可能出现同步的不稳定(兼容性问题),可能会在某些函数处理、日志读取、日志的解析重演上等上发生异常,导致同步报错而需手工处理。
官方建议 版本保持一致,slave至少要和master的版本前两个号相同,可高于master,版本向前兼容
引擎不一致可以吗?:
可以,bin-log存储的是sql语句,增删改是没问题的,一般主库使用innodb,从库使用myisam,做读写分离。
做主从一定要两台机器吗?
只要有两个或以上的mysql服务即可,可以在同一台机器上启动多个mysql服务
部署方案: 一主多从 主主互备
实验流程:主服务器一般有数据的情况扩展成主从复制
<1> 创建复制账号
<2> 配置主库和从库
<3> 启动复制
利用两个虚拟机,安装好mysql(版本5.1以上),指定主服务器(192.168.1.241)和从服务器(192.168.1.242)
1. 在主服务器上创建账号用于备份
create user backuser
grant replication slave on *.* to backuser@‘192.168.1.134’identified by ‘123456’
grant all privileges on *.* to user1@192.168.1.134 identified by '123456'
grant : 授权
replication slave ,all privileges 操作动作 select update delete
on 作用范围
*: 库
*: 表
to:指定账号
user1,backuser:账号
@ 接 访问来源
192.168.134 允许从192.168.1.%用backuser连接
identified by : 设置密码
查询用户验证:
select distinct user from mysql.user
show grants for backuser@'192.168.1.242'
2. 配置文件查看 /etc/my.cnf
[mysqld]
batadir : 数据文件保存目录
socket: 用于客户端与服务器端通信的socket文件
[mysqld-safe]
log_error : 错误日志记录文件
pid_file : 进程ID保存的文件
3. 创建一个数据库php1503,数据表test,字段有:id stuname age 。。。
create database php1503;
create table test(
id int auto_increment comment '主键id',
stuname varchar(16) not null comment '姓名',
age tinyint not null default 0 comment '年龄'
primary key(id)
)engine=innodb default charset=utf8 auto_increment=1
查看sql语句:show create table test;
查看表结构 desc test 或者 desc test\G; \G表示行列倒置显示
查看索引 show indexes from test;
4. 添加数据
insert into test(stuname,age) values('张三',18),('李四',20),('王五',24);
查询 select * from test;
5. 备份已有的数据
mysqldump -uroot -p123 php1503 -l -F > /tmp/test.sql
-l : 读锁
-F : flush logs,重新生成新的日志文件,包括log-bin日志
6. 将test.sql拷贝到从服务器,并恢复到数据库
scp /tmp/test.sql root@192.168.1.242:/tmp
从库创建php1503数据库,并恢复文件
create database php1503;
mysql -uroot -p123456 php1503 -v -f < /tmp/test.sql;
-v 查看导入的详细信息
-f 遇到错误可以跳过,继续执行下面的语句
7. 主库是否开启binlog
show master status
查看/var/lib/mysql 下是否存在mysql-bin.000001 和 mysql-bin.index文件
8. 修改主库的/etc/my.cnf,开启binlog配置
[mysqld]
log_bin=mysql-bin
#启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
binlog-do-db=php1503 #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
binlog-ignore-db=mysql #不同步mysql系统数据库
server_id = 1 有些mysql版本根本不允许使用1,建议修改成其他数字
#设置服务器id
character-set-server=utf8
重启主库 service mysqld restart / pkill mysqld && mysqld_safe
9. 查看binlog文件
mysqlbinlog mysql-bin.000001
10 配置从服务器的/etc/my.cnf
log_bin = mysql-bin 可以不开启
server_id = 12 // 必须的
relay_log = mysql-relay-bin // 中继日志
log_slave_updates = 1 // slave将复制事件写进自己的二进制日志
read_only = 1
旧版本额外配置:
log_bin=mysql-bin #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
replicate-do-db=php1503
replicate-ignore-db=mysql
read_only=1
server_id = 12
character-set-server=utf8
master-host = 192.168.1.241
master-user = backuser
master-password = 123456
master-port = 3306
重启服务器
11 启动复制,告诉备库如何连接主库并重放二进制日志
mysql中执行
change master to master_host='192.168.1.241', master_user='bakuser',master_password='123456',master-port='3306',master_log_file='mysql-bin.000001',master_log_pos=0;
master_log_pos=0 表示日志从头开始读起
12. 检查复制是否正确执行
show slave status
Slave_IO_State Slave_IO_Running Slave_SQL_Running
13. 开始复制
start slave
show slave status
查看线程 show processlist\G
14. 在主库添加数据,查看从库的变化
备份方法:
1. 冷备份 关闭主库,把数据复制到备库
2. 热备份 如果是myisam表,可以使用mysqlhotcopy或rsync复制数据
3. mysqldump
<1>锁表
mysql> FLUSH TABLES WITH READ LOCK;
<2>在另一个连接用mysqldump创建一个你想进行复制的数据库的转储:
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
shell> mysqldump -uroot -p123 php1503 -l -F > /tmp/test.sql
<3>对表释放锁。
mysql> UNLOCK TABLES;
4. binlog恢复
mysqlbinlog --no-defaults binlog-file | mysql -uroot -p123456
恢复binlog-file二进制日志文件
mysqlbinlog --no-defaults --start-position=‘500’--stop-position=‘644’ mysql-bin.000004 | mysql -uroot -p123456 t1
reset master 清除所有日志