MySQL 数据同步双机互备

               

在这个大数据的时代,数据的安全性是不得不考虑的一个问题。鸡蛋放在一个篮子里面,一旦篮子翻了,所有鸡蛋都毁了;同样的,数据如果只放在一台服务器中,一旦机器死机,数据不可避免的将要丢失,整个系统陷入瘫痪。所以数据的备份至关重要。

本 Chat 将会介绍下如何实现两台服务器上的 MySQL 数据实时同步,互为主备。通过这次 Chat,您将会学会以下内容:

  1. Linux 上 MySQL 的安装;
  2. Linux 下 MySQL 的基本使用;
  3. 在两台服务器上配置 MySQL 数据同步;
  4. 数据实时同步的测试(为方便,使用 Navicat 工具);
  5. 配置数据同步过程中的问题解决方式。

前言

在这个大数据的时代,数据的安全性是不得不考虑的一个问题。鸡蛋放在一个篮子里面,一旦篮子翻了,所有鸡蛋都毁了,也就没有鸡蛋可吃了;同样的,数据如果只放在一台服务器中,一旦机器死机,数据不可避免的将要丢失,整个系统陷入瘫痪。所以数据的备份至关重要。

本 Chat 将会介绍下如何实现两台服务器上的 MySQL 数据实时同步,互为主备。通过这次 Chat,您将会学会以下内容:

1.LinuxMySQL 的安装;2.LinuxMySQL 的基本使用;3.在两台服务器上配置 MySQL 数据同步;4.数据实时同步的测试(为方便,使用 Navicat 工具);5.配置数据同步过程中的问题解决方式。

Linux 下 MySQL 的安装

(1)查看系统版本
    [root@sts ~]# uname -a    Linux sts 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
(2)下载 mysql 之前,请先确认是否已安装 mysql,若已安装,确认下是否需要重新安装

检查是否安装 mysql:

    rpm -qa |grep mysql    mysql-community-libs-5.7.23-1.el7.x86_64    mysql57-community-release-el7-10.noarch    mysql-community-client-5.7.23-1.el7.x86_64    mysql-community-server-5.7.23-1.el7.x86_64    mysql-community-common-5.7.23-1.el7.x86_64    mysql-community-libs-compat-5.7.23-1.el7.x86_64

可以看到已经安装 mysql,如需重新安装,请将上述命令查询出结果一一卸载,卸载前请停止 mysql 服务:

    service mysqld stop     //停止mysql服务    rpm -e --nodeps +包名    //卸载对应服务
(3)去 mysql 官网下载适合的 mysql 版本进行下载:

MySQL官网

我选择的是 mysql5.7 版本的,所以先跳转到 5.7 版本 mysql 页面:

enter image description here

选择对应的 mysql 版本信息:

enter image description here

选择具体的包进行下载:

enter image description here

第一个包为 mysql 的各部分组件安装的 rpm 压缩包,下载后解压会有以下列表:

    -rw-r--r--  1 7155 31415  23901968 3月   5 10:24 mysql-community-client-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415    339860 3月   5 10:24 mysql-community-common-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415   3715796 3月   5 10:24 mysql-community-devel-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415  39466536 3月   5 10:24 mysql-community-embedded-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415 137541708 3月   5 10:24 mysql-community-embedded-devel-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415   2177784 3月   5 10:24 mysql-community-libs-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415   1723716 3月   5 10:24 mysql-community-libs-compat-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415 160384292 3月   5 10:24 mysql-community-server-5.7.23-1.el7.x86_64.rpm

各包之间存在依赖关系,安装时需要注意各包的安装顺序。安装顺序为 common–>libs–>client–>server->devel->libs-compat,其中 libs-compat 为 hue 安装需要依赖的包,若不安装,hue 安装会报错,本 chat 暂不涉及。

第二个下载项为 mysql server 安装包,若其他依赖组件已安装,可下载这个,本文使用第一种方式进行安装。

(4)下载安装包

下载安装包可通过两种方式下载:本地下载上传到服务器以及直接服务器下载,若服务器配置可以以及网络环境良好可选择直接在服务器进行下载,我选择的是本地下载然后上传到服务器。

(服务器直接下载:使用 wget  命令)点击下载之后,会出现提示登录注册的界面,在这个界面左下角会有 ‘ No thanks,just start my download ’,点击跳过登录,直接开始下载:

enter image description here

(5)下载完成后,将下载好的安装包上传到服务器上,上传目录自定义
    [root@sts /usr/local/drp/mysql]# ll    total 168960    -rw-r--r-- 1 root root 173011196 Jun 11 11:21 mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar
(6)解压 mysql 安装包
        tar -xvf mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar         //解压之后        -rw-r--r--  1 7155 31415  23901968 3月   5 10:24 mysql-community-client-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415    339860 3月   5 10:24 mysql-community-common-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415   3715796 3月   5 10:24 mysql-community-devel-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415  39466536 3月   5 10:24 mysql-community-embedded-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415 137541708 3月   5 10:24 mysql-community-embedded-devel-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415   2177784 3月   5 10:24 mysql-community-libs-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415   1723716 3月   5 10:24 mysql-community-libs-compat-5.7.23-1.el7.x86_64.rpm    -rw-r--r--  1 7155 31415 160384292 3月   5 10:24 mysql-community-server-5.7.23-1.el7.x86_64.rpm
(7)安装 mysql

将上述包按 common–>libs–>client–>server->devel->libs-compat 顺序进行安装:

    rpm -ivh mysql-community-common-5.7.23-1.el7.x86_64.rpm    rpm -ivh mysql-community-libs-5.7.23-1.el7.x86_64.rpm    rpm -ivh mysql-community-client-5.7.23-1.el7.x86_64.rpm    rpm -ivh mysql-community-server-5.7.23-1.el7.x86_64.rpm    rpm -ivh mysql-community-embedded-devel-5.7.23-1.el7.x86_64.rpm    rpm -ivh mysql-community-libs-compat-5.7.23-1.el7.x86_64.rpm
(8)启动 mysql

systemctl start  mysqld.service

查看 mysql 状态

    systemctl status  mysqld.service    ● mysqld.service - MySQL Server    Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)    Active: active (running) since Thu 2018-07-19 15:21:44 CST; 2 weeks 4 days ago     Docs: man:mysqld(8)     http://dev.mysql.com/doc/refman/en/using-systemd.html     Main PID: 979 (mysqld)     CGroup: /system.slice/mysqld.service     └─979 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid     Jul 19 15:21:41 sts systemd[1]: Starting MySQL Server...     Jul 19 15:21:44 sts systemd[1]: Started MySQL Server.
(9)修改 mysql 初始密码

1、先修改配置文件 /etc/my.cnf 令 MySQL 跳过登录时的权限检验,在 [mysqld] 下加入一行:

skip-grant-tables

2、重启 MySQL

systemctl restart mysqld.service

3、免密码登录 MySQL

直接输入mysql  回车,进入mysql

mysql>  use mysql;mysql> UPDATE user SET authentication_string = password('your-password') WHERE host = 'localhost' AND user = 'root';mysql> select host,user, authentication_string, password_expired from user; mysql> update user set password_expired='N' where password_expired='Y' //密码不过期mysql> update user set host='%' where user='root' and host='localhost'; //远程可访问mysql> flush privileges; //刷新mysql> exit;//退出

4、去掉 /etc/my.conf 中添加的 skip-grant-tables,重启 mysql

5、输入用户名密码登录 mysql:

mysql -u+用户名 -p+密码

成功登录即密码修改成功,到此 mysql 的安装讲解完毕

注:修改密码时可能会出现修改不成功的现象,提示密码强度太弱,这是由于 mysql 开启密码强度校验,可通过在 /etc/my.conf 的 [mysqld] 下添加 validate_password = off 关闭密码校验,也可参考 https://blog.csdn.net/maxsky/article/details/51171474 进行拦截设置。

mysql 的简单使用

(1)查看当前所有数据库
    mysql>show databases    +--------------------+    | Database           |    +--------------------+    | information_schema |    | alarms             |    | dashboard          |    | drp_db             |    | falcon_portal      |    | graph              |    | hive               |    | mysql              |    | performance_schema |    | sys                |    | uic                |    +--------------------+    11 rows in set (0.07 sec)
(2)创建新的数据库
    mysql> create database my_new_db;    Query OK, 1 row affected (0.08 sec)

使用 show databases;即可查看到自己刚刚建立的数据库。

(3)使用数据库并在其中创建表
    mysql> create table my_test_table(        -> id int(10) not null primary key,        -> name varchar(20) ,        -> sex varchar(5),        -> age int(3)        -> );    Query OK, 0 rows affected (0.51 sec)
(4)向表中插入数据
    mysql> insert into my_test_table (id,name,sex,age) values(1,'小明','男',20);    ERROR 1366 (HY000): Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for column 'name' at row 1

这是由于表中未设置编码格式为 utf-8,修改一下建表语句如下:

    create table my_test_table(        id int(10) not null primary key,        name varchar(20) ,        sex varchar(5),        age int(3)    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

将表中数据设置为 utf8 编码格式即可。

或者也可使用:

    ALTER TABLE my_test_table MODIFY COLUMN name VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

将报错字段编码格式设置为 utf8 格式。

修改之后即可成功插入数据:

    mysql> insert into my_test_table (id,name,sex,age) values(1,'小明','boy',20);    Query OK, 1 row affected (0.03 sec)
(5)查询数据
    mysql> select * from my_test_table;    +----+--------+------+------+    | id | name   | sex  | age  |    +----+--------+------+------+    |  1 | 小明   | boy  |   20 |    +----+--------+------+------+    1 row in set (0.00 sec)    mysql> select name from my_test_table;    +--------+    | name   |    +--------+    | 小明   |    +--------+    1 row in set (0.00 sec)
(6)修改数据
    mysql> update my_test_table set name ='小红' where id = 1;    Query OK, 1 row affected (0.05 sec)    Rows matched: 1  Changed: 1  Warnings: 0
    mysql> select * from my_test_table where id = 1;    +----+--------+------+------+    | id | name   | sex  | age  |    +----+--------+------+------+    |  1 | 小红   | boy  |   20 |    +----+--------+------+------+    1 row in set (0.00 sec)    mysql> 
(7)删除数据

delete from my_test_table where id = 1;

数据表的删除操作使用需谨慎,一旦删除不可还原,删除时必须加上必要的条件,否则会将期望保留的数据也给删掉。

(8)删除数据库
    mysql> drop database my_new_db;    Query OK, 1 row affected (0.08 sec)

同样的,删除数据库时也需要格外小心,要保证内部的表中数据都不需要了方可删除。

以上就是 linux 下 mysql 的简单操作。

mysql 双主机数据同步

该模块为本 chat 的核心内容。废话少说,直接开始。

(1)前期准备

服务器(至少两台):10.168.1.44、10.168.0.126运行环境: centos7mysql 版本:5.7.22

注:数据同步的前提要保证同步的服务器之间可以互相 ping 通。

(2)修改 mysql 配置文件

在 10.168.1.44 服务器 /etc/my.conf 配置文件中添加:

server_id=10log-bin=master_01    //开启二进制日志,作用是另一个服务器可以

通过该日志来确定执行操作

binlog-do-db=test_db  //同步的库binlog-do-db=my_test  //同步的库

在 10.168.0.126 服务器 /etc/my.conf 配置文件中添加:

server_id=20log-bin=master_02    //开启二进制日志,作用是另一个服务器可以

通过该日志来确定执行操作:

binlog-do-db=test_db  //同步的库binlog-do-db=my_test  //同步的库

添加之后执行命令 systemctl restart  mysqld.service 重启数据库使修改生效。

上述参数解析:

  1. server_ id 为当前 mysql 服务的识别 ID,必须唯一。
  2. log - bin 开启二进制日志,每次数据操作都会将操作日志记录在里面,以便从服务可以通过日志确定执行了什么操作。
  3. bin - do - db  需要同步的数据库,如果有多个数据库需要同步,写多行。binlog - do - db = db1,db2,db3... 这种写法是错误的,不会达到预期效果
(3)添加 mysql 账户,用户数据复制

添加 mysql 账户,通过给其授权用户执行数据同步:

10.168.1.44执行命令:GRANT FILE ON *.* TO 'copyuser'@'10.168.0.126' IDENTIFIED BY 'sts@123';GRANT REPLICATION SLAVE ON *.* TO 'copyuser'@'10.168.0.126' IDENTIFIED BY 'sts@123';flush privileges;10.168.0.126执行命令:GRANT FILE ON *.* TO 'copyuser'@'10.168.1.44' IDENTIFIED BY 'sts@123';GRANT REPLICATION SLAVE ON *.* TO 'copyuser'@'10.168.1.44' IDENTIFIED BY 'sts@123';flush privileges;
(4)配置从数据库

分别在两台服务器上进入 mysql,输入 show master status; 命令查看当前主机的状态:

    mysql> show master status;    +------------------+----------+-----------------+------------------+-------------------+    | File             | Position | Binlog_Do_DB    | Binlog_Ignore_DB | Executed_Gtid_Set |    +------------------+----------+-----------------+------------------+-------------------+    | master_01.000008 |      749 | test_db,my_test |                  |                   |    +------------------+----------+-----------------+------------------+-------------------+    1 row in set (0.00 sec)

记录下此时的 file 名以及 position;

在 10.168.1.44 执行:

    mysql>CHANGE MASTER TO    MASTER_HOST='10.168.0.126',   //所要同步的服务器ip    MASTER_USER='copyuser',     //同步服务器的mysql用户名    MASTER_PASSWORD='sts@123', //同步服务器的mysql密码,与上面创建时的密码要匹配    MASTER_PORT=3306,    MASTER_LOG_FILE='master_02.000002',   //对应10.168.0.126的file名    MASTER_LOG_POS=1771,      //对应10.168.0.126的position    MASTER_CONNECT_RETRY=10;    在

10.168.0.126 执行:

    mysql>CHANGE MASTER TO    MASTER_HOST='10.168.1.44',    MASTER_USER='copyuser',    MASTER_PASSWORD='sts@123',    MASTER_PORT=3306,    MASTER_LOG_FILE='master_01.000008',     //对应10.168.1.44的file名    MASTER_LOG_POS=154,            //对应10.168.0.126的position    MASTER_CONNECT_RETRY=10;

注:若 slave 开启状态无法执行以上命令,需要首先执行 stop slave;关闭 slave,执行完上述命令后执行 start slave;命令开启 slave。

上述命令执行完后,查看从服务状态:

执行命令 show slave status\G:

enter image description here

Slave_IO_Running:  指的就是从服务器上负责读取主服务器的线程工作状态。 从服务器用这个专门的线程链接到主服务器上,并把日志拷贝回来。

Slave_SQL_Running:指的就是专门执行 sql 的线程。它负责把复制回来的 Relaylog 执行到自己的数据库中。 这两个参数必须都为Yes 才表明复制在正常工作。

到这里,mysql 同步配置已完成,接下来测试下数据是否能正常实时同步。

测试数据同步

为方便操作,本次测试使用第三方工具 Navicat Premium 连接两个数据库测试数据的同步。

(1)配置连接两个数据库

enter image description here

(2)在10.168.0.126 的 my_ test 数据库中创建表 test_  table:

enter image description here

查看 10.168.1.44 的数据库 my_ test,会发现  test_ table 表自动同步创建:

enter image description here

(若找不到,在表一栏右键刷新即可)。

(3)在 10.168.1.44 上向 test_table 插入一条数据:

enter image description here

回到 10.168.0.126,查看 test_table 表中数据,会发现数据已同步过来:

enter image description here

到此,两台服务器上的 mysql 数据同步已测试完成。

可能出现的问题

1.查看 slave 状态时,会发现 Slave_IO_Running: Connecting

出现该问题主要有三个原因:

A.网络不通(互相 ping下试试看能否ping通)
B.密码不对:查看在配置 slave 时执行的命令中的密码是否正确
C.Position 不正确:配置 slave 时对应 position 未填为正确的position(查看对应从服务器数据库的 master 状态:show master status 即可找到 )   

我出现这个问题的原因是只在一个服务器上创建了用于同步数据的用户 ‘copyuser’,另一个服务器数据库中并未创建该用户。创建之后 OK 了。

2.查看 slave 状态时,会发现 Slave_SQL_Running: No

出现这个现象的原因主要就是两边数据库数据存在不同之处,也就是同步时没有相同的初态,可以通过查看 mysql 日志定位具体哪块数据出现异常(详细参考下面备注)。

Mysql 日志一般在 /var/log/mysqld.log

需要注意的是,如果你只配置了从数据库同步主数据库数据,而未设置为互相同步    ,修改从数据库数据可能会导致同步失效。

备注

数据同步,一般需要是在同样的初态下进行同步,这样才有意义。所谓同样的初态指的是同步之前两服务器所要同步的数据库中数据完全一致,这样才能保证同步之后两数据库数据的一致,否则,同步过程中会发生各种各样的问题,诸如A中修改了表 a 的数据,而 B 中并未找到 a 表,虽然读取到了日志,但并不能成功执行,导致同步失败。如何实现同样的初态环境呢?

(1)导出数据

导出数据的时候,最好在 mysql 下执行命令 FLUSH TABLES WITH READ LOCK; 将数据库上写锁,禁止数据的写入,完成之后,再释放锁:UNLOCK TABLES;

    [root@cdh-1 mysql]# mysqldump --master-data -uroot -p my_test > my_test.sql    Enter password:     [root@cdh-1 mysql]# ll    总用量 4    -rw-r--r-- 1 root root 2927 8月   7 15:47 my_test.sql

如果有多个数据库需要同步,需要将多个数据库都导出来一份。

(2)在从服务器上导入数据
  1. 将主服务器上导出的 sql 文件传到从服务器 :   

    scp my_test.sql 10.168.0.126:/mysql/`
  2. my_test.sql 中的数据导入进来,若从服务器没有 my_test 库,创建;若有,清楚内部数据,然后执行:mysql -uroot -p my_test < my_test.sql

这样就保证两个服务器的 my_test 库拥有同样的初态了。

如果有多个数据库需要同步,逐一按照上面步骤操作即可。

结尾语

以上就是关于 mysql 双机热备的具体配置以及测试信息,希望能给大家带来帮助,若有什么不足的地方,欢迎大家指正。我是小闲,一个正在爬坑的程序猿。


本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。

阅读全文: http://gitbook.cn/gitchat/activity/5b62c9c9eec42f4dac6fe5c9

一场场看太麻烦?成为 GitChat 会员,畅享 1000+ 场 Chat !点击查看

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43683014/article/details/86562418