【Mysql】记一次Mysql离线安装

一、前言

记录一次在客户现场,Mysql离线安装全过程,服务器不通外网故选择离线安装。

  • 第一步:离线安装Mysql
  • 第二步:数据迁移

二、离线安装

2.1 下载

官方下载地址:https://downloads.mysql.com/archives/community/
选择版本:8.0.35
8.0.35

2.2 默认安装&初始化

Step1:解压、安装、初始化:

cd /usr/local/src

# 1.上传客户服务器后,解压
tar xvf mysql-8.0.35-linux-glibc2.12-x86_64.tar.xz

# 2.重命名
mv mysql-8.0.35-linux-glibc2.12-x86_64 mysql8

# 3.新建数据、日志存储目录
cd mysql8
mkdir data
mkdir logs

# 4.新建mysql系统用户
groupadd mysql
useradd -g mysql mysql

# 5.授权
chown -R mysql.mysql /usr/local/src/mysql8

# 6.手动启动测试,获取root初始密码
./bin/mysqld --user=mysql --basedir=/usr/local/src/mysql8 --datadir=/usr/local/src/mysql8/data --initialize

在这里插入图片描述
Step2:登录修改root初始密码(必须修改):

# 使用mysql客户端登录root账户
/usr/local/src/mysql8/bin/mysql -uroot -p

# 输入root初始密码,进入mysql控制台

# 修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
CREATE USER 'root'@'%' IDENTIFIED BY '新密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; 
FLUSH PRIVILEGES;
exit;

2.3 正式安装

2.3.1 创建socket目录

# 创建mysql的socket文件目录
mkdir -p /var/run/mysqld
chown -R mysql:mysql /var/run/mysqld

2.3.2 创建Mysql配置文件

# 新建配置文件
touch /etc/my.cnf
# 授权
chmod 644 /etc/my.cnf

my.cnf 配置文件内容:

[mysqld]
# ======================== 用户与基础 ========================
user = mysql
log_timestamps = SYSTEM
skip_external_locking

# ======================== 数据目录 & 端口 ========================
basedir = /usr/local/src/mysql8
datadir = /usr/local/src/mysql8/data
port = 13306
socket = /var/run/mysqld/mysql.sock
pid_file = /usr/local/src/mysql8/logs/mysqld.pid

# ======================== 网络与连接 ========================
max_connections = 400
max_connect_errors = 1000
thread_cache_size = 150
thread_stack = 256K
back_log = 100
wait_timeout = 600
interactive_timeout = 600
connect_timeout = 10
skip_name_resolve = ON
max_user_connections = 400

# ======================== 内存分层优化 ========================
innodb_buffer_pool_size = 5G
innodb_buffer_pool_instances = 4
innodb_buffer_pool_chunk_size = 128M
innodb_change_buffer_max_size = 20
innodb_adaptive_hash_index = ON
innodb_adaptive_hash_index_parts = 8
tmp_table_size = 128M
max_heap_table_size = 128M
sort_buffer_size = 2M
join_buffer_size = 2M

# ======================== InnoDB IO 与事务优化 ========================
# 使用新参数替代废弃的 innodb_log_file_size 和 innodb_log_files_in_group
innodb_redo_log_capacity = 512M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_read_io_threads = 4
innodb_write_io_threads = 4
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_autoextend_increment = 128
innodb_file_per_table = ON
innodb_lock_wait_timeout = 30
innodb_deadlock_detect = ON
innodb_print_all_deadlocks = ON

# ======================== 日志配置 ========================
log_error = /usr/local/src/mysql8/logs/error.log
slow_query_log = 1
slow_query_log_file = /usr/local/src/mysql8/logs/slow-query.log
long_query_time = 3
log_queries_not_using_indexes = 0
log_slow_admin_statements = 0

# ======================== 字符集与排序 ========================
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# ======================== 表与索引缓存优化 ========================
table_definition_cache = 2048
table_open_cache = 4096
table_open_cache_instances = 4
innodb_stats_auto_recalc = ON
innodb_stats_persistent_sample_pages = 20

# ======================== SQL 模式 ========================
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

# ======================== binlog / 复制 / 审计 ========================
server-id = 13306
log_bin = /usr/local/src/mysql8/logs/mysql-bin
# binlog_format = ROW  # MySQL 8.0.34+ 已弃用,默认即ROW,可删除此行
binlog_row_image = FULL
sync_binlog = 1
binlog_expire_logs_seconds = 604800
max_binlog_size = 100M

# ======================== X Plugin配置(可选) ========================
# 如果不需要X Plugin,可以禁用
# mysqlx = OFF
# 如果需要,可以明确指定端口和socket
mysqlx_port = 33060
mysqlx_socket = /var/run/mysqld/mysqlx.sock

[client]
port = 13306
socket = /var/run/mysqld/mysql.sock

[mysql]
port = 13306
socket = /var/run/mysqld/mysql.sock

2.3.3 使用systemd启动mysqld

Step1:新建systemd文件:

touch /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql
WorkingDirectory=/usr/local/src/mysql8

ExecStartPre=/bin/sh -c 'mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld'
ExecStart=/usr/local/src/mysql8/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql

Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

Step2:启动mysql:

# 设置开机自启
systemctl enable mysqld.service
systemctl is-enabled mysqld.service

# 启动
systemctl start mysqld.service

# 查看状态
systemctl status mysqld.service

# 停止
systemctl stop mysqld.service

Step3:查看启动日志:

# 查看systemd启动输出
journalctl -u mysqld.service -n 50 --no-pager

# 查看MySQL启动日志
tail -50 /usr/local/src/mysql8/logs/error.log

Step4:连接测试:

/usr/local/src/mysql8/bin/mysql -uroot -p

三、数据迁移

这次选择使用 mysqldump 导出导入

前提:

  1. mysqldump为快照,所以导出前一定要停掉应用服务
  2. 建议在数据量小于50G时使用,数据量越大应用停机时间越久
  3. 目标数据库版本 >= 源数据库版本
  4. 字符集要一致
# 导出指定库
docker exec mysql /usr/bin/mysqldump -u root -p密码 --single-transaction --quick --lock-tables=false --databases 数据库名 | gzip > /usr/local/src/db_backup.sql.gz

# 导入
gunzip < /usr/local/src/db_backup.sql.gz | /usr/local/src/mysql8/bin/mysql -uroot -p密码 -P13306 -h127.0.0.1 数据库名

实测5G左右数据,一小时内完成:
1)gzip压缩后不到1G
2)导出耗时20分钟左右
3)导入耗时20分钟左右

# 查看指定数据库占用磁盘空间大小
du -sh /usr/local/src/mysql8/data/数据库名

四、问题记录

4.1 Mysql启动失败

可能有以下几种可能:

  1. 写入权限:需要给系统用户mysql,授权mysql数据、日志等目录操作权限
  2. 配置有误:检查配置文件,可能有些配置项名称写错了,各版本有差异

4.2 迁移前后.ibd文件变小了

这个其实是正常的,只要数据条数一致就没问题。

占用空间变小,可能是老数据库经过长期的增删改查.ibd文件中产生了大量的碎片,而mysqldump导出再导入等同于重建表,数据更加紧凑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiye丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值