linux 中mysql的主从复制

一.主从复制

1.修改主库配置文件
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin
binlog_format=row
server_id=1

2.重启数据库
[[email protected] ~]# /etc/init.d/mysqld restart

3.连接数据库
[[email protected] ~]# mysql -uroot -p1

4.创建主从复制用户
mysql> grant replication slave on *.* to [email protected]‘%‘ identified by ‘123‘;

5.记录binlog名字和binlog位置点
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 317 | | | |
+------------------+----------+--------------+------------------+-------------------+

6.在从库上执行change master to语句
change master to
master_host=‘10.0.0.51‘,
master_user=‘rep‘,
master_password=‘123‘,
master_log_file=‘mysql-bin.000001‘,
master_log_pos=317;

7.从库开启主从复制(IO线程,SQL线程)
mysql> start slave;

8.查看主从复制的状态
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

9.IO线程报错:

1.网络问题:ping 192.168.13.60
2.端口问题:telnet 192.168.13.60 3306
3.用户名密码问题:mysql -urep -p123 -h192.168.13.60

1)用户名密码输入错误:
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user ‘root‘@‘10.0.0.52‘ (using password: YES)

2)跳过反向解析
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user ‘root‘@‘db02‘ (using password: NO)

vim /etc/my.cnf
[mysqld]#mysql5.6
skip-name-resolve
skip-name-resolv
#mysql5.7
skip_name_resolve

/etc/init.d/mysqld restart

从库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| rep |
| rep1 |
| rep2 |
| test |
+--------------------+

主库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ZLS |
| mysql |
| nb |
| oldboy |
| performance_schema |
| rep |
| rep1 |
| rep2 |
| world |
| zls1 |
+--------------------+
11 rows in set (0.00 sec)

#重点,在做主从复制之前,一定要做全备
mysqldump -uroot -p1 -S /opt/test.sock -A > /tmp/full.sql
mysql> source /tmp/full.sql

二.使用binlog恢复任意时间点的数据

1.binlog的工作模式

1)STATEMENT语句模式:默认
mysql> create database binlog;
mysql> create table binlog(id int);
mysql> insert into binlog values(1),(2),(3);

查看binlog:
[[email protected] data]# mysqlbinlog mysql-bin.000002

2)ROW行级模式:mysql5.7默认
[[email protected] data]# vim /etc/my.cnf
binlog_format=row
[[email protected] data]# /etc/init.d/mysqld restart
mysql> create database binlog1;
mysql> use binlog1;
mysql> create table binlog1(id int);
mysql> insert into binlog1 values(1),(2),(3);

查看binlog:
[[email protected] data]# mysqlbinlog mysql-bin.000003

行级模式:记录的是SQL语句每一行的变化过程
[[email protected] data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000003
BEGIN
/*!*/;
# at 406
#190510 10:48:41 server id 1 end_log_pos 459 CRC32 0xc0c7e4bc Table_map: `binlog1`.`binlog1` mapped to number 70
# at 459
#190510 10:48:41 server id 1 end_log_pos 509 CRC32 0x51306b79 Write_rows: table id 70 flags: STMT_END_F
### INSERT INTO `binlog1`.`binlog1`
### SET
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO `binlog1`.`binlog1`
### SET
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO `binlog1`.`binlog1`
### SET
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
# at 509
#190510 10:48:41 server id 1 end_log_pos 540 CRC32 0x010ed7db Xid = 22
COMMIT/*!*/;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+

模拟数据变化:
mysql> update binlog1 set id=10 where id=1;
mysql> select * from binlog1;
+------+
| id |
+------+
| 10 |
| 2 |
| 3 |
+------+

mysql> delete from binlog1 where id=2;
mysql> select * from binlog1;
+------+
| id |
+------+
| 10 |
| 3 |
+------+

mysql> drop table binlog1;
mysql> drop database binlog1;

结束位置点:540
起始位置点:120

3)MIXED混合模式:将语句模式和行级模式 混合使用

2.如何查看binlog
[[email protected] data]# mysqlbinlog mysql-bin.000002
[[email protected] data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000003

三.部署MHA

db01,02,03:yum install perl-DBD-MySQL -y

db03:
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

1.做主从复制的先决条件:

主库:
1)开启binlog
2)开启server_id
3)创建主从复制用户

从库:
1)必须开启binlog
2)从库开启server_id(与主库不相同)
3)从库必须要创建主从复制用户
4)开IO,SQl线程 start slave;

db01:
[mysqld]
log_bin=mysql-bin
binlog_format=row
server_id=1

db02:
[mysqld]
log_bin=mysql-bin
binlog_format=row
server_id=2

db03:
[mysqld]
log_bin=mysql-bin
binlog_format=row
server_id=3

2.MHA工作原理
当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。

db01
1.开启binlog
2.主从复制用户
3.server_id 不同

db02
1.开启binlog
2.主从复制用户
3.server_id 不同

db03
1.开启binlog
2.主从复制用户
3.server_id 不同

=============================================================
3.MHA的工具

Manager工具包主要包括以下几个工具:

masterha_check_ssh #检查MHA的ssh-key
masterha_check_repl #检查主从复制情况
masterha_manger #启动MHA
masterha_check_status #检测MHA的运行状态
masterha_master_monitor #检测master是否宕机
masterha_master_switch #手动故障转移
masterha_conf_host #手动添加server信息
masterha_secondary_check #建立TCP连接从远程服务器
masterha_stop #停止MHA
Node工具包主要包括以下几个工具:

save_binary_logs #保存宕机的master的binlog
apply_diff_relay_logs #识别relay log的差异
filter_mysqlbinlog #防止回滚事件
purge_relay_logs #清除中继日志

MHA 是 C/S结构的服务
manager
node

4.主从配置
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 829135 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> change master to
-> master_host=‘10.0.0.51‘,
-> master_user=‘rep‘,
-> master_password=‘123‘,
-> master_log_file=‘mysql-bin.000004‘,
-> master_log_pos=829420;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

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

5.只读 和 禁用删除relaylog功能
#禁用自动删除relay log 功能(3个库都执行)
mysql> set global relay_log_purge = 0;
#设置只读(只能在从库执行)
mysql> set global read_only=1;
#编辑配置文件
[[email protected] ~]# vim /etc/my.cnf
#在mysqld标签下添加
[mysqld]
#禁用自动删除relay log 永久生效
relay_log_purge = 0

6.安装node包
[[email protected] ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
[[email protected] ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
[[email protected] ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

7.安装manager包(避免装在主库上)
[[email protected] ~]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

8.创建命令软连接
[[email protected] ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/
[[email protected] ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/

[[email protected] ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/
[[email protected] ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/

[[email protected] ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/
[[email protected] ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/

9.创建mha工作目录
[[email protected] ~]# mkdir /etc/mha

10.编辑mha配置文件
[[email protected] ~]# vim /etc/mha/app1.cnf
[server default]
manager_log=/etc/mha/manager.log
manager_workdir=/etc/mha/app1
master_binlog_dir=/usr/local/mysql/data
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=rep
ssh_user=root

[server1]
hostname=10.0.0.51
port=3306

[server2]
hostname=10.0.0.52
port=3306

[server3]
hostname=10.0.0.53
port=3306

11.在mysql中创建一个mha管理用户(三台),只需要在主库上创建
mysql> grant all on *.* to [email protected]‘%‘ identified by ‘mha‘;

12.创建密钥对,做免密登录

[[email protected] ~]# ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]

[[email protected] ~]# ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]

[[email protected] ~]# ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]

13.测试免密登录
[[email protected] ~]# ssh [email protected]
[[email protected] ~]# ssh [email protected]
[[email protected] ~]# ssh [email protected]

[[email protected] ~]# ssh [email protected]
[[email protected] ~]# ssh [email protected]
[[email protected] ~]# ssh [email protected]

[[email protected] ~]# ssh [email protected]
[[email protected] ~]# ssh [email protected]
[[email protected] ~]# ssh [email protected]

14.使用mha工具检测ssh
[[email protected] ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf

15.使用mha工具检测主从复制
[[email protected] ~]# masterha_check_repl --conf=/etc/mha/app1.cnf

16.启动mha
[[email protected] ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &

17.检查MHA启动状态
[[email protected] ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:25635) is running(0:PING_OK), master:10.0.0.51

18.主库绑定vip
/sbin/ifconfig eth0:0 10.0.0.55/24

19.给脚本执行权限
[[email protected] app1]# chmod +x master_ip_failover

20.添加配置文件
master_ip_failover_script=/etc/mha/app1/master_ip_failover

1.脚本语法问题
2.脚本的格式问题 安装格式转换命令:
[[email protected] app1]# yum install -y dos2unix
[[email protected] app1]# dos2unix master_ip_failover
dos2unix: converting file master_ip_failover to Unix format ...
3.脚本的权限问题 chmod +x master_ip_failover

[[email protected] app1]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:26448) is running(0:PING_OK), master:10.0.0.52

(怕忘,一切为了打卡记录)

原文地址:https://www.cnblogs.com/sudaguo/p/10846170.html

时间: 2024-08-30 04:47:21

linux 中mysql的主从复制的相关文章

Linux中mysql进入命令行报错:MYSQL ERROR 2003 (HY000): Can&#39;t connect to MySQL server on &#39;192.168.99.192&#39; (111)

场景:在Linux中安装mysql01和mysql02,通过VIP虚出一个VIP=192.168.99.192,mysql01为主ip为192.168.99.153,mysql02为备机ip为192.168.99.154 此时VIP在mysql01上通过 mysql01上连接VIP :mysql -h 192.168.99.192 -P 3306   结果是可以正常进入mysql命令行: 通过mysql02上远程连接VIP 会在界面上报错:mysql error 2003(HY000):Can'

linux中MySQL下添加用户以及给予权限的实现

1.在linux中首先登入mysql:mysql -u root -p(提示输入密码,输入即可)  2.选择mysql数据库:use mysql.    在mysql表中插入系统的用户名和用户密码: insert into user(Host,User,Password) values("localhost","你的用户名",password("你要设置的密码")); 3.刷新mysql系统相关的表:flush privileges; 4.给新增

linux中mysql多主一从热备份

前面的文章中http://5148737.blog.51cto.com/5138737/1570274 讲了如何进行linux中的mysql热备份,属于一主一从的情况,但是大部分情况都是多台主机备份到一台从机,节省设备嘛. 找了好久,才找到解决方法,写下来,因为真的忘的很快. 主机的配置都是一样的,修改配置文件,加入server-id 等的配置,重启,创建slave用户并授权,查看master状态,到此主机结束. 接下来就是从机了,也主要是从机了. 因为我们需要对数据库进行change mast

Linux中Mysql安装与使用(CentOS-6.5:mysql-5.5.27)

1 Mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一.MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.MySQL所使用的SQL语言是用于访问数据库的最常

Linux中mysql的root密码重置

方法:在linux中安装好mysql之后默认是没有密码的,但为了安全,我们有必要去设置密码,有时候可能你设置密码后忘记了,那怎么办?那就得去通过修改一个配置文件,它路径在/etc/my.cnf中,然后取消授权,那样就不需要输入密码进入mysql,进去mysql重置密码,修改之后要记得去删除在/etc/my.cnf取消授权的语句. 说明:下边的mysql指令我已经设置了它的环境变量,如果没有设置那么就得用它的绝对路径去执行这个指令. (1)设置密码 #mysqladmin  -uroot  pas

Linux中 MySQL 授权远程连接

说明:当别的机子(IP )通过客户端的方式在没有授权的情况下是无法连接 MySQL 数据库的,如果需要远程连接 Linux 系统上的 MySQL 时,必须为其 IP 和具体用户进行授权.一般 root 用户不会提供给开发者.如:使用 Windows 上的 SQLyog 图形化管理工具连接 Linux 上的 MySQL 数据库,必须先对其进行授权. 1.在虚拟机中使用 root 用户登录 mysql 数据库 mysql -u root -p 说明:root 用户密码一般设置为 root 2.使用

Linux中Mysql root用户看不到mysql库问题解决方式

第一种方式: 1.首先停止MySQL服务:service mysqld stop2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables & 然后就可以无任何限制的访问mysql了3.root用户登陆系统:mysql -u root -p mysql4.切换数据库:use mysql5.显示所有的表:show tables;这里就可以访问表了6.查看user表中root用户的localhost权限:select * from user where

Linux中mysql中文乱码

问题描述:当我们在linux系统上装载mysql后操作数据库的时候,会出现中文乱码问题,比如做插入操作,发现添加到数据库的数据中文出现论码,下面就将解决linux下mysql中文乱码问题!: 环境centos6.5 1.打开Linux窗口,启动mysql: mysql -uroot -proot 2.连接mysql后输入: show variables like '%char%'; 3.配置/etc/my.cnf如下(如果/etc/my.cnf不存在,可以新建/etc/my.cnf文件): [c

Linux mariadb(Mysql)的主从复制架构

mysql的主从复制架构,需要准备两台机器,并且可以通信,安装好2个mysql,保持版本一致性 mysql -v 查看数据库版本 1.准备主库的配置文件  /etc/my.cnf 写入开启主库的参数[mysqld]# 标注 主库的身份idserver-id=1# 那个binlog的文件名log-bin=s15mysql-bin 2.重启mairadb,读取配置文件systemctl restart mariadb 3.查看主库的状态mysql -uroot -p # 这个命令可以查看日志文件的名