mysql multi主从复制_mysqld_multi方式配置Mysql数据库主从复制

mysqld_multi设计用于管理在同一台机器上运行的多个mysqld进程,这些进程使用不同的socket文件并监听在不同的端口上。mysqld_multi可以批量启动、关闭、或者报告这些mysqld进程的状态。在这里我们通过这种方式来在同一个机器上启动多个数据库实例,并配置主从关系。

1、下载MySQL压缩包

wget http://dev.MySQL.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

2、创建安装目录

这里我将Mysql安装在/usr/local/mysql目录里面,也可以安装在其他地方;

mkdir /usr/local/mysql

3、解压并复制

tar -xvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

mv mysql-5.7.18-linux-glibc2.5-x86_64/* /usr/local/mysql/

4、创建data目录

mkdir /usr/local/mysql/data{3306,3307,3308} -p

5、创建mysql用户组及其用户

groupadd mysql

useradd -r -g mysql mysql

6、修改权限

chown -R mysql:mysql /usr/local/mysql

7、初始化实例的数据库

mysql_install_db 方式已经 deprecated 了,我们使用 mysqld 的 initialize 方法来做初始化

# --no-defaults 不读取默认的 /etc/my.cnf 全局配置文件 否则可能存在一些冲突问题

# --initialize-insecure 初始化且不需要生成密码,我不太喜欢那一大串字符...

# --basedir mysql 的安装目录

# --datadir 本实例的数据目录

# --user 这样生成的文件用户为 mysql

# --explicit_defaults_for_timestamp timestamp 已经 deprecated 了

#生成 3306 的数据目录

[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3306 --user=mysql --explicit_defaults_for_timestamp

#生成 3307 的数据目录

[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3307 --user=mysql --explicit_defaults_for_timestamp

#生成 3307 的数据目录

[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3308 --user=mysql --explicit_defaults_for_timestamp

8、将mysql命令加入环境变量

在/etc/profile最后加入两行命令:

MYSQL_HOME=/usr/local/mysql

export PATH=$PATH:$MYSQL_HOME/bin

最后执行source /etc/profile,使得配置生效

9、创建/etc/my.cnf

[mysqld_multi]

mysqld=/usr/local/mysql/bin/mysqld_safe #mysqld命令的位置,用于启动mysql实例,也可以指定为mysqld_safe命令的位置

mysqladmin = /usr/local/mysql/bin/mysqladmin #用于停止mysql实例

user=root #调用mysqladmin时使用的账号

#password=123456 调用 mysqladmin时使用的账号的密码,因为我们使用了initialize-insecure,所以root用户最开始是没有密码的

log=/usr/local/mysql/mysql_multi.log

[mysqld3306]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data3306

port=3306

user=mysql

socket=/tmp/mysql.sock3306

server_id=1

log_bin=mysql-bin #主库

[mysqld3307]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data3307

port=3307

user=mysql

socket=/tmp/mysql.sock3307

server_id=2

[mysqld3308]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data3308

port=3308

user=mysql

socket=/tmp/mysql.sock3308

server_id=3

在mysqld_multi中配置的user和password是mysql的用户名和密码。为了使用mysqld_multi命令,每个mysql实例都必须要提供一个相同的用户名和密码,用于启动和停止服务。而且要确保这个用户具有停止mysql实例的权限。提示:

在[mysqlN]中配置的user是linux中的用户,是启动mysql服务实例时使用的用户

mysqld_multi提供了start, stop, reload (stop and restart)和report 表示要执行的不同操作。可以参见官方文档查看https://dev.mysql.com/doc/refman/5.7/en/mysqld-multi.html其完整用法,因为命令非常简单,这里不做过多介绍。

10、启动MySQL实例

[root@localhost mysql]# mysqld_multi start

11、查看3个实例的运行状态

[root@localhost mysql]# mysqld_multi report

Reporting MySQL servers

MySQL server from group: mysqld3306 is running

MySQL server from group: mysqld3307 is running

MySQL server from group: mysqld3308 is running

也可以通过netstat-tln来查看

[root@localhost Desktop]# netstat -tln|grep 330*

tcp 0 0 :::3307 :::* LISTEN

tcp 0 0 :::3308 :::* LISTEN

tcp 0 0 :::3306 :::* LISTEN

12 配置主从关系

打开3个命令行窗口,分别执行以下命令登录主从数据库:

mysql -h127.0.0.1 -uroot -P3306 -p

mysql -h127.0.0.1 -uroot -P3307 -p

mysql -h127.0.0.1 -uroot -P3308 -p

因为我们初始化数据库的时候,没有为root用生成密码,因此出现提示输入password的时候,直接按enter键就可以了。在这3个命令行窗口都执行以下命令,用于创建复制账号:

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'localhost' IDENTIFIED BY 'slave';

33de785b14a163424be398b58a595ee4.png

理论上,只要再主库上创建复制账号即可,但是因为考虑到主备切换的问题,因此在从库上也创建复制账号。另外需要注意的是,从库从主库复制,本身只需要REPLICATION SLAVE权限即可,REPLICATION CLIENT权限是让这个用户拥有执行SHOW MASTER STATUS和SHOW SLAVE STATUS命令,也就是说这个权限是用于授予账户监视Replication状况的权力,我们将在之后看到这两个命令如何使用。

我们需要在3307和3308上,分别执行以下命令,将3306设置为主库,这一步是告诉备库如何连接到主库并重复其二进制日志,旧版本的方式是通过修改my.cnf来配置,但是在新的版本中,修改my.cnf的配置方式已经废弃。而是使用CHANGE MASTER TO 语句,该语句完全替代了my.cnf 中相应的设置,并且允许以后指向别的主库时无须重启备库。下面是复制开始的基本命令:

mysql> CHANGE MASTER TO

MASTER_HOST='localhost',

MASTER_USER='slave',

MASTER_PORT=3306,

MASTER_PASSWORD='slave',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=0;

只需要配置一次即可,之后重启的时候,slave会自动连接到master同步数据,不需要每次都执行这些命令。

需要注意的是,此时复制并没有真正的开始,我们可以在主库3306上执行以下命令,,查看主库状态:

mysql> show master status;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mysql-bin.000001 | 154 | | | |

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

1 row in set (0.00 sec)

mysql> show processlist;

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

| Id | User | Host | db | Command | Time | State | Info |

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

| 3 | root | localhost:58685 | NULL | Query | 0 | starting | show processlist |

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

1 row in set (0.00 sec)

在从库3307或者3308上,执行以下命令:

mysql> show slave statusG;

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

Slave_IO_State:

Master_Host: localhost

Master_User: slave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 4

Relay_Log_File: localhost-relay-bin.000001

Relay_Log_Pos: 4

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: No

Slave_SQL_Running: No

Replicate_Do_DB:

Replicate_Ignore_DB:

...omitted....

Seconds_Behind_Master: NULL

...omitted....

1 row in set (0.00 sec)

Slave_IO_State、Slave_IO_Running、Slave_SQL_Running这三列显示备库复制尚未执行。

此时在从库3307和3308上分别执行以下命令,开始复制:

mysql> start slave;

此时在3307和3308上再执行show slave status,可以看到

mysql> show slave statusG;

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

Slave_IO_State: Waiting for master to send event #等待主库发送bin-log同步事件

Master_Host: localhost

Master_User: slave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 4

Relay_Log_File: localhost-relay-bin.000001

Relay_Log_Pos: 4

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes #状态变为YES

Slave_SQL_Running: Yes #状态变为YES

Replicate_Do_DB:

Replicate_Ignore_DB:

...omitted....

Seconds_Behind_Master: NULL

...omitted....

此时再查看主库3306的状态

mysql> show processlistG;

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

Id: 3

User: root

Host: localhost:58685

db: NULL

Command: Query

Time: 0

State: starting

Info: show processlist

*************************** 2. row ***************************

Id: 4

User: slave

Host: localhost:35312

db: NULL

Command: Binlog Dump

Time: 161

State: Master has sent all binlog to slave; waiting for more updates

Info: NULL

*************************** 3. row ***************************

Id: 5

User: slave

Host: localhost:35313

db: NULL

Command: Binlog Dump

Time: 154

State: Master has sent all binlog to slave; waiting for more updates

Info: NULL

3 rows in set (0.00 sec)

可以看有2个线程执行了Binlog Dump命令,这就是我们的两个从库已经开始复制。

现在在主库3306上创建一个库draon_ha,在其中创建一个表user,并插入一条记录,这数据都会自动同步到两个从库中

CREATE DATABASE `dragon_ha`;

use dragon_ha;

CREATE TABLE `user` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into user(name) values('tianshouzhi');

mysql> show databases;分别在3307和3308两个从库中执行以下命令,查看数据是否已经同步:

mysql> show databases;

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

| Database |

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

| information_schema |

| dragon_ha |#插入的库已经同步

| mysql |

| performance_schema |

| sys |

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

5 rows in set (0.00 sec)

mysql> use dragon_ha;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

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

| Tables_in_dragon_ha |

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

| user |#插入的表已经同步

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

1 row in set (0.00 sec)

mysql> select * from user;

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

| id | name |

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

| 1 | tianshouzhi |#插入的记录已经同步

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

1 row in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 日志节点恢复_基于binlog二进制日志的MySQL恢复笔记

基于binlog二进制日志的MySQL恢复笔记刚好复习到这里,顺手做个小实验,记录下。总的操作流程:step0、关掉数据库的对外访问【防止用户操作继续写入这个库】step1、mysqlbinlog 导出相关时间段数据库的二进制日志step2、编辑today.sql找到误操作…

mysql中if在oracle怎么用_mysql和oracle的mybatis操作

1.Oracle、MySQL插入时返回下一个主键的操作Xml代码 Oracle:SELECT SEQ_ROLE.NEXTVAL AS ID FROM DUALinsert into ROLE(ID, NAME, CREATE, MODIFY) values (#{id}, #{name}, sysdate, sysdate)注意:这边的keyProperty"id"中"id"指的…

mysql数据库的三级模式_2016年计算机三级MySQL数据库试题

2016年计算机三级MySQL数据库试题一、选择题1.E-R图提供了表示信息世界中实体、属性和________的方法。A.数据B.联系C.表D.模式2.数据库系统的核心是________。A.数据模型B.数据库管理系统C.数据库D.数据库管理员3.E-R图是数据库设计的工具之一,它一般适用于建立数据…

python对角线图_python对角线图_python – 在Seaborn Jointplot上绘制对角线(相等的线)...

错误是一个有用的暗示:JointPlot是子图的集合,你必须找到特定的斧头来绘制.修改Seaborn示例:import numpy as npimport pandas as pdimport seaborn as snsfrom matplotlib.pyplot import showsns.set(style"white")# Generate a random corre…

python编程求极限_Sympy笔记一

from IPython.display import displayfrom sympy import *前置知识理解这份笔记的内容需,读者需要具备基础的python知识并且对函数,微积分和矩阵有一定的基础。辅助函数由于后面的笔记中, 我们会大量将一个Sympy object和应用某个函数之后&am…

python语言逆序符号_python的逆序

下面的代码片段可以帮助您完成最后一个任务。如果在字符串的开始或结尾之外的其他地方发现了特殊字符,则对于子集的恢复没有特殊处理。在# Special chars which should be ignored for revertingSPECIALCHARS [ , ., ,]def reverse( string_ ):# Find occurence of…

wpf mysql存储过程_MySQL存储过程的创建及调用

# SQL语句:先编译后执行存储过程(Stored Procedure):一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。优点(为什么要用存储过…

mysql没加引号导致全表扫描_mysql隐蔽的索引规则导致数据全表扫描

索引是为了加速数据的检索,但是不合理的表结构或适应不当则会起到反作用。我们在项目中就遇到过类似的问题,两个十万级别的数据表,在做连接查询的时候,查询时间达到了7000多秒还没有查出结果。首先说明,关联的字段都已…

python123测验7程序题答案_Python语言程序设计 Python123 测验7: 文件和数据格式化(编程题)...

版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/weixin_42067082/article/details/97661863文本的平均列数描述:打印输出附件文件的平均列数…

mysql 多个密码登录_mysql 多实例登录密码测试

最近在做mysql 多实例的时候,采用不同的方式登录mysql数据库,发现mysql -uroot -p -h 127.0.0.1 -P3308 ,登录时居然不要密码就可以登录,吓得我一身汗,经过检查终于找到原因记录下来,给小白们参考。[rootmy…

设置MySQL排序方式_设置MySQL设置字符集和排序方式

1. 编辑/etc/my.cnf文件, 在"[client]"下添加"default-character-setutf8"2. 编辑/etc/my.cnf文件, 在"[mysqld]"下添加"default-character-setutf8"3. 重新启动mysql服务# sudo /etc/init.d/mysqld restart* 查看系统字符集和排序方式…

redhat5.4 安装mysql_Linux redhat 5.4上安装MYDNS

Linux redhat 5.4上安装MYDNS一、1,MYDNS 的简介:MyDNS是一个UNIX平台下的免费DNS服务器端软件。它被设计成直接从数据库中读取DNS记录软件,并且修改记录后也可时时生效。在MyDNS上,你可随心所欲地增加你自己的次级域名的同时建站…

mysql 5.7 flashback_Flashback for MySQL 5.7

实现原理flashback的概念最早出现于Oracle数据库,用于快速恢复用户的误操作。flashback for MySQL用于恢复由DML语句引起的误操作,目前不支持DDL语句。例如下面的语句:DELETE FROM XXX;UPDATE XXX SET YYYZZZ;若没有flashback功能&#xff0c…

给mysql数据库设计编码_MYSQL数据库编码原理

很多站长可能与织梦CMS小编一样,觉得MYSQL数据库即熟悉又神秘。熟悉是因为我们每天都会用到MYSQL进行安装织梦程序,陌生是因为mysql经常与linux联系,是基于linux系统的下的应用,而我们平常使用的都是windows主机系统。织梦CMS就基…

Java2精要_java知识精要(一)

一、java数组 (疯狂java讲义 第4.5 ~ 4.6章节)1) 声明形式:type[] arrayName; 推荐方式type arrayName[];2) 初始化:方式一:type[] arrayName;arrayName new type[] {element1, element2, element3, ...}方式二:type[] arrayName…

java的反射机制是什么_JAVA反射机制

一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。二、哪里用到反射机制 有些时候,我们用过一些知识&#xf…

java dot画图_小O的图案 (Java代码)(最简单的解法)

解题思路:注意事项:参考代码:import java.util.Scanner;public class C1788 {public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNext()) {F(sc.nextInt());}sc.close();}private static void F(int n){System.out.println(n);int len…

java inireader_java读取配置文件 Java中如何设置读取ini配置文件?

Java读取配置文件的几种方法以及路径问题看透,心静,锁份幽静,将自己填埋在那里,任窗外灯红酒绿,草长莺飞,让那颗疲惫的心,静静地栖息在流水盈盈里,抛却尘世累累。java 怎么读取web j…

java unsafe park_Java魔法类——Unsafe应用解析

前言Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java…

mysql中group by的排序问题_Mysql之group by 和order by 一起用时的排序问题

业务需求,需要查询表里不同分类下的order最大的记录。查看表中的记录:SELECT id,tid,order, FROM_UNIXTIME(yestime) FROM tfenWHERE tid IN(7512, 7514)ORDER BY order DESC ;结果如下:排序的sql语句:SELECT id,tid,order, FROM_…