MySQL示例DTID主从原理解析

目录
  • 1.GTID基本概念
  • 2.GTID优点
  • 3.GTID的工作原理
  • 4.GTID比传统复制的优势
  • 5.启动的方法
  • 6.GTID(一主一从)配置
    • 6.1环境:
    • 6.2在主库上给从库授权:
    • 6.3确保数据一致操作
    • 6.4配置主库
    • 6.5配置从库
    • 6.6配置主从复制
  • 7.GTID(一主俩从)
  • 8.GTID(俩主一从)
    • 1.最新环境
    • 2.所有服务器均关闭防火墙或者放行防火墙
    • 3.授权连接
      • master01库授权普通用户
      • slave进行连接
      • master02授权普通用户
      • slave进行连接
    • 4.分别进行配置文件修改
    • 5.分别重启
    • 6.在进行GTID多主一从配置前,先引入一个概念
    • 7.slave从库以root用户登录进行GTID配置
      • GTID(俩主一从)测试:
      • slave相关命令:
      • 解决问题

1.GTID基本概念

MySQL 5.6.5开始支持的,全局事务标识符(GTID(Global Transaction ID))是创建的唯一标识符,并与在源(主)服务器上提交的每个事务相关联。
此标识符不但是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。
所有交易和所有GTID之间都有一对一的映射关系 。
它由服务器ID以及事务ID组合而成。
这个全局事务ID不仅仅在原始服务器上唯一,在所有存在主从关系 的mysql服务器上也是唯一的。
正是因为这样一个特性使得mysql的主从复制变得更加简单,以及数据库一致性更可靠。
一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

2.GTID优点

保证同一个事务在某slave上绝对只执行一次,没有执行过的gtid事务总是会被执行。
不用像传统复制那样保证binlog的坐标准确,因为根本不需要binlog以及坐标。
故障转移到新的master的时候很方便,简化了很多任务。
很容易判断master和slave的数据是否一致。只要master上提交的事务在slave上也提交了,那么一定是一致的。

3.GTID的工作原理

1.当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
2.binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
6、在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。

4.GTID比传统复制的优势

1.更简单的实现故障转移(failover),不需要找log_file,log_pos

2.更简单的搭建主从复制

3.更加安全

4.GTID是连续没有空洞的,因此主数据库发生冲突时,可以添加空事件的方式进行跳过

5.启动的方法

  • 方法一:如果是新搭建的服务器,直接启动即可
  • 方法二:如果是以及跑的服务器,需要重启一下mysql server

启动前,先关闭master的写入,保证master端和slave端数据保持同步,所有slave需要加上skip_slave_start=1的配置参数,避免启动后还是使用之前的复制协议

6.GTID(一主一从)配置

6.1环境:

centos8.0 ip:192.168.136.239 有数据 hostname:mysql01

centos8.0 ip:192.168.136.219 无数据 hostname:mysql02

#二进制安装以及mysql自启动服务略

6.2在主库上给从库授权:

mysql> grant replication slave on *.* to 'slave'@'192.168.136.219' identified by 'slave';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#俩服务器均关闭防火墙
[root@mysql01 ~]# systemctl stop firewalld
[root@mysql01 ~]# setenforce 0
[root@mysql02 ~]# systemctl stop firewalld
[root@mysql02 ~]# setenforce 0
从库测试连接:
[root@mysql02 ~]# mysql -u slave -p'slave' -h192.168.136.239
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

6.3确保数据一致操作

1.对主库进行锁表
mysql> flush tables with read lock;
2.对主库进行全备
[root@mysql01 ~]# mysqldump -uroot -A > /clq/all-databases-20210519.sql
3.拷贝到从库主机上去
[root@mysql01 ~]# scp /clq/all-databases-20210519.sql root@192.168.136.219:/backup/
[root@mysql02 backup]# ll
-rw-r--r--. 1 root root 873527 5月  19 16:40 all-databases-20210519.sql
4.从库上进行主库的恢复
[root@mysql02 backup]# mysql -uroot -pHuawei0917@ < all-databases-20210519.sql

6.4配置主库

[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
user = mysql
pid-file = /opt/data/mysql.pid
skip-name-resolve
#skip-grant-tables
log-bin = master_bin   #开启主库日志
server-id = 10        #服务唯一标识id
gtid-mode = on        #GTID模式开启
enforce_gtid_consistency = on #强制gtid模式一致性
log-slave-updates = 1    #从库允许更新日志,同步操作日志
binlog_format = row    #binlog日志格式为行格式, 默认是mixed混合模式
skip_slave_start = 1   #跳过从库开启,以主库开始开启
#重启
systemctl restart mysqld

6.5配置从库

[root@mysql02 data]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
user = mysql
pid-file = /opt/data/mysql.pid
skip-name-resolve
#skip-grant-tables
gtid_mode=on
enforce_gtid_consistency=on
server-id=20
log-bin=slave_binlog       #开启从库日志
log_slave-updates=1        #从库允许更新
binlog_format=row          #格式为行
skip-slave_start=1
#重启
systemctl restart mysqld

查看gtid状态情况

mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
8 rows in set (0.00 sec)

6.6配置主从复制

#从库上root登录配置      #help change master to 可以查看帮助文档实例
mysql> change master to
    -> master_host='192.168.136.239',
    -> master_user='slave',
    -> master_password='slave',
    -> master_port=3306,        #主库端口
    -> master_auto_position=1;  #位置
                                       #master_use_gtid = current_pos
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
Slave_IO_Running: Connecting
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
保证系统一致性
授权一致性

(一主一从GTID)测试

主库创建一个数据库test,进行测试查看

从库创建一个数据库test02,进行测试查看

#主库创建一个test数据库
mysql> create database test;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
#从库上查看同步情况
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)

#从库创建test02库
mysql> create database test02;
Query OK, 1 row affected (0.00 sec)
#主库上查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |         #是没有test02库的
| test               |
+--------------------+
5 rows in set (0.00 sec)

小结:主库上的数据操作会同步到从库上面去,而从库上的数据操作与主库没联系

7.GTID(一主俩从)

第三台mysql连接的话,相应配置

第3台mysql ,版本:centos8 ip:192.168.136.230 主机名:mysql03

[root@mysql03 ~]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
user = mysql
pid-file = /opt/data/mysql.pid
skip-name-resolve
#skip-grant-tables
# replication config
log-bin = master_bin
server-id = 21               #id必须与之前不同
gtid-mode = on
enforce-gtid-consistency = on
log-slave-updates = 1
binlog-format = row
skip-slave-start = 1
#查看gtid情况
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
#由于之前只权限了一个ip,此刻在mysql01主数据库上再授权一个ip
mysql> grant replication slave on *.* to 'slave'@'192.168.136.230' identified by 'slave';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#测试连接
[root@mysql ~]#  mysql -uslave -pslave -h192.168.136.239
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.7.33-log MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
#mysql03从库上root用户连接进行相应配置
[root@mysql03 ~]#  mysql -uroot -p1
mysql> change master to
    -> master_host='192.168.136.239',  #主库ip
    -> master_user='slave',              #主库授权的普通用户
    -> master_password='slave',
    -> master_port=3306,              #主库端口
    -> master_auto_position=1;   #位置从1开始同步
#也可以查看帮助进行配置
mysql> help change master to;
CHANGE MASTER TO
  MASTER_HOST='source2.example.com',
  MASTER_USER='replication',
  MASTER_PASSWORD='password',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='source2-bin.001',
  MASTER_LOG_POS=4,
  MASTER_CONNECT_RETRY=10;
URL: https://dev.mysql.com/doc/refman/5.7/en/change-master-to.html

#开启
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.136.239
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master_bin.000002
          Read_Master_Log_Pos: 2172
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 2387
        Relay_Master_Log_File: master_bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes    #显示俩个yes则运行成功!
#mysql03查看数据库,数据库内容也同步成功
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

8.GTID(俩主一从)

1.最新环境

版本 ip 主机名 身份
centos8 192.168.136.239 master01 主库
centos8 192.168.136.219 master02 主库
centos8 192.168.136.230 slave 从库

2.所有服务器均关闭防火墙或者放行防火墙

[root@master01 ~]# systemctl stop firewalld
[root@master01 ~]# systemctl disable firewalld
[root@master02 ~]# systemctl stop firewalld
[root@master02 ~]# systemctl disable firewalld
[root@slave ~]# systemctl stop firewalld
[root@slave ~]# systemctl disable firewalld

3.授权连接

master01库授权普通用户

mysql> grant replication slave on *.* to  'user'@'192.168.136.%' identified by 'user';

slave进行连接

[root@slave ~]# mysql -uuser -p'user' -h192.168.136.239
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.33 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

master02授权普通用户

mysql> grant replication slave on *.* to  'app'@'192.168.136.%' identified by 'app';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

slave进行连接

[root@slave ~]# mysql -uapp -papp -h192.168.136.219
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.33 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

4.分别进行配置文件修改

#master01主机:
[root@master01 ~]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
user = mysql
pid-file = /opt/data/mysql.pid
skip-name-resolve
skip-grant-tables
log-bin = master_bin
server-id = 10
gtid-mode = on
enforce-gtid-consistency = on
log-slave-updates = 1
binlog-format = row
skip-slave-start = 1
#master02主机
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
user = mysql
pid-file = /opt/data/mysql.pid
skip-name-resolve
                      #replication config
log-bin = master_bin
server-id = 11
gtid-mode = on
enforce-gtid-consistency = on
log-slave-updates = 1
binlog-format = row
skip-slave-start = 1
#slave主机
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
user = mysql
pid-file = /opt/data/mysql.pid
skip-name-resolve
log-bin = slave_bin
server-id = 13
gtid-mode = on
enforce-gtid-consistency = on
log-slave-updates = 1
binlog-format = row
skip-slave-start = 1

5.分别重启

[root@master01 ~]# systemctl restart mysqld
[root@master02 ~]# systemctl restart mysqld
[root@slave ~]# systemctl restart mysqld

6.在进行GTID多主一从配置前,先引入一个概念

channel(频道):每一个channel都是一个独立的slave服务,都有一个IO_THREAD和SQL_THREAD,原理和普通复制一样,只是需要在change master to语句后面使用FOR Channel来进行区分slave

在使用channel时需要将从库的master-info-repositoryrelay-log-info-repository设置为table,否则会报错。

将信息存储库设置为table格式

方式一(mysql内设置):
set global master_info_repository='table';
set global relay_log_info_repository='table';
方式二(/etc/my.cnf内设置):
3.在my.cnf中设置
master_info_repository    = TABLE
relay_log_info_repository = TABLE
#检查是否更改成功
mysql> show variables where variable_name in  ('relay_log_info_repository','master_info_repository');
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| master_info_repository    | TABLE |
| relay_log_info_repository | TABLE |
+---------------------------+-------+

7.slave从库以root用户登录进行GTID配置

#slave从库上配置俩个主库GTID复制
mysql> change master to
    -> master_host='192.168.136.219',  #mysql02主库ip
    -> master_user='app',              #mysql02主库授权的普通用户
    -> master_password='app',           #mysql02主库授权的普通用户密码
    -> master_port=3306,              #主库端口
    -> master_auto_position=1 for channel 'master01';   #位置从1开始同步,并且第一个slave取名master01
mysql> change master to
    -> master_host='192.168.136.239',  #mysql01主库ip
    -> master_user='user',
    -> master_password='user',
    -> master_port=3306,              #主库端口
    -> master_auto_position=1 for channel 'master02';   #位置从1开始同步,并且第一个slave取名master01
#查看俩个slave状态
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.136.219
                  Master_User: app
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: slave02-relay-bin-master1.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: No
            Slave_SQL_Running: No         #都是关闭的
              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: 0
              Relay_Log_Space: 154
              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: NULL
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: 0
                  Master_UUID:
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set: b4326a77-0a31-11ec-a991-000c298d3571:1-2,
d68b404d-0a35-11ec-9df1-000c29581959:1
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name: master1
           Master_TLS_Version:
*************************** 2. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.136.239
                  Master_User: user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: slave02-relay-bin-master2.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: No
            Slave_SQL_Running: No
              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: 0
              Relay_Log_Space: 154
              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: NULL
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: 0
                  Master_UUID:
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set: b4326a77-0a31-11ec-a991-000c298d3571:1-2,
d68b404d-0a35-11ec-9df1-000c29581959:1
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name: master2
           Master_TLS_Version:
2 rows in set (0.00 sec)
#开启俩个slave
mysql> start slave;
#再次查看状态

GTID(俩主一从)测试:

#master01主库创建一个test数据库
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
#master02主库上查看
mysql>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |                  #没有内容
+--------------------+
4 rows in set (0.00 sec)
#slave从库查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |          #已经同步了test库
+--------------------+
5 rows in set (0.00 sec)
#mysql02主库创建一个RHCA数据库
mysql> create database RHCA;
Query OK, 1 row affected (0.01 sec)
mysql>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| RHCA               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
#slave从库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| RHCA               |
| mysql              |
| performance_schema |
| sys                |             #有了mysql01主库的test库和mysql02的RHCA的库
| test               |
+--------------------+
6 rows in set (0.00 sec)

slave相关命令:

show slave status; //查看全部slave状态

show slave status for channel ‘naem'; //查看单个slave状态

reset slave; #重置全部slave

reset slave for channel ‘master1'; #重置单个slave

stop slave for channel ‘master1'; #暂停单个slave

start slave for channel ‘master1'; #开启单个slave

虽然我在做的过程没有遇到错误,但是下面这个是最最容易出现的错误

配置完开启slave出现报错

mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

解决问题

由于mysql.slave_relay_log_info表中保留了以前的复制信息,导致新从库启动时无法找到对应文件,那么我们清理掉该表中的记录即可

mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)

以上就是MySQL示例DTID主从原理解析的详细内容,更多关于MySQL示例DTID主从原理的资料请关注我们其它相关文章!

(0)

相关推荐

  • 解读mysql主从配置及其原理分析(Master-Slave)

    1.在主数据库服务器为从服务器添加一个拥有权限访问主库的用户:GRANT REPLICATION SLAVE ON *.* TO ' test'@'%' IDENTIFIED BY 'test'; (%表示允许所有IP,可设置指定从服务器IP)添加用户后:可在从服务器上用mysql -h127.0.0.1 -utest -ptest;  来测试是否有权限访问主数据库 2.在主据库配置文件加上:#master configserver-id       = 1log-bin          =

  • Mysql主从复制作用和工作原理详解

    一.什么是主从复制 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库.在最常用的mysql数据库中,支持单项.异步赋值.在赋值过程中,一个服务器充当主服务器,而另外一台服务器充当从服务器:此时主服务器会将更新信息写入到一个特定的二进制文件中. 并会维护文件的一个索引用来跟踪日志循环.这个日志可以记录并发送到从服务器的更新中去.当一台从服务器连接到主服务器时,从服务器会通知主服务器从服务器的日志文件中读取最后一次成功更新的位置.然后从服务器会接

  • Mysql主从同步的实现原理

    1.什么是mysql主从同步? 当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库. 2.主从同步有什么好处? 水平扩展数据库的负载能力. 容错,高可用.Failover(失败切换)/High Availability 数据备份. 3.主从同步的原理是什么? 首先我们来了解master-slave的体系结构. 如下图: 不管是delete.update.insert,还是创建函数.存储过程,所有的操作都在master上.当master有操作的时候,slave会快速的

  • MySQL主从同步原理介绍

    概述 Mysql的Replication(复制)是一个异步的复制过程,从一个 Mysql instance(我们称之为 Master)复制到另一个Mysql instance(我们称之 Slave).在 Master 与 Slave之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在Master端. 主从同步需求 要实现 MySQL 的 Replication ,首先必须打开 Master 端的BinaryLog(mysq

  • MySQL 主从复制原理与实践详解

    本文实例讲述了MySQL 主从复制原理与实践.分享给大家供大家参考,具体如下: 简介 MySQL 的主从复制又叫 Replication.AB 复制.至少需要两个 MySQL 服务(可以是同一台机器,也可以是不同机器之间进行). 比如A服务器做主服务器,B服务器做从服务器,在A服务器上进行数据的更新,通过 binlog 日志记录同步到B服务器上,并重新执行同步过来的 binlog 数据,从而达到两台服务器数据一致. MySQL 数据库的主从复制方案,与使用 scp/rsync 等命令进行的文件级

  • MySQL主从原理及配置详解

    MySQL主从配置及原理,供大家参考,具体内容如下 一.环境选择: 1.Centos 6.5 2.MySQL 5.7 二.什么是MySQL主从复制 MySQL主从复制是其最重要的功能之一.主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中.对于多级复制,数据库服务器即可充当主机,也可充当从机.MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新. 三.MySQL主从复制的类型

  • MySQL示例DTID主从原理解析

    目录 1.GTID基本概念 2.GTID优点 3.GTID的工作原理 4.GTID比传统复制的优势 5.启动的方法 6.GTID(一主一从)配置 6.1环境: 6.2在主库上给从库授权: 6.3确保数据一致操作 6.4配置主库 6.5配置从库 6.6配置主从复制 7.GTID(一主俩从) 8.GTID(俩主一从) 1.最新环境 2.所有服务器均关闭防火墙或者放行防火墙 3.授权连接 master01库授权普通用户 slave进行连接 master02授权普通用户 slave进行连接 4.分别进行

  • MySQL索引长度限制原理解析

    这篇文章主要介绍了MySQL索引长度限制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎的每个索引列长度限制为1000字节,所有组成索引列的长度和不能大于1000字节 varchar的最大长度是指字符长度,若数据库字符集为utf-8,则一个

  • MySQL数据库本地事务原理解析

    在经典的数据库理论里,本地事务具备四大特征: 原子性 事务中的所有操作都是以原子的方式执行的,要么全部成功,要么全部失败: 一致性 事务执行前后,所有的数据都应该处于一致性状态---即要满足数据库表的一致性约束,也要达到业务一致性(完成了业务目标): 隔离性 并发执行的事务不应该相互干扰:隔离性的强度由隔离级别决定: 持久性 事务一旦被提交,它添加/修改的数据不会随着系统崩溃而丢失: 在MySQL(InnoDB引擎)中,原子性和持久性是通过Redo Log来实现的,一致性是通过Undo Log实

  • MySQL数据库锁机制原理解析

    在并发访问情况下,很有可能出现不可重复读等等读现象.为了更好的应对高并发,封锁.时间戳.乐观并发控制(乐观锁).悲观并发控制(悲观锁)都是并发控制采用的主要技术方式. 锁分类 ①.按操作划分:DML锁,DDL锁 ②.按锁的粒度划分:表级锁.行级锁.页级锁 ③.按锁级别划分:共享锁.排他锁 ④.按加锁方式划分:自动锁.显示锁 ⑤.按使用方式划分:乐观锁.悲观锁 乐观锁和悲观锁 乐观并发控制和悲观并发控制是并发控制采用的主要方法.乐观锁和悲观锁不仅在关系数据库里应用,在Hibernate.Memca

  • 从云数据迁移服务看MySQL大表抽取模式的原理解析

    摘要:MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 小编最近在云上的一个迁移项目中被MySQL抽取模式折磨的很惨.一开始爆内存被客户怼,再后来迁移效率低下再被怼.MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 1.1 Java-JDBC通信原理 JDBC与数据库之间的通信是通过socket完,大致流程如下图所示.Mysql Server ->内核Socket Buffer -> 客户端Socket Buffer ->JDBC所在的JV

  • MySQL 视图(View)原理解析

    MySQL 5.0以后引入了视图.视图实际是一个自身不存储数据的虚拟数据表.实际这个虚拟表的数据来自于访问视图的 SQL 查询的结果.MySQL 处理视图和处理数据表差不多,通过这种方式来满足很多需求.视图和数据表在 MySQL 中共享命名空间,然而 ,MySQL 处理而二者的方式并不相同,例如,视图没有触发器,并且无法使用 DROP TABLE 移除视图. 下面以 world 样例数据库为例来展示视图的工作机制. CREATE VIEW Oceania AS SELECT * FROM Cou

  • Redis主从配置和底层实现原理解析(实战记录)

    我们使用Redis的时候往往都是主从模式或者集群架构,不会使用单台Redis服务. 一.Redis主从配置实战 我们使用master节点写输入,然后将数据同步到slave节点,从节点可以提供读取或者备份的功能,分担master节点压力. redis主从架构搭建,配置从节点步骤 1. 复制一份redis.conf文件为redis-6380.conf cp ./redis.conf ./conf/redis-6380.conf 2.打开redis-6380.conf配置文件,将相关配置修改为如下值:

  • MySQL索引机制的详细解析及原理

    目录 一.索引的类型与常见的操作 二.常见的索引详解与创建 三.索引的原理 1.通过实验介绍B+tree 2.延伸 四.聚簇索引和非聚簇索引 1.使用聚簇索引的优势 2.什么情况下无法使用索引 总结 一.索引的类型与常见的操作 前缀索引 MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度.但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index). 复合索引 集一个索引包含多个列(最左前

  • 一文解析MySQL的MVCC实现原理

    目录 1. 什么是MVCC 2. 事务的隔离级别 3. Undo Log(回滚日志) 4. MVCC的实现原理 4.1 当前读和快照读 4.2 隐藏字段 4.3 版本链 4.4 Read View(读视图) 5. 不同隔离级别下可见性分析 5.1 READ COMMITTED(读已提交) 5.2 REPEATABLE READ(可重复读) 1. 什么是MVCC MVCC全称是Multi-Version Concurrency Control(多版本并发控制),是一种并发控制的方法,通过维护一个数

  • MongoDB为什么比Mysql快原理解析

    目录 引言 数据存储方式不同 Mysql MongoDB 索引机制不同 Mysql MongoDB 分布式架构不同 Mysql MongoDB 总结 引言 在当今互联网时代,数据是无价之宝.为了更高效地存储和管理数据,数据库成为了重要的组成部分.MySQL和MongoDB都是常用的数据库,但MongoDB比MySQL更为高效,这是为什么呢? 数据存储方式不同 Mysql MySQL是一种关系型数据库管理系统(RDBMS),它使用传统的表格方式来存储数据.具体来说,MySQL中的数据是以表格(也称

随机推荐