【Mysql】记一次Mysql离线安装
一、前言
记录一次在客户现场,Mysql离线安装全过程,服务器不通外网故选择离线安装。
- 第一步:离线安装Mysql
- 第二步:数据迁移
二、离线安装
2.1 下载
官方下载地址:https://downloads.mysql.com/archives/community/
选择版本: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 导出导入
前提:
- mysqldump为快照,所以导出前一定要停掉应用服务
- 建议在数据量小于50G时使用,数据量越大应用停机时间越久
- 目标数据库版本 >= 源数据库版本
- 字符集要一致
# 导出指定库
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启动失败
可能有以下几种可能:
- 写入权限:需要给系统用户mysql,授权mysql数据、日志等目录操作权限
- 配置有误:检查配置文件,可能有些配置项名称写错了,各版本有差异
4.2 迁移前后.ibd文件变小了
这个其实是正常的,只要数据条数一致就没问题。
占用空间变小,可能是老数据库经过长期的增删改查.ibd文件中产生了大量的碎片,而mysqldump导出再导入等同于重建表,数据更加紧凑。

1119

被折叠的 条评论
为什么被折叠?



