欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > MySQL 主主复制 binlog |以binlog 方式配置MySQL主主 |shell脚本一键安装MySQL |MySQL性能调优 |MySQL3主

MySQL 主主复制 binlog |以binlog 方式配置MySQL主主 |shell脚本一键安装MySQL |MySQL性能调优 |MySQL3主

2024/10/24 9:51:21 来源:https://blog.csdn.net/qq_61414097/article/details/143195806  浏览:    关键词:MySQL 主主复制 binlog |以binlog 方式配置MySQL主主 |shell脚本一键安装MySQL |MySQL性能调优 |MySQL3主

前言

写文不易   给我点点关注  和点点赞   点点收藏吧
 
三分云计算-CSDN博客三分云计算擅长云计算及运维,大数据运维及大数据基础,Linux操作系统部署大全,等方面的知识,三分云计算关注kubernetes,求职招聘,数据仓库,量子计算,ssh,redis,spring,java,apache,elasticsearch,devops,flume,mysql,vim,开源,空间计算,python,zabbix,github,oracle,nginx,ubuntu,elk,华为云,开源软件,自动化,缓存,数据结构,交友,gitee,flink,运维,pycharm,kafka,服务器,gitlab,搜索引擎,运维开发,大数据,centos,hive,容器,idea,金融,docker,sql,ansible,git,spark,linux,debian,jenkins,json,hadoop,sublime text,数据库,云计算,系统架构,程序人生,负载均衡,vscode,hdfs,bash,aws,etcd,低代码领域.https://blog.csdn.net/qq_61414097?type=blog
我在前配置过MySQL主主 但当时用的是gtid 的方式 这次是MySQL主主 
前文链接如下:

MySQL 基于GID 的一主两从| 修改虚拟机uuid |修改MySQLuuid| 主从复制的一些概念| MySQL 配置GID 模式的一主一从 |使用NTP来进行集群时间同步|本文章已上全站总榜|_mysql主从修改网卡uuid-CSDN博客文章浏览阅读2.2k次,点赞62次,收藏48次。本文章已上全站总榜 MySQL 配置基于GID 模式的一主两从 修改虚拟机uuid 修改MySQL uuid 主从复制的一些概念 MySQL 配置基于GID 模式的一主一从 NTP 来进行时间同步,同步集群时间 _mysql主从修改网卡uuidhttps://blog.csdn.net/qq_61414097/article/details/141358827?spm=1001.2014.3001.5502

MySQL主主复制

用两台centos7 主机名和ip分别为 是 s1 10.8.165.8 s2 10.8.165.9 的 机器

mysql使用yum安装好了 做mysql 主主binlog 同步复制 怎么做?

CentOS 7上设置MySQL主主(Master-Master)复制涉及多个步骤,包括配置MySQL主服务器、启用二进制日志(binlog)、设置用户权限、以及配置复制进程。以下是详细步骤:

1. 安装MySQL

假设已经使用`yum`安装好了MySQL。如果还没有安装,

rpm 包放在 opt下 在rpm 所在文件夹里面 使用脚本 脚本存于我的G

脚本内容如下

#!/bin/bash

#

# 作者: lwq

# 日期: 2023-10-10

# 邮箱:xxxxx

# 代码注意事项: 确保以root用户或具有sudo权限的用户执行此脚本

# CentOS 7或RHEL 7系统上下载、安装并配置MySQL 5.7

# 错误处理函数

error_exit() {

echo "$1" 1>&2

exit 1

}

rm -rf mysql57-community-release-el7-11.noarch.rpm

rm -rf /var/log/mysqld.log

yum erase mariadb mariadb-server mariadb-libs mariadb-devel mysql -y

yum remove mysql-community-server mysql -y

yum remove mysql57-community-release-el7-11.noarch -y

# yum-utils

yum -y install yum-utils

rm -rf /var/lib/mysql

# 1. 检查 MySQL 5.7 YUM 存储库软件包是否已存在

if [ -f "mysql57-community-release-el7-11.noarch.rpm" ]; then

echo "MySQL 5.7 YUM 存储库软件包已存在,跳过下载步骤。"

else

echo "正在下载 MySQL 5.7 YUM 存储库软件包..."

wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm || error_exit "下载 MySQL 5.7 存储库软件包失败。请检查脚本。"

fi

# 2. 安装YUM存储库软件包

if rpm -q mysql57-community-release-el7-11.noarch; then

echo "MySQL 5.7 YUM 存储库软件包已安装,跳过安装步骤。"

else

echo "正在安装 MySQL 5.7 YUM 存储库软件包..."

sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm || error_exit "安装 MySQL 5.7 存储库软件包失败。"

fi

# 导入 GPG 密钥

#echo "正在导入 MySQL GPG 密钥..."

#sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 || error_exit "导入 #MySQL GPG 密钥失败。"

# 3. 修改 /etc/yum.repos.d/mysql-community.repo

echo "正在修改 /etc/yum.repos.d/mysql-community.repo 的 gpgcheck 配置..."

sudo sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/mysql-community.repo || error_exit "修改 /etc/yum.repos.d/mysql-community.repo 失败。"

# 4. 修改 /etc/yum.repos.d/mysql-community-source.repo

echo "正在修改 /etc/yum.repos.d/mysql-community-source.repo 的 gpgcheck 配置..."

sudo sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/mysql-community-source.repo || error_exit "修改 /etc/yum.repos.d/mysql-community-source.repo 失败。"

# 5. 安装MySQL 5.7

echo "正在安装 MySQL 5.7..."

yum install mysql-community-{server,client,common,libs}-* --skip-broken -y ||error_exit "安装 MySQL 5.7 失败。"

# 6. 启动并配置MySQL服务

echo "正在启动 MySQL 服务..."

sudo systemctl restart mysqld || error_exit "启动 MySQL 服务失败。"

echo "正在设置 MySQL 服务开机自启动..."

sudo systemctl enable mysqld || error_exit "设置 MySQL 服务开机自启动失败。"

# 获取临时密码,使用 grep 'password' /var/log/mysqld.log

echo "MySQL 安装完成, 查看MySQL当前用户名和临时密码 如下 "

echo " ---------------------------------------------------"

temp_user=$(grep 'temporary password' /var/log/mysqld.log | awk -F'for ' '{print $2}' | awk -F'@' '{print $1}')

echo "用户是:$temp_user"

temp_password=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')

echo "临时密码: $temp_password"

echo " -----------------------------------------------------"

echo "请使用临时密码登录 MySQL 并更改密码。"

# 提示用户如何登录并更改密码

echo "您可以使用如下命令登录 MySQL:"

echo "mysql -u用户名 -p"

echo "登录后请使用以下命令更改密码:"

echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码';"

echo "比如:ALTER USER 'root'@'localhost' IDENTIFIED BY 'Test@123456.';"

echo "# 放宽密码策略再修改为简单密码"

echo "注:实验环境下,项目上线需恢复密码复杂策略。mysql -u root -p "

echo "SHOW VARIABLES LIKE 'validate_password%';"

echo "SET GLOBAL validate_password_policy = LOW;"

echo "SET GLOBAL validate_password_length=6;"

echo "ALTER USER 'root'@'你的主机名或ip' IDENTIFIED BY '123456';"

echo FLUSH PRIVILEGES;

echo "注:此脚本是先准备好rpm安装包,再yum安装"

echo "# 恢复密码复杂策略"

echo "SET GLOBAL validate_password_policy = MEDIUM;"

echo "SET GLOBAL validate_password_length = 8;"

echo " ------------------------------------------------------------------------------------------"

echo "设置远程权限:"

echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'指定主机ip 或任何IP 设为%' IDENTIFIED BY '123456';"

echo " 执行 mysql -uroot -p123456 -e 'SELECT VERSION();' "

# 以上步骤自动化执行结果如下

temp_user=$(grep 'temporary password' /var/log/mysqld.log | awk -F'for ' '{print $2}' | awk -F'@' '{print $1}')

temp_password=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')

echo "临时密码: $temp_password"

cat >>/etc/my.cnf <<EOF

validate_password=off

EOF

# 重启MySQL服务

systemctl restart mysqld

# 更改MySQL root用户密码

mysqladmin -u"$temp_user" -p"$temp_password" password '123456'

# 清屏

clear

# 检查上一个命令是否成功执行

if [ $? -eq 0 ]; then

echo "mysql密码更改成功,密码是 123456"

echo "请手动执行source /etc/profile"

else

echo "密码更改不成功"

exit 1

fi

性能调优

mysql.cnf 脚本rpm安装mysql 后 性能优化

 注意: 原本配置重命名做备份 这个直接新建 my.cnf

配置直接粘进去

尽管log-bin  log_bin 都可以启用二进制日志,但为了保持与现代MySQL版本的兼容性和一致性,推荐使用log_bin这种写法。

保存退出:

sudo systemctl stop mysqld

# 备份数据

sudo cp -r /var/lib/mysql /var/lib/mysql_backup

sudo rm /var/lib/mysql/ib_logfile0

sudo rm /var/lib/mysql/ib_logfile1

sudo systemctl start mysqld

为啥启动服务之前删文件?

修改innodb_log_file_size 后,如果 MySQL 服务无法启动,通常是由于旧的 InnoDB 日志文件大小与新的配置不匹配。为了让 MySQL 能够正确启动,可能需要手动删除旧的 InnoDB 日志文件

# 停止 MySQL 服务

sudo systemctl stop mysqld

# 备份数据

sudo cp -r /var/lib/mysql /var/lib/mysql_backup

# 删除旧的 InnoDB 日志文件

sudo rm /var/lib/mysql/ib_logfile0

sudo rm /var/lib/mysql/ib_logfile1

# 启动 MySQL 服务

sudo systemctl start mysqld

# 检查 MySQL 服务状态

sudo systemctl status mysqld

# 检查日志文件

tail -f /var/log/mysqld.log

[client]

port=3306

default-character-set=utf8mb4

[mysqld]

port=3306

basedir=/usr

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

# General settings

max_connections=200

character-set-server=utf8mb4

default-storage-engine=INNODB

explicit_defaults_for_timestamp=true

server-id=1

# InnoDB 引擎优化

innodb_buffer_pool_size=1G

innodb_log_file_size=256M

innodb_flush_log_at_trx_commit=2

innodb_file_per_table=1

# 缓存配置

query_cache_size=64M

# query_cache_limit=2M

# 报错日志和慢查询日志配置

slow_query_log=1

slow_query_log_file=/var/log/mysql_slow.log

long_query_time=2

# 其他优化

max_allowed_packet=64M

table_open_cache=400

thread_cache_size=20

# 启用二进制日志

log_bin=/var/lib/mysql/mysql-bin

log_bin-index=/var/lib/mysql/mysql-bin.index

expire_logs_days=10

max_binlog_size=100M

binlog_format=ROW

MySQL主主配置

我在上面 性能调优 中 已经配置好 my.cnf基础配置MySQL主主

2. 配置主服务器(s1 和 s2)

在每台服务器上编辑MySQL配置文件`/etc/my.cnf`,添加如下内容:

尽管log-bin 和 log_bin 都可以启用二进制日志,但为了保持与现代MySQL版本的兼容性和一致性,推荐使用log_bin

s1 (10.8.165.8)

[mysqld]

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

binlog_format = row

auto_increment_increment = 2

auto_increment_offset = 1

relay_log = /var/log/mysql/mysql-relay-bin.log

log_slave_updates = 1

注意:以上七条 若服务起不来 先添加两条。

server-id=1

log-bin=/var/log/mysqlbin/bin-log

上面是通用写法,我个人写法如下:

# 配置主主2 log_bin binlog_format 已在性能调优开启 所以主主配置参数如下:

server-id = 1

auto_increment_increment = 2

auto_increment_offset = 1

relay_log = /var/log/mysql/mysql-relay-bin.log

log_slave_updates = 1

s2 (10.8.165.9)

[mysqld]

server-id = 2

log_bin = /var/log/mysql/mysql-bin.log

binlog_format = row

auto_increment_increment = 2

auto_increment_offset = 2

relay_log = /var/log/mysql/mysql-relay-bin.log

log_slave_updates = 1

# 配置主主2log_bin binlog_format 已在性能调优开启 所以主主配置参数如下:

server-id = 2

auto_increment_increment = 2

auto_increment_offset = 2

relay_log = /var/log/mysql/mysql-relay-bin.log

log_slave_updates = 1

3. 重启MySQL服务

在两台服务器上重启MySQL服务以应用配置:

sudo systemctl restart mysqld

4. 配置复制用户

在两台服务器上分别登录MySQL,并创建用于复制的用户:

注意 我是使用脚本 执行 创建的MySQL

mysql -uroot -p

如果密码输入123456 报错,那么

Test@123456.

试试 这是初始密码可以登进去 ,可能 配置/etc/my.cnf 把密码重置了

SET GLOBAL validate_password_policy = LOW;

SET GLOBAL validate_password_length=6;

ALTER USER 'root'@'%' IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

SELECT User, Host FROM mysql.user WHERE User='root';

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

| User | Host |

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

| root | localhost |

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

1 row in set (0.00 sec)

DROP USER 'root'@'localhost';

ALTER USER 'root'@'%' IDENTIFIED BY '123456';

如果不存在 root % 则创建。

create USER 'root'@'%' IDENTIFIED BY '123456';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

###首先,授予REPLICATION SLAVE权限 s授予 管理员ALL PRIVILEGES 权限 % 表示用户root可以是任意IP

GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password';

FLUSH PRIVILEGES;

s1 (10.8.165.8)

```sql

CREATE USER 'tom '@' 10.8.165.9' IDENTIFIED BY '123456';

GRANT ALL PRIVILEGES ON *.* TO 'tom'@'10.8.165.9' WITH GRANT OPTION;

FLUSH PRIVILEGES;

GRANT REPLICATION SLAVE ON *.* TO 'tom'@'10.8.165.9';

FLUSH PRIVILEGES;

quit

s2 (10.8.165.9)

```sql

CREATE USER 'tom '@' 10.8.165.8' IDENTIFIED BY '123456';

GRANT ALL PRIVILEGES ON *.* TO 'tom'@'10.8.165.8' WITH GRANT OPTION;

FLUSH PRIVILEGES;

GRANT REPLICATION SLAVE ON *.* TO 'tom'@'10.8.165.8';

FLUSH PRIVILEGES;

quit

5. 获取二进制日志文件名和位置

在两台服务器上执行以下命令来获取当前的二进制日志文件名和位置:

s1 (10.8.165.8)

```sql

SHOW MASTER STATUS;

mysql> SHOW MASTER STATUS;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mysql-bin.000002 | 3157 | | | |

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

1 row in set (0.00 sec)

s2 (10.8.165.9)

```sql

SHOW MASTER STATUS;

mysql> SHOW MASTER STATUS;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mysql-bin.000002 | 2252 | | | |

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

记录下`File``Position`字段的值。

6. 配置主主复制

在两台服务器上分别配置对方为其从服务器:

注意在做之前需要修改文件权限

MASTER_LOG_POS=’2252’;句子中, 2252 不加引号

sudo chown -R mysql:mysql /var/log/mysql/

sudo chmod -R 755 /var/log/mysql/

不然报错如下:

mysql> CHANGE MASTER TO

-> MASTER_HOST='10.8.165.9',

-> MASTER_USER='tom',

-> MASTER_PASSWORD='123456',

-> MASTER_LOG_FILE='mysql-bin.000002',

-> MASTER_LOG_POS=’2252’;

ERROR 29 (HY000): File '/var/log/mysql/mysql-relay-bin.index' not found (Errcode: 13 - Permission denied)

RROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2252'' at line 6

s1 (10.8.165.8)

```sql

CHANGE MASTER TO

MASTER_HOST='10.8.165.9',

MASTER_USER='tom',

MASTER_PASSWORD='123456',

MASTER_LOG_FILE='s2_log_file',

MASTER_LOG_POS=s2_log_pos;

START SLAVE;

`s2_log_file``s2_log_pos`替换为从s2获取的日志文件名和位置 比如我的是mysql-bin.000002

s2 (10.8.165.9)

```sql

CHANGE MASTER TO

MASTER_HOST='10.8.165.8',

MASTER_USER='tom',

MASTER_PASSWORD='123456',

MASTER_LOG_FILE='mysql-bin.000002',

MASTER_LOG_POS=3157;

START SLAVE;

`s1_log_file``s1_log_pos`替换为从s1获取的日志文件名和位置。

7. 验证复制状态

在两台服务器上分别执行以下命令来检查复制是否成功:

```sql

SHOW SLAVE STATUS\G;

确保`Slave_IO_Running``Slave_SQL_Running`字段的值都是`Yes`

注意事项

- 确保防火墙允许MySQL服务端口(默认是3306)在两台服务器之间通信。

- 确保两台服务器的时间同步,使用NTP服务同步时间。

- 在进行任何操作前,备份您的数据库以防数据丢失。

通过以上步骤成功配置MySQL的主主(Master-Master)复制。

注意:

如果报错单词为:正在连接,

可以等一会儿, 然后关闭再开启slave,多试几次。

START SLAVE;

SHOW SLAVE STATUS\G;

STOP SLAVE;

 MySQL 主主 -binlog配置完成

补充: 大部分人应该用不到:

MySQL主主后 额外添加一个新节点配置 3主。

下面是将新节点添加到该配置的步骤。

步骤 1:安装 MySQL

 10.8.165.26 上安装 MySQL。首先,确保您的系统是最新的,并安装必要的包:

sudo yum update -y # 此步骤可以跳过 因为更新后系统会很卡

sudo yum install -y epel-release

sudo yum install -y mysql-server

步骤 2:启动 MySQL 服务

安装完成后,启动 MySQL 服务并设置为开机自启:

sudo systemctl start mysqld

sudo systemctl enable mysqld

步骤 3:获取初始密码

MySQL 安装后会生成一个临时密码,您可以通过查看日志文件来获取它:

sudo grep 'temporary password' /var/log/mysqld.log

记下这个临时密码,以便后续登录。

步骤 4:安全配置

使用临时密码登录 MySQL,并执行安全配置脚本:

mysql -u root -p

输入刚才获取的临时密码。

然后,运行以下命令来增强 MySQL 的安全性:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword'; -- 修改 root 密码DELETE FROM mysql.user WHERE User=''; -- 删除空用户DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'; -- 删除远程 root 用户DROP DATABASE IF EXISTS test; -- 删除 test 数据库

FLUSH PRIVILEGES; -- 刷新权限

步骤 5:配置主主复制

1. 10.8.165.26 上配置复制

首先,编辑 MySQL 配置文件 /etc/my.cnf,确保有以下内容:

[mysqld]server-id=3 # 确保每个节点都有唯一的 server-idlog_bin=mysql-binbinlog_format=mixed

1.重启 MySQL 服务

sudo systemctl restart mysqld

1.创建复制用户

 10.8.165.26 上创建一个用于复制的用户(例如 replication_user)并授予权限:

CREATE USER 'replication_user'@'%' IDENTIFIED BY 'YourReplicationPassword';GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';

FLUSH PRIVILEGES;

1.获取当前二进制日志文件和位置

 10.8.165.8 和 10.8.165.9 中执行以下命令,以获取当前的二进制日志文件和位置:

SHOW MASTER STATUS;

记下 File 和 Position 的值。

1. 10.8.165.26 上配置主节点

 10.8.165.26 上执行以下命令,指定两个主节点的连接信息(替换为实际的 IP 和位置):

CHANGE MASTER TO

MASTER_HOST='10.8.165.8',

MASTER_USER='replication_user',

MASTER_PASSWORD='YourReplicationPassword',

MASTER_LOG_FILE='mysql-bin.000001', -- 使用从第4步获得的值

MASTER_LOG_POS=123; -- 使用从第4步获得的值

START SLAVE; -- 启动复制

重复以上步骤,将 10.8.165.9 添加为另一个主节点。

步骤 6:验证复制状态

使用以下命令检查复制状态,确保没有错误:

SHOW SLAVE STATUS\G;

确认 Slave_IO_Running 和 Slave_SQL_Running 都显示为 Yes

总结

通过上述步骤,已成功在 IP 为 10.8.165.26/24 的服务器上安装了 MySQL,并将其添加到主主复制配置中。确保在所有节点之间保持网络连接并监控 MySQL 的运行状态。

写文不易   给我点点关注  和点点赞   点点收藏吧
三分云计算-CSDN博客三分云计算擅长云计算及运维,大数据运维及大数据基础,Linux操作系统部署大全,等方面的知识,三分云计算关注kubernetes,求职招聘,数据仓库,量子计算,ssh,redis,spring,java,apache,elasticsearch,devops,flume,mysql,vim,开源,空间计算,python,zabbix,github,oracle,nginx,ubuntu,elk,华为云,开源软件,自动化,缓存,数据结构,交友,gitee,flink,运维,pycharm,kafka,服务器,gitlab,搜索引擎,运维开发,大数据,centos,hive,容器,idea,金融,docker,sql,ansible,git,spark,linux,debian,jenkins,json,hadoop,sublime text,数据库,云计算,系统架构,程序人生,负载均衡,vscode,hdfs,bash,aws,etcd,低代码领域.https://blog.csdn.net/qq_61414097?type=blog

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com