视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL主从复制
2025-09-25 17:49:32 责编:小OO
文档
MySQL主从复制

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 ', where is one of the following

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]下载本文

显示全文
专题