首页 > 代码库 > mysql主从复制
mysql主从复制
对于主服务器来讲,会不停的吧当前数据库中产生的信息记录进二进制日志中,如果服务器端接收到客户端一个需要改变数据的语句之后,这个数据如果采用的是InnoDB的话,这些数据本身首先被记录进事务日志,这些会影响数据的语句会被记录进二进制日志中,而复制讲的是,另外一个从服务器上,被动的接受数据,本身并不接受客户端链接进来做任何写操作,复制是单向的,只能从主服务器到从服务器,因此,从服务器中的数据都是来自于主服务器,主服务是监听在3306端口上,从服务器启动了一个客户端进程,这个进程会向服务器点提供数据服务的端口发起请求,请求读取二进制日志中的事件,在主服务器点上,mysql主要提供认证服务,同时会启动一个sqldump线程,这个线程在接收到用户的请求后,并确保这个用户具有权限之后,会去读取二进制日志中的事件,如果客户端是第一次来请求,那么这个进程就读取日志中的第一个事件,读一个就发送给客户端一个,从服务的进程在接收到主服务器发行过来的数据之后,会保存在本地的中继日志,然后再启动一个具有特殊功能的线程,去中继之日中读取事件,读一行,在本地执行一下,以此类推,最终生成本地的数据库。mysql的复制时异步的,因此在接收到用户的请求之后,将结果返回给用户。并将信息存放在内存中,之后再记录进二进制文件中,这样会造成从服务器落后与主服务器,但是这样也是有好处的,如果你有一个错误操作,在这个时间内,立即去从服务器上备份数据就OK,这需要mysql管理员把握。
2、mysql主从复制的实现
[1]首先确保主从服务器上的Mysql版本相同
[2]在主服务器上操作
(1)设置一个从数据库的账户,使用REPLICATION SLAVE赋予权限,如:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave001'@'192.168.0.99' IDENTIFIED BY '123456'; mysql> FLUSH PRIVILEGES;(2)修改主数据库的配置文件my.cnf,开启BINLOG,并设置server-id的值,修改之后必须重启Mysql服务
log-bin = mysql-bin server-id=10(3)之后可以得到主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复
mysql> show master status\G;(4)将主数据库数据导入到从服务器,可以将数据库原始文件拷贝过去,也可以通过导出脚本,然后倒入到从服务器中,导出脚本前,为确保数据一致,需要对主数据库进行READ LOCK
mysql> flush tables with read lock;然后进行数据库导出
mysqldump -h127.0.0.1 -p3306 -uroot -p test > /home/ceshi/test.sql数据备份好之后,需要对主服务器恢复写错做
mysql> unlock tables;
[3]在从服务器上操作
(1)将导出的test.sql导入到从数据库上。
(2)修改从数据库的配置文件my.cnf,指定主数据库的基本信息
server-id = 20 read-only = 1 //开启只读模式(3)配置从服务器连接主服务器
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.98', MASTER_USER='slave001', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=107; mysql> START SLAVE;(4)在从服务器进行show salve status验证
mysql> SHOW SLAVE STATUS\G如果Slave_IO_Running或者Slave_SQL_Running表示yes,就代表正常
mysql主从复制