标签:mysql 主从复制
MySQL的集群,MySQL的主从架构,MySQL的负载均衡
Mysql主从同步
原理:
Replication 线程
Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。
要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全 顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。
MySQL 复制的基本过程如下:
1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;
3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”
4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的
实现步骤:
环境:
Master服务器:192.168.1.215
Slave服务器 :192.168.1.216
两台服务器中安装了相同版本的mysql。
1.修改master服务器mysql的配置文件my.cnf ,将server-id设置为1,并开启binlog ,并重置binlog 。
vim /etc/my.cnf
[mysqld]
........
........
server-id= 1
log-bin=mysql-bin
重启服务 : service mysql restart
重置binlog :mysql>reset master;
2.授权一个用户可以从从服务器登录主服务器进行备份,将主服务器上的数据库全部导出拷贝到从服务器上。
授权:grant replication slave on *.* to ‘wcy‘@‘192.168.1.216‘ identified by ‘123456‘;
(完成后可以在从机上做链接测试 在从服务器终端上输入命令: mysql -h192.168.1.215 -uwcy -p,如果不能连通请检查主机防火墙或主机 MySQL 端口)
查看创建的用户:
> select user.host from mysql.user;
mysql锁表只读(其他账户登录mysql后无法进行写表操作,防止备份数据库后,主mysql表更新,导致和从数据库内容不一致)
> flush tables with read lock;
查看锁表倒计时时间:
> show variables like ‘%timeout%‘;
------------------------
....
wait_timeout | 28800
------------------------
将master的数据库表全部备份导出,并传送到slave服务器上。
#mysqldump -u root -p123456 --opt --flush-logs --all-database > /root/allbak.sql
#scp allbak.sql root@192.168.1.216:/root
查看mysql偏移量(数据库如果有写操作,偏移值会递增)
# mysql -u root -p123456 -e "show master status"
3、在从服务器上
恢复server的数据库到slave
#mysql -u root -p123456 < /root/allbak.sql
vim /etc/my.cnf
[mysqld]
....
server-id= 2
log-bin=mysql-bin
#service mysql restart
4、配置slave
mysql>slave stop;
mysql> reset slave;
mysql>change master to master_host=‘192.168.1.215‘,master_user=‘wcy‘,master_password=‘123456‘,master_port=3306,master_log_file=‘mysql-bin.000003‘,master_log_pos=106;
mysql>slave start;
mysql>show slave status\G;
如果这两行为yes则成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
最后回到主mysql数据库解锁(mysql master)
# mysql -u root -p123456
> unlock tables;
测试主从是否同步:
(server)
# mysql -u root -p123456 -e "create database test02;"
# mysql -u root -p123456 -e "show databases like ‘test02‘;"
------------
+-------------------+
| Database (test02) |
+-------------------+
| test02 |
+-------------------+
------------
(cilent)
# mysql -u root -p123456 -e "show databases like ‘test02‘;"
-------------
+-------------------+
| Database (test02) |
+-------------------+
| test02 |
+-------------------+
-------------
测试成功。。
一、环境
master:192.168.124.51
MYSQL版本:5.1.48-community-log
slave: 192.168.124.52
MYSQL版本:5.1.48-community-log
二、主从数据库
将主机上现有的数据库备份,然后在从机上建立同名数据库并还原。
(这次做的是51上的两个数据库database1和database2)
三、master和 slave上的相关配置
在/etc目录下可能无my.cnf文件,从/user/share/mysql目录中拷贝my-medium.cnf 到/etc并修改成my.cnf(master和slave上一样)。
如 # cp /user/share/mysql/my-medium.cnf /etc/my.cnf
1.修改master上的配置文件my.cnf。
在[mysqld]下添加如下字段:
server-id=1
log-bin=log
binlog-do-db=database1 //需要同步的数据库
binlog-do-db=database2
binlog-ignore-db=mysql //被忽略的数据库
在master上位slave添加一个同步账号
grant replication slave on *.* to ‘AffairLog‘@‘192.168.124.52‘ identified by ‘password‘;
//在slave上登陆成功
重启master的mysql服务:
service mysql restart;
用show master status命令查看日志情况
mysql> show master status\G;
*************************** 1. row ***************************
File: log.000027
Position: 3151
Binlog_Do_DB: database1,database2
Binlog_Ignore_DB:
1 row in set (0.00 sec)
2.修改slave上的配置文件my.cnf。
在[mysqld]下添加如下字段:
server-id=2
master-host=192.168.124.51
master-user= AffairLog
master-password= password
master-port=3306
master-connect-retry=60
replicate-do-db=database1 //同步的数据库
replicate-do-db=database2
replicate-ignore-db=mysql //被忽略的数据库
重启slave的mysql服务:
service mysql restart;
在进入slave机中的mysql。
mysql>start slave;
mysql>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.124.51
Master_User: AffairLog
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: log.000027
Read_Master_Log_Pos: 3151
Relay_Log_File: localhost-relay-bin.000379
Relay_Log_Pos: 245
Relay_Master_Log_File: log.000027
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: database1,database2
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 3151
Relay_Log_Space: 543
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
如果Slave_IO_Running、Slave_SQL_Running状态为Yes则表明设置成功。
四、出现问题
Slave_IO_Running: No或者Slave_SQL_Running: No
1.停掉slave服务
mysql> slave stop;
Query OK, 0 rows affected (2.01 sec)
2.解决办法
解决办法1
a.在master上查看。
mysql> show master status\G;
*************************** 1. row ***************************
File: log.000027
Position: 3151
Binlog_Do_DB: database1,database2
Binlog_Ignore_DB:
1 row in set (0.00 sec)
b.到slave上手动同步。
mysql>change master to
>master_host=‘192.168.124.51‘,
>master_user=‘AffairLog‘,
>master_password=‘password‘,
>master_log_file=‘log.000027‘,
>master_log_pos=3151;
Query OK, 0 rows affected (0.00 sec)
解决方法2
mysql> slave stop;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
3.启动slave服务
mysql> slave start;
4.再次查看Slave_IO_Running、Slave_SQL_Running状态,为Yes则表明设置成功。
PS:
Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件
Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。
2012.07.06补充:今天遇到从机搬迁,服务器IP改了,虽然之前停掉了主从,但是后来恢复利用上面方法还是没有解决Slave_IO_Running: NO,确认了好几次,后来发现是原来的机子上做了防火墙限制,哦买噶!记上一笔,这是经验!
主从同步从5.1版本开始,配置文件my.cnf文件中不在支持master 命令,只有登录数据库后,通过change master to 命令进行相应的配置
可以在my.cnf配置文件中定义用于主从同步的数据库和日志信息。
主数据库my.cnf配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
open_files_limit = 10240
max_connections = 5000
max_connect_errors = 6000
table_cache = 614
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 300
#thread_concurrency = 8
query_cache_size = 512M
query_cache_limit = 2M
query_cache_min_res_unit = 2k
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 246M
max_heap_table_size = 246M
max_binlog_cache_size = 8M
max_binlog_size = 1G
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
interactive_timeout = 120
wait_timeout = 120
skip-name-resolve
#slave-skip-errors = 1032,1062,126,1114,1146,1048,139
#log_config
expire_logs_day=30
long_query_time = 3
log-slave-updates
back_log = 600
log-error = /var/lib/mysql/log/error_log/mysql_error.log
log-bin = /var/lib/mysql/log/bin_log/bin.log
binlog_cache_size = 4M
log-slow-queries = /var/lib/mysql/log/slow_query_log/slow.log
long_query_time = 5
#general_log = 1
#general_log_file = /var/lib/mysql/log/query_log/query.log
character_set_server=utf8
server-id=1
binlog-do-db=test01
binlog-ignore-db=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0
[mysqld_safe]
pid-file=/var/run/mysqld/mysqld.pid
[client]
#default-character-set=utf8
[mysql]
default-character-set=utf8
从数据库服务器的my.cnf配置文件
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
# The MySQL server
[mysqld]
#datadir=/usr/local/mysql/data
port = 3306
socket = /tmp/mysql.sock
table_open_cache = 64
net_buffer_length = 8K
server-id=2
open_files_limit = 10240
max_connections = 5000
max_connect_errors = 6000
table_cache = 614
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 300
#thread_concurrency = 8
query_cache_size = 512M
query_cache_limit = 2M
query_cache_min_res_unit = 2k
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 246M
max_heap_table_size = 246M
max_binlog_cache_size = 8M
max_binlog_size = 1G
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
interactive_timeout = 120
wait_timeout = 120
skip-name-resolve
#slave-skip-errors = 1032,1062,126,1114,1146,1048,139
#log_config
expire_logs_day=30
long_query_time = 3
log-slave-updates
back_log = 600
log-error = /usr/local/mysql/data/log/mysql_error.log
log-bin = /usr/local/mysql/data/log/bin_log/bin.log
binlog_cache_size = 4M
binlog_format = MIXED
relay-log-index = /usr/local/mysql/data/log/relay_log/relaylog.index
relay-log-info-file = /usr/local/mysql/data/log/relay_log/relay_log_info
relay-log = /usr/local/mysql/data/log/relay_log/relay.log
log-slow-queries = /usr/local/mysql/data/log/slow_query_log/slow.log
long_query_time = 5
general_log = 1
general_log_file = /usr/local/mysql/data/log/query_log/query.log
#master-host=10.69.160.4
#master-user=slave
#master-password=root
#master-port=3306
#master-connect-retry=5
replicate-do-db=test01
replicate-ignore-db=mysql
#log-bin
#expire_logs_day=30
#general_log = 1
#general_log_file = /usr/local/mysql/data/mysql_query.log
#skip-networking
# Replication Master Server (default)
# binary logging is required for replication
#log-bin=mysql-bin
# binary logging format - mixed recommended
#binlog_format=mixed
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
#server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
本文出自 “咚咚的博客” 博客,转载请与作者联系!
标签:mysql 主从复制
原文地址:http://weadyweady.blog.51cto.com/3012956/1627846