MariaDB、MySQL数据库主从同步

1、Mysql主从同步异步概念

异步:主服务器写完日志后立即返回同步完成消息,不受从服务器的状态和影响,mysql默认为异步工作模式

同步:主服务器写入数据到本地磁盘并记录好二进制日志,然后等从服务器发现数据发送改变再把数据同步到从服务器的日志中继并保存到二进制日志和磁盘,最后返回给主服务器同步完成的结果,因此比较影响性能。

2、同步过程:


服务器在可能修改数据时会把行内容记录在二进制日志中,而从服务会不停到主服务器请求数据,相当于mysql客户端,不停请求服务器的3306端口,从服
务器请求到主服务器的日志先记录到从服务器的中级日志下来,然后从服务器的本地线程读取下来应用一次保存到从服务器的本地磁盘空间,从而达到与主服务器的
内容一致的效果。

SLAVE:IO thread:向主服务器请求二进制日志中的事件

SQL thread:从中继日志读取事件并在本地执行

MASTER:binglog dump:将IO thread的请求事件发送给对方

3、注意事项:

1、从服务器一定不能写数据,因为数据不会传输到主服务器

2、主服务器有并且只能有一个主服务器,一般不支持一丛多主

3、mariadb-10 支持多主模型,即支持多源复制(mutil-source replication)

4、主从版本尽量相同,或从版本低于主版本

5、主从的server-id不能相同

4、配置过程:

1、主服务器:

1、改server-id

2、启用二进制日志

3、创建有复制权限的账号

2、从服务器

1、改server-id

2、启用中继日志

3、指向主服务器-使用主服务器创建的账号和密码

4、启动复制进程

5、环境:

系统:CentOS 6.5_x86_64

主IP:192.168.10.204

从IP:192.168.10.205

MariaDB版本:mariadb-10.0.15-linux-x86_64.tar.gz

一.新建主从结构,即主服务器没有任何数据的情况下加入从服务器:

主服务器:

1、改server-id

[[email protected] binlogs]# vim /etc/mysql/my.cnf

server-id       = 10

2、启用二进制日志

log-bin=/data/binlogs/master-log

3、创建有复制权限的账号

mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO ‘repluser‘@‘192.168.%.%‘ IDENTIFIED BY ‘123456‘;

Query OK, 0 rows affected (0.03 sec)

mysql> FLUSH PRIVILEGES; #刷新表

Query OK, 0 rows affected (0.00 sec)

4、重启服务:

[[email protected] binlogs]# /etc/init.d/mysqld  restart

Shutting down MySQL..                                      [  OK  ]

Starting MySQL.                                            [  OK  ]


从服务器:

1、改server-id:

[[email protected] ~]# vim /etc/mysql/my.cnf

server-id       = 100

2、关闭从服务器的二进制日志:

#log-bin=/data/binlogs/master-bin

relay-log = /data/relaylogs/relay-logs #指定从服务器的日志存放路径

3、重启服务:    [[email protected] relaylogs]# /etc/init.d/mysqld  restart

Shutting down MySQL..                                      [  OK  ]

Starting MySQL.                                            [  OK  ]

4、查看从服务器状态:

mysql> show slave status\G;

*************************** 1. row***************************

Slave_IO_State: Waiting for master to sendevent

Master_Host: 192.168.10.204

Master_User: jack

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: master-log.000008

Read_Master_Log_Pos: 1537

Relay_Log_File: relay-bin.000004

Relay_Log_Pos: 536

Relay_Master_Log_File: master-log.000008

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: 1537

Relay_Log_Space: 827

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: 10

Master_SSL_Crl:

Master_SSL_Crlpath:

Using_Gtid: No

Gtid_IO_Pos:

在主服务器创建数据库,查看是否可以同步到从服务器:

主服务器:

mysql> create databases slave; #创建新的数据库

mysql> show databases;  #查看是否创建完成

+--------------------+

| Database           |

+--------------------+

| hellodb            |

| information_schema |

| mysql              |

| performance_schema |

| s                  |

| slave              |

| test               |

+--------------------+

mysql> USE  slave; #切换的创建的数据库

Database changed

mysql> create table t1 (id int); #创建新的表

Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO t1 VALUES (1),(2),(3); #向表插入简单数据

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings:

mysql> select * from t1; #验证数据是否成功写入

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

从服务器验证:

mysql> show databases; #查看是否有主服务器创建的数据库

+--------------------+

| Database           |

+--------------------+

| hellodb            |

| information_schema |

| mysql              |

| performance_schema |

| s                  |

| slave              |

| test               |

+--------------------+

7 rows in set (0.07 sec)

mysql> use slave; #切换的主服务器的数据库

Database changed

mysql> select * from t1;  @查询是否有主服务器表的信息

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

二:主服务器运行中并且有一定的数据再加入从服务器:

    此过程要先把主服务器的数据备份出来,然后拷贝到从服务器上导入到从服务器的数据库,然后在让从服务器从主服务器的指定位置开始备份数据即可。

 主服务器导出数据:

[email protected] binlogs]# /usr/local/mysql/bin/mysqldump --all-databases --flush-logs --master-data=2 --lock-tables > /backup.sql

[[email protected] binlogs]# scp /backup.sql  192.168.10.205:/

[email protected]‘s password:

backup.sql                               100%  518KB 518.0KB/s   00:00

 从服务器导入数据:

[[email protected] relaylogs]# mysql < /backup.sql

mysql>CHANGE
MASTER
TOMASTER_HOST=‘192.168.10.204‘,MASTER_USER=‘jack‘,MASTER_PASSWORD=‘123456‘,MASTER_LOG_FILE=‘master-log.000009‘,MASTER_LOG_POS=367;
 #指定同步主服务器的用户、密码、日志文件和开始的编号

QueryOK, 0 rows affected (0.07 sec)

mysql>START SLAVE;  #启动同步进程

QueryOK, 0 rows affected (0.00 sec)

mysql>SHOW SLAVE STATUS\G;  #查看状态

***************************1. row ***************************

Slave_IO_State:Waiting for master to send event

Master_Host:192.168.10.204

Master_User:jack

Master_Port:3306

Connect_Retry:60

Master_Log_File:master-log.000009

Read_Master_Log_Pos:367

Relay_Log_File:relay-bin.000002

Relay_Log_Pos:536

Relay_Master_Log_File:master-log.000009

Slave_IO_Running:Yes

Slave_SQL_Running:Yes #看到这两个显示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:367

Relay_Log_Space:827

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:10

Master_SSL_Crl:

Master_SSL_Crlpath:

Using_Gtid:No

Gtid_IO_Pos:

1 row inset (0.00 sec)

    从服务器验证数据库是否同步成功:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| hellodb            |

| information_schema |

| mysql              |

| performance_schema |

| s                  |

| slave              |

| test               |

+--------------------+

7 rows in set (0.00 sec)

mysql> use slave;

Database changed

mysql> show tables;

+-----------------+

| Tables_in_slave |

+-----------------+

| t1              |

+-----------------+

1 row in set (0.00 sec)

mysql> select * from t1;  #已经成功同步到主服务器的数据

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

   在主服务器新建一个数据库并向之前的t1表中插入数据查看是否可以同步成功: 

   主服务器:

mysql> create database Slave2;

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t1 VALUES (4),(5),(6);

Query OK, 3 rows affected (0.00 sec)

Records: 3  Duplicates: 0  Warnings: 0

  从服务器验证: 

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| Slave2             |

| hellodb            |

| information_schema |

| mysql              |

| performance_schema |

| s                  |

| slave              |

| test               |

+--------------------+

8 rows in set (0.00 sec)

mysql> use slave;

Database changed

mysql> show tables;

+-----------------+

| Tables_in_slave |

+-----------------+

| t1              |

+-----------------+

1 row in set (0.00 sec)

mysql> select * from t1;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

|    4 |

|    5 |

|    6 |

+------+

9 rows in set (0.00 sec)

至此,从服务器已经从主服务器完成同步之前的数据,并可以同步新的数据

注:操作过程当中遇到两个问题,如下:

1、主服务器的数据库不能备份,执行命令式报错:

[[email protected] binlogs]# mysqldump --all-databases --flush-logs --master-data=2 --lock-tables > /Backup.sql

mysqldump: Couldn‘t execute ‘SET OPTION SQL_QUOTE_SHOW_CREATE=1‘: Unknown system variable ‘OPTION‘ (1193)

    问题分析:改错误是在调用 mysqldump命令是使用的默认路径/usr/bin/mysqldump,但是由于MariaDB是安装的目前的最新版本,此备份工具已经比较旧了,有些特性不支持,因此可以使用MariaDB解压包里面的备份工具即可。


2、从服务器一直不能与主服务器同步

具体表现为从服务器一直显示IO进程连接正在连接:

mysql>show slave status\G;

***************************1. row ***************************

Slave_IO_State:Connecting to master

Master_Host:192.168.10.204

Master_User:jack

Master_Port:3306

Connect_Retry:60

Master_Log_File:

Read_Master_Log_Pos:4

Relay_Log_File:relay-bin.000001

Relay_Log_Pos:4

Relay_Master_Log_File:

Slave_IO_Running:Connecting

Slave_SQL_Running:Yes

查看日志先显示账号访问主服务器失败,那么就判断为要么没有权限要么密码不对,在确认权限正确的情况下更改密码,然后将从服务器的slave停止,使用新密码重新启动slav即可,如下;

50119
 1:38:25 [ERROR] Slave I/O: error connecting to master
‘[email protected]:3306‘ - retry-time: 60  retries: 86400  message: Access denied for user ‘jack‘@‘node5.a.com‘ (using password: YES), Internal MariaDB error code: 1045

时间: 2024-12-28 00:51:29

MariaDB、MySQL数据库主从同步的相关文章

mysql数据库主从同步

环境: Mater:   CentOS7.1  5.5.52-MariaDB  192.168.108.133 Slave:   CentOS7.1  5.5.52-MariaDB  192.168.108.140 1.导出主服务数据,将主备初始数据同步 master: //从master上导出需要同步的数据库信息 mysqldump -u*** -p*** --database test > test.sql //将master上的备份信息传输到slave上 scp /root/test.sq

MySQL数据库主从同步部署

MySQL数据库主从同步部署: 环境 Mater:   CentOS6.4  mysql5.5.38  192.168.107.133 Slave:   CentOS6.4  mysql5.5.38  192.168.107.135 1.导出主服务数据,将主备初始数据同步 master: //从master上导出需要同步的数据库信息 mysqldump -u*** -p*** --database test > test.sql //将master上的备份信息传输到slave上 scp /roo

linux下mysql数据库主从同步配置

说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备篇: 说明:在两台MySQL服务器192.168.21.128和192.168.21.129上分别进行如下操作 备注: 作为主从服务器的MySQL版本建议使用同一版本! 或者必须保证主服务器的MySQL版本要高于从服务器的MySQL版本! 一.配置好IP.DNS .网关,确保使用远程连接工具能够连接

mysql数据库主从同步配置教程--数据库同步

背景: 最近有一个mysql数据库同步的需求,我用了mysql主从同步的方法来实现.下面把步骤记录一下. 环境和拓扑 操作系统:Centos6.6 X64 mysql版本:5.1.73 Master: 10.6.1.210 Slave:  10.6.1.211 需求: 实现Master上test库同步到Slave上,但是禁止同步该库下的AA表 1.配置Master上的my.cnf #vim  /etc/my.cnf 添加内容到[mysqld]下,设定只同步test 数据库: [mysqld] l

谈谈Mysql数据库主从同步延迟分析及解决方案

一.MySQL的数据库主从复制原理 MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示: 分为四步走: 1. 主库对所有DDL和DML产生的日志写进binlog: 2. 主库生成一个 log dump 线程,用来给从库I/O线程读取binlog: 3. 从库的I/O Thread去请求主库的binlog,并将得到的binlog日志写到relay log文件中: 4. 从库的SQL Thread会读取relay log文件中的日志解析成具体操作,将主库的DDL和DML操作事件重放. 关

mysql数据库主从同步(交互式)

mysql数据库主从同步交互式配置步骤,本文以一台mysql数据库多实例3306和3307为例进行配置,3306为主库,3307为从库(多台单实例与一台多实例配置是一样的) 一.my.cnf文件配置 1.修改my.cnf配置文件,主数据库3306要打开log-bin,server-id不能一样 [[email protected] ~]# egrep"log-bin|server-id" /data/{3306,3307}/my.cnf /data/3306/my.cnf:log-bi

【转】MySQL数据库主从同步管理

MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重要,新手往往在出现主从同步错误的时候不知道如何入手,这篇文章就是根据自己的经验来详细叙述mysql主从的管理. MYSQL主从同步的作用 (1) 数据分布 (2) 负载平衡(load balancing) (3) 备份 (4) 高可用性(high availability)和容错 MYSQL主从同步的原理 关于MYSQL的主从同步,最主要的是要了解MYSQL的主从同步是如何工作的也即

Mysql数据库主从同步(复制)热备份

随着大数据的发展,数据的安全问题日益凸显,往常不被重视的数据库维护变得必不可缺,数据的灾备变成个各大企业/个人站长业务运行中必须重视的环节.上一篇文章提到了自动化备份避灾的几种方案及选择,今天就来实践一下主从/双向异地热备份方案. Mysql数据库同步(复制)的概念,主从同步使得数据可以从一个服务器无缝迁移复制到另一台服务器.这个过程中一台服务器充当主服务器(master),另一台或另外多台充当从服务器(slave).复制进程I/O是异步进行的,所以服务器不需要一直保持关联的状态. Mysql数

MySQL数据库主从同步配置

Mysql主从安装配置 环境: 主从服务器上的MySQL数据库版本同为5.1.34 主机IP:192.168.0.1 从机IP:192.168.0.2 一. MySQL主服务器配置 1.编辑配置文件/etc/my.cnf # 确保有如下行 server-id = 1 log-bin=mysql-bin binlog-do-db=mysql  #需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可 binlog-ignore-db=mysql  #不需要备份的数据库名,如果备份多个数据库,