当前位置: 首页 > news >正文

在部署了一台mysql5.7的机器上部署mysql8.0.35

在已部署 MySQL 5.7 的机器上部署 MySQL 8.0.35 的完整指南

在同一台服务器上部署多个 MySQL 版本需要谨慎规划,避免端口冲突和数据混淆。以下是详细的部署步骤:

一、规划配置

  1. 端口分配

    • MySQL 5.7:使用默认端口 3306
    • MySQL 8.0.35:使用新端口 3308(或其他未使用端口)
  2. 数据目录

    • MySQL 5.7:保留原有数据目录(通常为 /var/lib/mysql
    • MySQL 8.0.35:创建新数据目录(如 /var/lib/mysql8
  3. 配置文件

    • MySQL 5.7:保留 /etc/my.cnf
    • MySQL 8.0.35:创建新配置文件(如 /etc/mysql8/my.cnf

二、安装 MySQL 8.0.35

https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.35-linux-glibc2.12-x86_64.tar.xzhttps://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.35-linux-glibc2.12-x86_64.tar.xz

将mysql-8.0.35-linux-glibc2.12-x86_64.tar.xz包解压到/usr/local/mysql8/ 

tar -xvf mysql-8.0.35-linux-glibc2.12-x86_64.tar.xz -C /usr/local/mysql8/ --strip-components=1

 

1.修改配置文件 /etc/mysql8/my.cnf
[mysqld]
bind-address = 0.0.0.0
port = 3308basedir = /usr/local/mysql8
datadir = /var/lib/mysql8
socket = /var/lib/mysql8/mysql.sock
log-error = /var/lib/mysql8/error.log
pid-file = /var/lib/mysql8/mysqld.pid# 完整功能配置
lower_case_table_names=1
max_connections=500
max_allowed_packet=5000M
innodb_default_row_format = DYNAMIC
innodb_file_per_table = ON
innodb_page_size = 32K
sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_IN_DATE"
default_storage_engine = InnoDB
innodb_buffer_pool_size = 512M
innodb_log_file_size = 256M
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
2. 初始化数据库
/usr/local/mysql8/bin/mysqld --defaults-file=/etc/mysql8/my.cnf --initialize --user=mysql
3.查看临时密码
sudo grep 'temporary password' /var/lib/mysql8/error.log
4.新建启动脚本
vi /etc/init.d/mysql8
#!/bin/bash
# MySQL 8.0.35 init script
# chkconfig: 2345 64 36
# description: MySQL 8.0.35 Server### BEGIN INIT INFO
# Provides:          mysql8
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop MySQL 8.0.35
# Description:       MySQL 8.0.35 Server
### END INIT INFObasedir=/usr/local/mysql8
datadir=/var/lib/mysql8
conf=/etc/mysql8/my.cnf
pid_file="$datadir/mysqld.pid"
socket="$datadir/mysql.sock"
user=mysql
lock_file="/var/lock/subsys/mysql8"start() {echo -n "Starting MySQL 8.0.35: "if [ -f "$pid_file" ]; thenread pid < "$pid_file"return 0fifi$basedir/bin/mysqld_safe --defaults-file="$conf" --user="$user" >/dev/null 2>&1 &sleep 3if [ -f "$pid_file" ]; thenecho "OK"touch "$lock_file"return 0elseecho "FAILED"return 1fi
}stop() {echo -n "Stopping MySQL 8.0.35: "if [ ! -f "$pid_file" ]; thenecho "not running"return 0firead pid < "$pid_file"if [ ! -d "/proc/$pid" ]; thenecho "not running"rm -f "$pid_file" "$lock_file"return 0fi$basedir/bin/mysqladmin --defaults-file="$conf" --user=root --socket="$socket" -p'password' shutdownsleep 3if [ -d "/proc/$pid" ]; thenecho "FAILED"return 1elseecho "OK"rm -f "$pid_file" "$lock_file"return 0fi
}status() {if [ -f "$pid_file" ]; thenread pid < "$pid_file"if [ -d "/proc/$pid" ]; thenecho "MySQL 8.0.35 is running (PID: $pid)"return 0elseecho "MySQL 8.0.35 is not running, but PID file exists"return 1fielseecho "MySQL 8.0.35 is not running"return 3fi
}case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $0 {start|stop|restart|status}"exit 1
esacexit 0

三. 修改外部可访问

启动mysql8

/etc/init.d/mysql8 start

 使用临时密码登录

/usr/local/mysql8/bin/mysql  -h 127.0.0.1 -P 3308 -u root -p'passwod'

修改密码为1234 

ALTER USER 'root'@'localhost' IDENTIFIED BY '1234';

刷新

FLUSH PRIVILEGES;

查看发现只有本地可访问,修改可访问的主机为所有

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

再次查看发现修改成功,同时刷新

FLUSH PRIVILEGES;

四. 客户端兼容

  • MySQL 8.0 默认使用 caching_sha2_password 认证插件,若旧客户端(如 MySQL 5.7 客户端)连接失败,需修改认证方式:
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

五.数据库迁移脚本

数据库表和数据导出脚本

vi /opt/export_script.sh
#!/bin/bash# MySQL 5.7 配置(root账户 + 明文密码)
SRC_USER="root"
SRC_PASSWORD="password"
SRC_HOST="localhost"
SRC_PORT="3306"# 导出配置
BACKUP_DIR="/data/backup/mysql"
THREADS=8
mkdir -p $BACKUP_DIR# 导出所有表结构
# 导出所有表结构(排除系统库)
mysqldump -u$SRC_USER -p$SRC_PASSWORD -h$SRC_HOST -P$SRC_PORT \--no-data \--databases $(mysql -u$SRC_USER -p$SRC_PASSWORD -h$SRC_HOST -P$SRC_PORT -N -e "SHOW DATABASES WHERE \`Database\` NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys','dz','dzys_db','gfclimate2021','grid','northwind','testdemoapp','yww_meta','ywwsystem')") \> $BACKUP_DIR/structure.sql
# 获取所有表名
TABLES=$(mysql -u$SRC_USER -p$SRC_PASSWORD -h$SRC_HOST -P$SRC_PORT -N -e "SELECT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys','dz','dzys_db','gfclimate2021','grid','northwind','testdemoapp','yww_meta','ywwsystem')")# 创建FIFO队列控制并发
FIFO="/tmp/export_fifo.$$"
mkfifo $FIFO
exec 3<>$FIFO
rm $FIFO# 初始化线程池
for ((i=1; i<=$THREADS; i++)); doecho >&3
done# 并行导出每个表
for table in $TABLES; doread -u 3{db=$(echo $table | cut -d. -f1)tbl=$(echo $table | cut -d. -f2)echo "导出 $table..."mysqldump -u$SRC_USER -p$SRC_PASSWORD -h$SRC_HOST -P$SRC_PORT --no-create-info --single-transaction --quick $db $tbl | gzip > $BACKUP_DIR/${db}@${tbl}.sql.gzecho >&3} &
donewait
exec 3>&-
echo "数据导出完成!"

 数据库表和数据导入脚本

vi /opt/import_script.sh
#!/bin/bash# MySQL 8 配置(root账户 + 明文密码)
DST_USER="root"
DST_PASSWORD="password"
DST_HOST="127.0.0.1"
DST_PORT="3308"# 导入配置
BACKUP_DIR="/data/backup/mysql"
THREADS=8# 导入表结构(先禁用外键检查)
/usr/local/mysql8/bin/mysql -u$DST_USER -p$DST_PASSWORD -h$DST_HOST -P$DST_PORT -e "SET FOREIGN_KEY_CHECKS=0;"
/usr/local/mysql8/bin/mysql -u$DST_USER -p$DST_PASSWORD -h$DST_HOST -P$DST_PORT < $BACKUP_DIR/structure.sql
/usr/local/mysql8/bin/mysql -u$DST_USER -p$DST_PASSWORD -h$DST_HOST -P$DST_PORT -e "SET FOREIGN_KEY_CHECKS=1;"# 获取所有备份文件
FILES=$(ls $BACKUP_DIR/*.sql.gz 2>/dev/null || true)# 创建FIFO队列控制并发
FIFO="/tmp/import_fifo.$$"
mkfifo $FIFO
exec 3<>$FIFO
rm $FIFO# 初始化线程池
for ((i=1; i<=$THREADS; i++)); doecho >&3
done# 并行导入每个表
for file in $FILES; do[[ "$file" == *"structure.sql.gz" ]] && continue  # 跳过结构文件read -u 3{filename=$(basename $file)db=$(echo $filename | cut -d@ -f1)tbl=$(echo $filename | cut -d@ -f2 | cut -d. -f1)echo "导入 $db.$tbl..."gunzip -c $file | /usr/local/mysql8/bin/mysql -u$DST_USER -p$DST_PASSWORD -h$DST_HOST -P$DST_PORT $dbecho >&3} &
donewait
exec 3>&-
echo "数据导入完成!"

http://www.xdnf.cn/news/694081.html

相关文章:

  • QGraphicsView、QGraphicsScene和QGraphicsItem图形视图框架(七)修改item属性
  • Golang分布式系统开发实践指南
  • GO语言进阶:掌握进程OS操作与高效编码数据转换
  • 命象架构法 02|你的系统有“用神”吗?
  • [Python] 如何使用 Python 调用 Dify 工作流服务实现自动化翻译
  • Java常用加密方式
  • 聊一聊如何使用自动化测试来提高接口测试效率的?
  • PowerBI企业运营分析—绩效考核分析
  • 如何使用DeepSpeed来训练大模型
  • CPU特权级别:硬件与软件协同构建系统安全的基石
  • UDP组播套接字与URI/URL/URN技术详解
  • WHAT - useWebSocket 推荐
  • 深入理解设计模式之职责链模式
  • Python包管理器 uv替代conda?
  • 基于bp神经网络的adp算法
  • Django 中的路由系统
  • Elasticsearch父子关系解析
  • SpringBoot3.4.5 开启虚拟线程(JDK21)
  • WPF的基础设施:XAML基础语法
  • ISOLAR软件生成报错处理(三)
  • PR2020+MS1824+MS7210+MS2130 1080P@60Hz USB3.0采集
  • 用户关注表的设计
  • 【深度学习-pytorch篇】5. 卷积神经网络与LLaMA分类模型
  • 钩子函数的作用(register_hook)
  • 基于c++11重构的muduo核心库项目梳理
  • 动态规划-LCR 091.粉刷房子-力扣(LeetCode)
  • xcode 编译运行错误 Sandbox: rsync(29343) deny(1) file-write-create
  • pycharm生成图片
  • 【设计模式】简单工厂模式,工厂模式,抽象工厂模式,单例,代理,go案例区分总结
  • 自动化测试基础知识详解(全)