百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

centOS7 单机 mysql 5.7.24 主从(mysql主从命令)

mhr18 2024-10-07 10:24 23 浏览 0 评论

centOS7 单机 mysql 5.7.24 主从

@[toc]

背景

java 测试主从库多数据源切换,自己建个虚拟机数据库,随便造。

环境

  • centos 7 x86_64
  • mysql 5.7.24 x86_64 压缩版
  • oracle vm virtualbox 5.2.16

安装

下载 mysql5.7 二进制压缩包

wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

解压 mysql5.7 二进制包到指定目录

tar zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

建立 mysql 软件链接

ln -s /usr/local/mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql 

创建 mysql 用户

useradd -r -s /sbin/nologin mysql

在 mysql 二进制包目录中创建 mysql-files 目录 [mysql 数据导入/导出数据专放目录]

mkdir -v /usr/local/mysql/mysql-files 

创建多实例数据目录

mkdir -vp /data/mysql_data{1..4} 

修改 mysql 二进制包目录的所属用户与所属组

chown root.mysql -R /usr/local/mysql-5.7.24-linux-glibc2.12-x86_64

修改 mysql 多实例数据目录与数据导入/导出专放目录的所属用户与所属组

chown mysql.mysql -R /usr/local/mysql/mysql-files /data/mysql_data{1..4}

配置 mysql 配置文件 /etc/my.cnf

[mysqld_multi] 
mysqld = /usr/local/mysql/bin/mysqld 
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /tmp/mysql_multi.log 
#user = root
#pass = 123456
[mysqld]
explicit_defaults_for_timestamp=true
skip-name-resolve
[mysqld1] 
# 设置数据目录 [多实例中一定要不同] 
datadir = /data/mysql_data1
# 设置sock存放文件名 [多实例中一定要不同] 
socket = /tmp/mysql.sock1 
# 设置监听开放端口 [多实例中一定要不同] 
port = 3306 
# 设置运行用户 
user = mysql 
# 关闭监控 
performance_schema = off 
# 设置innodb 缓存大小 
innodb_buffer_pool_size = 32M 
# 设置监听IP地址 
bind_address = 0.0.0.0 
# 关闭DNS 反向解析 
skip-name-resolve = 0 
#开启主从复制,主库的配置
#log-bin= mysql3306-bin
#指定主库serverid
#server-id=101
#指定同步的数据库,如果不指定则同步全部数据库
#binlog-do-db=zk_test
[mysqld2] 
datadir = /data/mysql_data2
socket = /tmp/mysql.sock2 
port = 3307 
user = mysql 
performance_schema = off 
innodb_buffer_pool_size = 32M 
bind_address = 0.0.0.0 
skip-name-resolve = 0 
#server-id=102
[mysqld3] 
datadir = /data/mysql_data3
socket = /tmp/mysql.sock3 
port = 3308 
user = mysql 
performance_schema = off 
innodb_buffer_pool_size = 32M 
bind_address = 0.0.0.0 
skip-name-resolve = 0 
#server-id=103
[mysqld4] 
datadir = /data/mysql_data4
socket = /tmp/mysql.sock4 
port = 3309 
user = mysql 
performance_schema = off 
innodb_buffer_pool_size = 32M 
bind_address = 0.0.0.0 
skip-name-resolve = 0
#server-id=104

初始化各个实例 [初始化完成后会自带随机密码在输出日志中]

# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1 
# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2 
# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3
# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data4

复制多实例脚本到服务管理目录下 [ /etc/init.d/ ]

# cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi

添加脚本执行权限

# chmod +x /etc/init.d/mysqld_multi

添加进service服务管理

# chkconfig --add mysqld_multi 

mysqld_multi 多实例管理

查个多实例状态

[root@localhost tmp]# /etc/init.d/mysqld_multi report 
Reporting MySQL servers
MySQL server from group: mysqld1 is not running 
MySQL server from group: mysqld2 is not running 
MySQL server from group: mysqld3 is not running 
MySQL server from group: mysqld4 is not running

启动多实例

[root@localhost tmp]# /etc/init.d/mysqld_multi start

查看多实例状态

[root@localhost tmp]# /etc/init.d/mysqld_multi report 
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
MySQL server from group: mysqld3 is running
MySQL server from group: mysqld4 is running

启动某个实例

[root@localhost tmp]# /etc/init.d/mysqld_multi start 1
[root@localhost tmp]# /etc/init.d/mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is not running
MySQL server from group: mysqld3 is not running
MySQL server from group: mysqld4 is not running

启动指定多个实例

[root@localhost tmp]# /etc/init.d/mysqld_multi start 1,2,3
[root@localhost tmp]# /etc/init.d/mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
MySQL server from group: mysqld3 is running
MySQL server from group: mysqld4 is not running

查看实例监听端口

[root@localhost tmp]# netstat -lntp | grep mysqld 
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 12048/mysqld 
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 12051/mysqld 
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 12054/mysqld 
tcp 0 0 0.0.0.0:3309 0.0.0.0:* LISTEN 12057/mysqld

停止所有实例

[root@localhost data]# /etc/init.d/mysqld_multi stop

停止指定实例

[root@localhost tmp]# /etc/init.d/mysqld_multi start 1

停止指定多实例

[root@localhost tmp]# /etc/init.d/mysqld_multi start 1,2,3

该命令不作用,执行以下命令

mysql> grant shutdown on *.* to 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec) 

并将 my.cnf 配置文件,mysqld_multi 下的 user 和 pass 放开,使用 kill -9 杀死mysql 后,mysqld_multi stop 可用

[mysqld_multi] 
user = root
pass = 123456

此时在服务器上可以通过如下方式访问

/usr/local/mysql/bin/mysql -S /tmp/mysql.sock1 -p'!S+EwpgTk3lr'
/usr/local/mysql/bin/mysql -S /tmp/mysql.sock2 -p'XYg=enow9k=7'
/usr/local/mysql/bin/mysql -S /tmp/mysql.sock3 -p'thp9ydhtQk:f'
/usr/local/mysql/bin/mysql -S /tmp/mysql.sock4 -p';(9ti0?Zu19Y'

可能会报错

[root@localhost /]# /usr/local/mysql/bin/mysqld_multi start 1,2,3
WARNING: my_print_defaults command not found.
Please make sure you have this command available and
in your path. The command is available from the latest
MySQL distribution.
ABORT: Can't find command 'my_print_defaults'.
This command is available from the latest MySQL
distribution. Please make sure you have the command
in your PATH.

解决办法是输入如下命令

[root@localhost /]# #vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH

立即生效

source /etc/profile

修改 root 密码

安装完mysql 之后,登陆以后,不管运行任何命令,总是提示这个 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. ,由于初始化各实例的时候采用了系统生成的密码,不方便记忆和操作

mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

完成以上三步退出再登,使用新设置的密码就行了,以上除了123456修改成新密码外,其他原样输入即可

使用 ip 端口访问

添加软链接

ln -s /tmp/mysql.sock1 /tmp/mysql.sock

添加环境变量

[root@localhost /]# #vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH

可以通过以下方式访问

/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p'123456' -P3306
/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p'123456' -P3307
/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p'123456' -P3308
/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p'123456' -P3309

mysql 远程访问

开放3306、3307、3308、3309端口访问

CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙。

1.关闭firewall:

systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service

2.安装iptables防火墙

yum install iptables-services -y

3.启动设置防火墙

# systemctl enable iptables
# systemctl start iptables

4.查看防火墙状态

systemctl status iptables

5.编辑防火墙,增加端口

vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3307 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3308 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3309 -j ACCEPT
:wq! #保存退出

6.重启配置,重启系统

systemctl restart iptables.service #重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动

mysql修改远程访问权限

开启MySQL远程访问权限 允许远程连接

1.登陆mysql数据库

[root@localhost tmp]# /usr/local/mysql/bin/mysql -S /tmp/mysql.sock2 -p'123456'
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 6
Server version: 5.7.24 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
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.

2.查看user表

mysql> use mysql;
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> select host,user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+---------------+
3 rows in set (0.00 sec) 

可以看到在user表中已创建的root用户。host字段表示登录的主机,其值可以用IP,也可用主机名,

(1)有时想用本地IP登录,那么可以将以上的Host值改为自己的Ip即可。

3.实现远程连接(授权法)

将host字段的值改为%就表示在任何客户端机器上能以root用户登录到mysql服务器,建议在开发时设为%。

将权限改为ALL PRIVILEGES

mysql> update user set host = '%' where user = 'root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> grant all privileges on *.* to root@'%' identified by "123456";
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select host,user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| % | root |
| localhost | mysql.session |
| localhost | mysql.sys |
+-----------+---------------+
3 rows in set (0.00 sec)

这样机器就可以以用户名root密码root远程访问该机器上的MySql.

4.实现远程连接(改表法)

use mysql;
update user set host = '%' where user = 'root';

这样在远端就可以通过root用户访问Mysql.

主从同步

主库配置

在my.cnf修改:

#开启主从复制,主库的配置
log-bin= mysql3306-bin
#指定主库serverid
server-id=101
#指定同步的数据库,如果不指定则同步全部数据库
binlog-do-db=zk_test

查询主库状态

执行SQL语句查询状态:需要记录下Position值,需要在从库中设置同步起始值。

mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysql3306-bin.000004 | 154 | test | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在主库创建同步用户

#授权用户slave01使用123456密码登录mysql
mysql> grant replication slave on *.* to 'slave01'@'127.0.0.1'identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

从库配置

在my.cnf修改:

#指定serverid,只要不重复即可,从库也只有这一个配置,其他都在SQL语句中操作
server-id=102

重启所有服务

[root@localhost tmp]# /etc/init.d/mysqld_multi stop

[root@localhost tmp]# /etc/init.d/mysqld_multi start

在从库执行以下SQL:

mysql> change master to
 master_host='127.0.0.1',
 master_user='slave01',
 master_password='123456',
 master_port=3306,
 master_log_file='mysql3306-bin.000004',
 master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
#启动slave同步
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
#查看同步状态 Slave_IO_Running: Yes Slave_SQL_Running: Yes 这两个都是 Yes 就说明同步设置成功
mysql> show slave status\G;
*************************** 1. row ***************************
 Slave_IO_State: Waiting for master to send event
 Master_Host: 127.0.0.1
 Master_User: slave01
 Master_Port: 3306
 Connect_Retry: 60
 Master_Log_File: mysql3306-bin.000006
 Read_Master_Log_Pos: 1072
 Relay_Log_File: localhost-relay-bin.000002
 Relay_Log_Pos: 324
 Relay_Master_Log_File: mysql3306-bin.000006
 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: 1072
 Relay_Log_Space: 535
 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: 101
 Master_UUID: d2131ead-fd22-11e8-9613-0800277ea7e8
 Master_Info_File: /data/mysql_data3/master.info
 SQL_Delay: 0
 SQL_Remaining_Delay: NULL
 Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
 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: 
 Auto_Position: 0
 Replicate_Rewrite_DB: 
 Channel_Name: 
 Master_TLS_Version: 
1 row in set (0.00 sec)
ERROR: 
No query specified

测试主从数据同步

创建数据库 zk_test

执行数据库脚本

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for zk_user
-- ----------------------------
DROP TABLE IF EXISTS `zk_user`;
CREATE TABLE `zk_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of zk_user
-- ----------------------------
INSERT INTO `zk_user` VALUES ('1', '张三');

可以看到从库,从建库到建表插入数据,操作跟主库是一致的

数据库从某一位置进行数据同步

如果,中间进行数据同步,需要将之前数据导入到从库,再开启从库同步,需要重新查看主库的 show master status; 里面 File 、 Position 字段的值,Position 是从哪一步开始重新同步

change master to
 master_host='127.0.0.1',
 master_user='slave01',
 master_password='123456',
 master_port=3306,
 master_log_file='mysql3306-bin.000006',
 master_log_pos=1072;

从库提供只读权限账号

查看 SHOW GLOBAL VARIABLES LIKE 'read_only'

设置只读

解决方法

mysql> set global read_only=1; 
Query OK, 0 rows affected (0.00 sec)
#set global read_only=0 为取消普通账号的只读模式

授权普通MySQL测试账号,只可以进行读

mysql> grant select on zk_test.* to 'test'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

赋值具体权限时可以这样

grant select on testdb.* to common_user@'%'
grant insert on testdb.* to common_user@'%'
grant update on testdb.* to common_user@'%'
grant delete on testdb.* to common_user@'%

多个权限时可以

grant select,insert,update,delete on testdb.* to common_user@'%'

参考地址

Mysql 5.7.21单机多实例安装

mysqld_multi stop无效问题

mysql error You must reset your password using ALTER USER statement before executing this statement.

相关推荐

Dubai's AI Boom Lures Global Tech as Emirate Reinvents Itself as Middle East's Silicon Gateway

AI-generatedimageAsianFin--Dubaiisrapidlytransformingitselffromadesertoilhubintoaglob...

OpenAI Releases o3-pro, Cuts o3 Prices by 80% as Deal with Google Cloud Reported to Make for Compute Needs

TMTPOST--OpenAIisescalatingthepricewarinlargelanguagemodel(LLM)whileseekingpartnershi...

黄仁勋说AI Agent才是未来!但究竟有些啥影响?

,抓住风口(iOS用户请用电脑端打开小程序)本期要点:详解2025年大热点你好,我是王煜全,这里是王煜全要闻评论。最近,有个词被各个科技大佬反复提及——AIAgent,智能体。黄仁勋在CES展的发布...

商城微服务项目组件搭建(五)——Kafka、Tomcat等安装部署

1、本文属于mini商城系列文档的第0章,由于篇幅原因,这篇文章拆成了6部分,本文属于第5部分2、mini商城项目详细文档及代码见CSDN:https://blog.csdn.net/Eclipse_...

Python+Appium环境搭建与自动化教程

以下是保姆级教程,手把手教你搭建Python+Appium环境并实现简单的APP自动化测试:一、环境搭建(Windows系统)1.安装Python访问Python官网下载最新版(建议...

零配置入门:用VSCode写Java代码的正确姿

一、环境准备:安装JDK,让电脑“听懂”Java目标:安装Java开发工具包(JDK),配置环境变量下载JDKJava程序需要JDK(JavaDevelopmentKit)才能运行和编译。以下是两...

Mycat的搭建以及配置与启动(mycat2)

1、首先开启服务器相关端口firewall-cmd--permanent--add-port=9066/tcpfirewall-cmd--permanent--add-port=80...

kubernetes 部署mysql应用(k8s mysql部署)

这边仅用于测试环境,一般生产环境mysql不建议使用容器部署。这里假设安装mysql版本为mysql8.0.33一、创建MySQL配置(ConfigMap)#mysql-config.yaml...

Spring Data Jpa 介绍和详细入门案例搭建

1.SpringDataJPA的概念在介绍SpringDataJPA的时候,我们首先认识下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射(Object-Re...

量子点格棋上线!“天衍”邀您执子入局

你是否能在策略上战胜量子智能?这不仅是一场博弈更是一次量子智力的较量——量子点格棋正式上线!试试你能否赢下这场量子智局!游戏玩法详解一笔一画间的策略博弈游戏目标:封闭格子、争夺领地点格棋的基本目标是利...

美国将与阿联酋合作建立海外最大的人工智能数据中心

当地时间5月15日,美国白宫宣布与阿联酋合作建立人工智能数据中心园区,据称这是美国以外最大的人工智能园区。阿布扎比政府支持的阿联酋公司G42及多家美国公司将在阿布扎比合作建造容量为5GW的数据中心,占...

盘后股价大涨近8%!甲骨文的业绩及指引超预期?

近期,美股的AI概念股迎来了一波上升行情,微软(MSFT.US)频创新高,英伟达(NVDA.US)、台积电(TSM.US)、博通(AVGO.US)、甲骨文(ORCL.US)等多股亦出现显著上涨。而从基...

甲骨文预计新财年云基础设施营收将涨超70%,盘后一度涨8% | 财报见闻

甲骨文(Oracle)周三盘后公布财报显示,该公司第四财季业绩超预期,虽然云基建略微逊于预期,但管理层预计2026财年云基础设施营收预计将增长超过70%,同时资本支出继上年猛增三倍后,新财年将继续增至...

Springboot数据访问(整合MongoDB)

SpringBoot整合MongoDB基本概念MongoDB与我们之前熟知的关系型数据库(MySQL、Oracle)不同,MongoDB是一个文档数据库,它具有所需的可伸缩性和灵活性,以及所需的查询和...

Linux环境下,Jmeter压力测试的搭建及报错解决方法

概述  Jmeter最早是为了测试Tomcat的前身JServ的执行效率而诞生的。到目前为止,它的最新版本是5.3,其测试能力也不再仅仅只局限于对于Web服务器的测试,而是涵盖了数据库、JM...

取消回复欢迎 发表评论: