这篇文章主要为大家详细介绍了MySQL主从复制(master-slave)实际操作案例,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随四海网的小编小韵来看看吧!
在这一章节里, 我们来了解下如何在 Mysql 中进行用户授权及主从复制
这里先来了解下 Mysql 主从复制的优点:
1、 如果主服务器出现问题, 可以快速切换到从服务器提供的服务
2、 可以在从服务器上执行查询操作, 降低主服务器的访问压力
3、 可以在从服务器上执行备份, 以避免备份期间影响主服务器的服务
注意一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询, 实时性要求高的数据仍然需要从主数据库获得
在这里我们首先得完成用户授权, 目的是为了给从服务器有足够的权限来远程登入到主服务器的 Mysql
在这里我假设
主服务器的 IP 为: 192.168.10.1
从服务器的 IP 为: 192.168.10.2
Mysql grant 用户授权
查看 Mysql 的用户表
代码如下:
msyql> mysql -uroot -p123123;
msyql> select user, host, password from mysql.user;
代码如下:
+------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| root | 127.0.0.1 | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
+------------------+-----------+-------------------------------------------+
代码如下:
msyql> ? grant //查看 grant 的详细用法
msyql> grant all on *.* to user1@192.168.10.2 identified by "123456"; // *.* = 所有的数据库.所有的表
//或者
msyql> grant replication slave on *.* to 'user2'@'192.168.10.%' identified by "123456"; // %代表通配符
代码如下:
+------------------+--------------+-------------------------------------------+
| user | host | password |
+------------------+--------------+-------------------------------------------+
| root | localhost | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| root | 127.0.0.1 | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| user1 | 192.168.10.2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| user2 | 192.168.10.% | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------------+--------------+-------------------------------------------+
代码如下:
msyql> mysql -uuser1 -p123456 -h192.168.10.1;
修改主服务器 mysql 配置文件:
代码如下:
shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;
/********** my.cnf **********/
[mysqld]
#开启慢查询日志, 记录查询过长的 sql 语句,以便于优化
log_slow_queries = /var/log/mysql/mysql-slow.log
#开启 bin-log 日志
log-bin = /var/log/msyql/mysql-bin.log
代码如下:
shawn@Shawn:~$ sudo /etc/init.d/mysql restart
代码如下:
mysql> show variables like "%log_%";
| log_bin | ON |
| log_slow_queries | ON |
代码如下:
mysql> flush logs;
代码如下:
mysql> show master status;
代码如下:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 107 | | |
+------------------+----------+--------------+------------------+
mysql> show master logs;
代码如下:
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 4340 |
| mysql-bin.000002 | 107 |
+------------------+-----------+
mysql> reset master;
代码如下:
shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000001 | more
代码如下:
#如果有字符集问题的话可以执行:
shawn@Shawn:~$ mysqlbinlog --no-defaults /var/log/mysql/mysql-bin.000001
shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000002 | mysql -uroot -p123123 test;
恢复 mysql-bin.000002 中所有的操作到 test 数据库中
shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000002 --start-position="193" --stop-position="398" | mysql -uroot -p123123 test;
恢复 mysql-bin.000002 中指定的操作(position)到 test 数据库中
代码如下:
shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;
/********** my.cnf **********/
#取消 server-id 注释符号
server-id = 1
/****************************/
#重启 Mysql 服务
shawn@Shawn:~$ sudo /etc/init.d/mysql restart
代码如下:
#清空一下主服务器的 bin-log 日志, (可选: 保险操作, 防止主从 bin-log 日志混乱)
mysql> reset master;
#然后备份导出主服务器中现有的 test 数据库
shawn@Shawn:~$ mysqldump -uroot -p123123 test -l -F > /tmp/test.sql;
-F = flush logs, 生成新的日志文件, 包括 bin-log 日志
-l = lock 数据库, 防止在导出的时候被写入数据, 完成后自动解锁
#完成后把文件传输给从服务器
shawn@Shawn:~$ scp /tmp/test.sql 192.168.10.2:/tmp/
#然后再查询确保一下从服务器已经成功授过权
mysql> show grants for user1@192.168.10.2\G
*************************** 1. row ***************************
Grants for user1@192.168.10.2:
GRANT ALL PRIVILEGES ON *.* TO 'user1'@'192.168.10.2'
IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
代码如下:
#清空一下从服务器的 bin-log 日志, (可选: 保险操作)
mysql> reset master;
#然后导入主服务器中现有的数据
shawn@Shawn:~$ mysqldump -uroot -p123123 test -v -f < /tmp/test.sql;
代码如下:
shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;
/********** my.cnf **********/
#取消 server-id 注释符号, 并修改值
server-id = 2
#取消 master-host 注释符号, 并修改值
master-host = 192.168.10.1
#取消 master-user 注释符号, 并修改值
master-user = user1
#取消 master-password 注释符号, 并修改值
master-password = 123456
#取消 master-port 注释符号, 并修改值, 主服务器默认端口号为: 3306
master-port = 3306
/****************************/
#重启 Mysql 服务
shawn@Shawn:~$ sudo /etc/init.d/mysql restart
代码如下:
#在从服务器中登入自身的 Mysql
msyql> mysql -uroot -p123123;
#查看是否已经取得同步
msyql> show slave status\G
*************************** 1. row ***************************
Connect_Retry: 60
Master_Log_FIle: mysql-bin.000002
Read_Master_Log_Pos: 106
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
代码如下:
#启动复制线程
msyql> start slave
#停止复制线程
msyql> stop slave
#动态改变到主服务器的配置
msyql> change master to
#查看从数据库运行进程
msyql> show processlist
原因:
一、 程序有可能在 slave 上进行了写操作
二、 也有可能是 slave 机器重启后, 事务回滚造成的
解决方法一:
代码如下:
msyql> stop slave;
msyql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
msyql> start slave;
代码如下:
msyql> stop slave;
#查看主服务器上当前的 bin-log 日志名和偏移量
msyql> show master status;
#获取到如下内容:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 286 | | |
+------------------+----------+--------------+------------------+
#然后到从服务器上执行手动同步
msyql> change master to
-> master_host="192.168.10.1"
-> master_user="user1"
-> master_password="123456"
-> master_post=3306
-> master_log_file="mysql-bin.000005"
-> master_log_pos=286;
msyql> start slave;
本文来自:http://www.q1010.com/177/9365-0.html
注:关于MySQL主从复制(master-slave)实际操作案例的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。
关键词:MYSQL
四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。