1、主从复制概述
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
单向复制有利于健壮性、速度和系统管理:
· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。
· 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
2、复制原理
MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志
每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。
MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
在前面的描述中,每个从服务器有3个线程。有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。
默认情况,中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪索引文件中目前正使用的中继日志。 默认中继日志索引文件名为host_name-relay-bin.index。默认情况,在从服务器的数据目录中创建这些文件。可以用--relay-log和--relay-log-index服务器选项覆盖 默认文件名。
日志处理:SQL线程执行完中继日志中的所有事件并且不再需要之后,立即自动删除它。没有直接的删除中继日志的机制,因为SQL线程可以负责完成。然而,FLUSH LOGS可以循环中继日志,当SQL线程删除日志时会有影响。
例如,用FLUSH LOGS或mysqladmin flush-logs。我们也可以在mysql的配置文件里配置日志的保存时长。
3、配置实战
A为主机,B为备份机, 同为双网卡,而且可以通过内网相连
A 内网IP : 192.168.0.1
B 内网IP : 192.168.0.2
1. 主库
vi /etc/my.cnf
#-------------------------------------------------------------------
[mysqld]
..........
log-bin=/var/lib/mysql/mysql-bin.log #打开日志
binlog-do-db=cmge #要复制的库
binlog_ignore_db=mysql #不复制的库
expire_logs_days=3 #日志保存时长
server-id=1 #主服务器ID,主从集群中必须唯一
auto_increment_increment = 2 #自增长key的增加因子
auto_increment_offset = 1 #自增长的开始增长数
log-slave-updates # 为了让slave也能充当master,写relay-log的时候也会写到bin-log
slave-skip-errors=all #忽略所有错误
binlog_cache_size = 4M
max_binlog_size = 1G
max_binlog_cache_size = 2G
sync_binlog = 1
#master-host = 192.168.1.147
#master-user =cmgesync
#master-password =cmgesyncpwd
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)
event_scheduler=ON #开启事件功能
#skip-locking 5.5以后的版本不识别了
skip-external-locking 跳过外部锁定
..........
#----------------------------------------------------------
注意server_id问题
show variables like 'server_id';
set global server_id=41;
2.从库
vi /etc/my.cnf
#-------------------------------------------------------------------
[mysqld]
..........
log-bin=/var/lib/mysql/mysql-bin.log #打开日志
binlog-do-db=cmge #要复制的库
binlog_ignore_db=mysql #不复制的库
expire_logs_days=3 #日志保存时长
server-id=2 #主服务器ID,主从集群中必须唯一
auto_increment_increment = 2 #自增长key的增加因子
auto_increment_offset = 2 #自增长的开始增长数
log-slave-updates # 为了让slave也能充当master,写relay-log的时候也会写到bin-log
slave-skip-errors=all #忽略所有错误
binlog_cache_size = 4M
max_binlog_size = 1G
max_binlog_cache_size = 2G
sync_binlog = 1
#master-host = 192.168.1.147
#master-user =cmgesync
#master-password =cmgesyncpwd
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)
event_scheduler=ON #开启事件功能
#skip-locking 5.5以后的版本不识别了
skip-external-locking 跳过外部锁定
..........
#------------------------------------------------------
sync_binlog = 1
默认情况下,并不是每次写入时都将binlog与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢 失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog写入后与硬盘 同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。
3.设置主从关系
1.在主库上添加帐号 cmge_master_slave 为备份帐号
语法:GRANT REPLICATION SLAVE ON *.* TO ‘用户名’@'主机’ IDENTIFIED BY ‘密码’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘cmge_master_slave’@'192.168.0.2′ IDENTIFIED BY ‘123456′;
Mysql> flush REPLICATION ; -- FLUSH PRIVILEGES;
2.在主库上查出并保存复制要用的日志文件和复制点
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 13479 | cmge | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3.在主库上生成主库快照
mysql>flush tables with read lock;
[root@localhost ~]# mysqldump -uroot -p cmge > cmge.sql;
mysqldump -uroot -proot205db cmge > cmge.sql;
unlock tables; #解锁
4.在从库中设置主从关系
Mysql >change master to
>master_host="192.168.0.2
>master_user="cmge_master_slave
>master_password="123456
>master_port=3306,
>master_log_file="mysql-bin.000005
>master_log_pos=13479;
>start slave;
在5.6的版本中,启动主从为:start slave,而之前用slave start也可以。
查看配置是否成功
如下表示成功
mysql> show slave status\\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.116
Master_User: cmgesync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 13479
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 1363169
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
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: 13479
Relay_Log_Space: 1363346
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:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: f061a6fa-3cd9-11e3-8fa9-a7f9eaa785a7
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 800
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
4、MySQL一些乱七八糟的东西
1.1按照层次看帮助
如果不知道帮助能够提供些什么,可以一层一层往下看:
命令如下:
mysql> ? contents
You asked for help about help category: "Contents"
For more information, type 'help categories: Account Management Administration Data Definition Data Manipulation Data Types Functions Functions and Modifiers for Use with GROUP BY Geographic Features Language Structure Plugins Storage Engines Stored Routines Table Maintenance Transactions Triggers 对于列出的分类,可以进行看自己感兴趣的部分 1.2 快速查阅帮助 实际当中,如果我们需要快速查阅某项语法时,可以使用关键字进行快速查询。例如,我想 知道show 命令都能看些什么东西,可以用如下命令: mysql> ? show Name: 'SHOW' Description: SHOW has many forms that provide information about databases, tables, columns, or status information about the server. This section describes those following: SHOW AUTHORS SHOW CHARACTER SET [LIKE 'pattern'] SHOW COLLATION[LIKE 'pattern'] SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern'] SHOW CONTRIBUTORS SHOW CREATE DATABASE db_name SHOW CREATE EVENT event_name 。。。 我想知道create table 的语法,可以命令如下: mysql> ? create table Name: 'CREATE TABLE' Description: Syntax: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_option ...] [partition_options] Or: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_option ...] [partition_options]下载本文