mysql复制的优点主要包括以下3个方面:(一般把"增删改"交给主数据库,"查询"交给从数据库 看需要而言)
1:如果主服务器出现问题,可以快速切换到从服务器提供的服务
2:可以在从服务器上执行查询操作,降低主服务器的访问压力
3:可以在从服务器上执行备份,以避免备份期间影响主服务器的服务
--注意:
一般只有更新不频繁的数据或者对实时性要求高的数据可以通过从服务器查询,实时性高得数据仍能需要从主数据库获得
一:主服务器的配置步骤:
1:登入mysql数据库 mysql -uroot -p123456
2:给从服务器设置授权用户
grant all on *.* to user1@192.168.10.2 identified by "pass123"; (all表示所有权限的意思,授权所有的用户,关于数据库所有的表(只能是这台服务器192.168.10.2,如果主机是字符串单引号扩着'leyangjunpc'):账号是user1 密码是pass123)
* GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'192.168.0.%' IDENTIFIED BY 'p4ssword';(replication主从服务器复制代码的时候用的一个权限)
3:修改主数据库服务器的配置文件my.cnf/ini,开启bin-log日志,并设置server-id的值
log-bin=mysql-bin
server-id=1 (主从server-id一定要保证唯一,不能相同) --一主多从也一样
4:在主服务器上设置读读锁定有效,确保没有数据库操作,以便获得一个一致的快照(选做,建议这么做,这样好就行备份)
flush tables with read lock;
5:查看主服务器上当前的二进制日志名和偏移量值
show master status;
6:目前主数据库服务器已经停止更新操作,生成主数据库的备份,备份的方式两种:
一:cp全部的数据
二:mysqldump备份数据方法(建议使用)
如果主数据库的服务可以停止,那么直接cp数据文件应该是最快的生成快照方法(就是cp数据文件去从数据库执行 tar -cvf data.tar data(整个拷贝))
7:主数据库备份完毕后,主数据库可以恢复写操作,剩下的操作只需要在从服务器上去执行:
unlock tables;
8: 把主数据库的一致性备份恢复到从数据库上,把以上的压缩包解压后放到对应的目录即可
二:从服务器的配置步骤:
->场景(先把数据库复制过来,能后玩同步--主数据改动立马同步过来)
主:mysql/bin/mysqldump -uroot -p test -l -F > "/tmp/test.sql"; 主-备份文件
主:能后将本分文件复制到从数据库:
linux命令:scp /tmp/test.sql 192.168.10.2:/tmp/ 将主/tmp/test.sql 复制到从数据库上去--隧道传输
从:Reset master; 清下日志
从:将刚才复制过来的数据恢复数据test.sql
mysql/bin/mysql -uroot -p123 test
检查看是否联通主服务器:mysql/bin/mysql -uuser1 -p123455 test -h192.168.10.1
1:配置文件中:修改数据库的server-id,注意server-id的值必须是唯一的,不能和主数据的配置相同,如果有多个
从服务器,每个从服务器必须有自己唯一的server-id值
开启bin-log
2:配置文件中->开启和配置:(报错的话用下面的)
master-host = 192.168.10.1 (主数据库IP)
master-user = user1 (授权配置的用户名)
master-password = 123456 (授权配置的密码)
master-port = 3306 (链接主服务器用的端口)
--重启MySQL服务器
*重启报错处理方式*:
错误如下:
120401 15:45:44 [ERROR] C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld: unknown variable 'master-host=192.168.8.111'
120401 15:45:44 [ERROR] Aborting
*千万注意------解决方案--------------------
Mysql版本从5.1.7以后开始就不支持“master-host”类似的参数
在从库上执行如下命令;
change master to master_host='masterIP', master_user='slave', master_password='slvaePASS';
slave start;重启
3:配置完后->检测是否和主服务器同步方法(数据同步成功不成功就看*):
show slave status\G
看到:* Salve_IO_Running :Yes (表示成功的把主服务器的bin-log日志拿回来了且同步,写一行我就同步一行)
* Salve_SQL_Running :Yes (拿过来的bin-log日志并成功的执行了sql语句,一主数据一致)
--看到为yes的说明已经和主服务器取得同步
master_Log_File:mysql-bin.00002 (同步过来的bin-log日志)
Read_Master_Log_Pos:106 (位置,show master status主看下就知道)
Connect_Retry:60 (每隔60秒回去主服务器同步bin-log日志)
踪迹日志:
Relay-Log_File:localhost-relay-bin.00004 (从服务器生成的日志文件,不叫mysql-bin.xxx)
数据同步过来后,我们查询数据就可以去从服务器上查询不用去主服务器,减轻负载
4:从数据库常用命令
(1)start slave 启动复制线程(去主服务器拿数据)
(2)stop salve 停止复制线程
(3)show slave status 查看数据库状态-与主服务器一些链接状态信息
(4)show master logs 查看主数据库bin-log日志
(5)change master to 动态改变主服务器的配置
(6)show processlist 查看数据库运行进程
5:mysql常见错误
********从数据库无法同步********
show slave status 显示slave_sql_runing为NO,seconds_behind_master 为null
原因:A:程序可能在slave上进行了写操作
B:也可能是slave机器重启后,事物回滚造成的
解决一:slave stop;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 设置一个全局的参数
slave start;
解决二:(1):salve(从)库, slave stop; --停掉slave服务
master(主)库,show master status; 得到&A日志文名 &B 位置--得到主服务器上当前的二进制日志和偏移量
(2)salve库:查看状态,能后到salve服务器上执行手动同步--人为操作
change master to
master_host="192.168.101.1",
master_uset="user1",
master_password="pass123456",
master_port=3306,
master_log_file="mysql-bin.00003", 步骤(1)查出来的&A 日志文件名
master_log_pos=98; 步骤(1)查出来的&B 位置 --能后手动同步
(3)启动salve服务
salve start;
(4)通过show salve status 查看
Salve_SQL_Runing 为yes,
Seconds_Behind_Master为0即为正常