mysql-8.0.37-linux-glibc2.12-x86_64安装
解压文件
# tar -xvf mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz
mysql-8.0.37-linux-glibc2.12-x86_64/bin/
mysql-8.0.37-linux-glibc2.12-x86_64/bin/myisam_ftdump
mysql-8.0.37-linux-glibc2.12-x86_64/bin/myisamchk
mysql-8.0.37-linux-glibc2.12-x86_64/bin/myisamlog
mysql-8.0.37-linux-glibc2.12-x86_64/bin/myisampack
。。。。。
创建目录
mkdir data logs
初始化
创建并设置正确的目录权限
# 创建 data 目录(如果不存在)
mkdir -p /data/msyql/apps/mysql8/data# 创建 log 目录(我们自定义日志路径)
mkdir -p /data/msyql/apps/mysql8/log# 设置目录归属为 msyql用户
sudo chown -R msyql:msyql/data/msyql/apps/mysql8# 设置权限
chmod 750 /data/msyql/apps/mysql8/data
chmod 750 /data/msyql/apps/mysql8/log
指定自定义日志文件路径
不要让 MySQL 使用 /var/log/mysqld.log
,而是指定一个 msyql
用户有权限的路径。
修改你的初始化命令,加入 --log-error
参数:
./bin/mysqld \--user=msyql\--basedir=/data/msyql/apps/mysql8 \--datadir=/data/msyql/apps/mysql8/data \--log-error=/data/msyql/apps/mysql8/log/mysqld.log \--initialize
最终初始化命令
# ./bin/mysqld \
> --user=msyql\
> --basedir=/data/msyql/apps/mysql8 \
> --datadir=/data/msyql/apps/mysql8/data \
> --log-error=/data/msyql/apps/mysql8/logs/mysqld.log \
> --initialize
查看日志中的临时root密码
# tail -200f logs/mysqld.log
2025-08-20T03:28:50.381333Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2025-08-20T03:28:50.381520Z 0 [System] [MY-013169] [Server] /data/msyql/apps/mysql8/bin/mysqld (mysqld 8.0.37) initializing of server in progress as process 3464
2025-08-20T03:28:51.028676Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-08-20T03:28:53.692719Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-08-20T03:28:59.732361Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: gYhDF!7a=Vdh
修改my.cnf
[mysqld]
# 基础路径
basedir=/data/msyql/apps/mysql8
datadir=/data/msyql/apps/mysql8/data
socket=/data/msyql/apps/mysql8/mysql.sock
pid-file=/data/msyql/apps/mysql8/mysql.pid
tmpdir=/data/msyql/apps/mysql8/tmp# 日志
log_error=/data/msyql/apps/mysql8/logs/mysql-error.log
slow_query_log = 1
slow_query_log_file = /data/msyql/apps/mysql8/logs/slow.log
long_query_time = 2# 二进制日志
log_bin=/data/msyql/apps/mysql8/mysql-bin
binlog_format=row
sync_binlog = 1
expire_logs_days = 7# GTID 复制(为未来扩展准备)
gtid-mode=on
enforce-gtid-consistency=true
server_id=172# 连接
max_connections = 1500
max_connect_errors = 100000
max_user_connections = 100
wait_timeout = 300
interactive_timeout = 300
skip-name-resolve# 事务与隔离
transaction-isolation = READ-COMMITTED
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_AUTO_CREATE_USER# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci# InnoDB 核心
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:20G# 安全
default_password_lifetime = 0
bind-address = 10.10.10.10# 性能
performance_schema = ON
初始化时指定my.cnf配置文件
./bin/mysqld \--defaults-file=/data/apps/mysql8/my.cnf \--initialize \--basedir=/data/apps/mysql8 \--datadir=/data/apps/mysql8/data \--user=msyql
启动mysql
bin/mysqld_safe --defaults-file=/data/apps/mysql8/my.cnf &
查看日志
# bin/mysqld_safe --defaults-file=/data/msyql/apps/mysql8/my.cnf &
[1] 37774
[msyql@k8s-master mysql8]$ 2025-08-20T07:28:54.101377Z mysqld_safe Logging to '/data/imsyqlsee/apps/mysql8/logs/mysql-error.log'.
2025-08-20T07:28:54.154202Z mysqld_safe Starting mysqld daemon with databases from /data/apps/mysql8/data# tail -400f logs/mysql-error.log
2025-08-20T07:27:34.174584Z 0 [System] [MY-013169] [Server] /data/apps/mysql8/bin/mysqld (mysqld 8.0.37) initializing of server in progress as process 34320
2025-08-20T07:27:34.209763Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-08-20T07:27:42.484971Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-08-20T07:27:50.874439Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: .IoReKOkP9xl
2025-08-20T07:28:54.101377Z mysqld_safe Logging to '/data/apps/mysql8/logs/mysql-error.log'.
2025-08-20T07:28:54.154202Z mysqld_safe Starting mysqld daemon with databases from /data/apps/mysql8/data
2025-08-20T07:28:54.514568Z 0 [System] [MY-010116] [Server] /data/msyql/apps/mysql8/bin/mysqld (mysqld 8.0.37) starting as process 38391
2025-08-20T07:28:54.527022Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-08-20T07:28:56.114424Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-08-20T07:29:08.607250Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2025-08-20T07:29:08.607339Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2025-08-20T07:29:08.653995Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/data' in the path is accessible to all OS users. Consider choosing a different directory.
2025-08-20T07:29:08.740731Z 0 [System] [MY-010931] [Server] /data/apps/mysql8/bin/mysqld: ready for connections. Version: '8.0.37' socket: '/data/apps/mysql8/mysql.sock' port: 33306 MySQL Community Server - GPL.
2025-08-20T07:29:08.740233Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /tmp/mysqlx.sock
登陆mysql
# bin/mysql -uroot -p -S mysql.sock
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.37Copyright (c) 2000, 2024, Oracle and/or its affiliates.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.
mysql> show variables like 'character_Set_server';
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
修改密码
情形一
# ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';
ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.
No connection. Trying to reconnect...
Connection id: 11
Current database: *** NONE ***ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
你遇到的情况是一个 典型的“循环困境”:
- 你想执行
ALTER USER
来重置密码(因为提示ERROR 1820
), - 但执行时连接因超时被断开(
ERROR 4031: client disconnected due to inactivity
), - 重新连接后,又回到
ERROR 1820
,必须改密码才能操作……
这通常发生在:
- 网络延迟较高
- 客户端响应慢
wait_timeout
/interactive_timeout
设置过短- 首次登录后长时间未操作
✅ 解决方案:在登录时立即执行命令,避免超时
✅ 方法一:使用命令行直接执行(推荐)
不要先进入 MySQL 交互式终端,而是直接在 shell 中执行 ALTER USER
命令,避免手动输入延迟。
mysql -u root -p -e "ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';"
💡 解释:
-e
表示执行单条命令,立刻执行,立刻完成,不会等待超时。- 这样可以绕过交互式超时断开的问题。
输入密码后,命令执行完就退出,不会卡在交互界面。
✅ 方法二:登录后立刻执行(手速要快)
如果你坚持用交互式方式:
mysql -u root -p
✅ 登录成功后,立刻、马上、不要停顿地输入以下命令并回车:
ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';
⚠️ 不要按回车空行、不要查看帮助、不要停顿超过几秒,否则连接可能被断开。
✅ 方法三:临时延长超时时间(需先登录)
如果连接能短暂保持,可以先设置长超时:
-- 登录后立刻执行
SET SESSION wait_timeout = 3600;
SET SESSION interactive_timeout = 3600;-- 然后立即改密码
ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';
这样可以防止在操作过程中被断开。
✅ 方法四:使用本地 localhost
用户绕行(推荐备用)
如果 'root'@'10.10.10.10'
连接不稳定,可以尝试用本地 localhost
登录(通常更稳定):
mysql -u root -p
登录后,修改本地 root 用户密码(通常也需要先改它):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'F0o_tt919';
然后再修改远程用户(可选):
ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';
📌 提示:MySQL 要求至少一个 root 用户先完成密码重置,才能进行其他操作。
🔧 根本原因分析
错误 | 原因 |
---|---|
ERROR 1820 | 首次登录未改密码,必须先 ALTER USER |
ERROR 4031 | 执行命令前或执行中连接超时(wait_timeout 默认 8小时,但某些环境可能设得很短) |
✅ 最佳实践建议
- 首次登录后立即改密码,不要做其他事。
- 使用
-e
直接执行命令,避免交互式延迟。 - 确保
wait_timeout
和interactive_timeout
设置合理(如 3600 秒):SHOW VARIABLES LIKE 'wait_timeout'; SHOW VARIABLES LIKE 'interactive_timeout';
- 如果是脚本操作,建议在配置文件中设置:
[mysql] interactive-timeout = 3600 wait-timeout = 3600
✅ 总结
📌 最快解决方式:
mysql -u root -p -e "ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';"
输入密码后,命令立即执行,避免超时断开,完美解决 ERROR 1820
和 ERROR 4031
的循环问题。
✅ 执行成功后,你就可以正常登录并使用 MySQL 了。
情形二
# bin/mysql -u root -p -S mysql.sock -e "ALTER USER 'root'@'110.10.10.10' IDENTIFIED BY 'F0o_tt919';"
Enter password:
Please use --connect-expired-password option or invoke mysql in interactive mode.
✅ 正确解决方案
✅ 方法一:使用 --connect-expired-password
选项(推荐)
这是 MySQL 官方为此类场景设计的选项,专门用于 首次登录重置密码 的非交互式操作。
bin/mysql -u root -p -S mysql.sock --connect-expired-password -e "ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';"
✅ 执行流程:
- 输入当前密码(临时密码或空密码)
- 客户端进入“密码过期”模式
- 执行
ALTER USER
修改密码- 完成后退出
📌 这是 最标准、最安全、最推荐 的方式。
✅ 方法二:进入交互模式(手动操作)
如果你不想用 --connect-expired-password
,可以进入交互式终端:
bin/mysql -u root -p -S mysql.sock
登录后,立刻输入(避免超时):
ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';
然后就可以正常使用了。
✅ 方法三:先改 localhost
用户(备用)
有时远程用户('root'@'10.10.10.10'
)不是首次登录的“主用户”,可以先改本地用户:
bin/mysql -u root -p -S mysql.sock --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'F0o_tt919';"
改完 localhost
后,其他用户通常也可以正常操作了。
🔍 为什么需要 --connect-expired-password
?
MySQL 客户端为了安全,对以下情况做了限制:
- 密码过期
- 首次登录(临时密码)
ALTER USER
必须立即执行
在这种情况下,不允许在非交互模式下直接执行 ALTER USER
,防止脚本中明文密码被滥用。
使用 --connect-expired-password
表示:“我知道密码过期,我要改它”,客户端会进入特殊模式,允许你修改密码。
✅ 验证是否成功
改完密码后,尝试登录并执行命令:
bin/mysql -u root -p -S mysql.sock -e "SELECT 1;"
如果不再报 ERROR 1820
或连接超时,说明问题已解决。
✅ 总结
方法 | 命令 |
---|---|
✅ 推荐 | bin/mysql -u root -p -S mysql.sock --connect-expired-password -e "ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';" |
备用 | 先改 localhost 用户 |
手动 | 进入交互模式快速输入命令 |
📌 最终建议:使用 --connect-expired-password
选项,这是 MySQL 官方为此类问题设计的标准解决方案。
情形三
# bin/mysql -u root -p -S mysql.sock --connect-expired-password -e "ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';"
Enter password:
ERROR 1820 (HY000) at line 1: You must reset your password using ALTER USER statement before executing this statement.
先将具体ip换成localhost操作,即可正常。然后在继续修改
情形四
# bin/mysql -u root -p -S mysql.sock --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'F0o_tt919';"
Enter password:
这是正常的操作步骤
查看
# SELECT user, host FROM mysql.user WHERE user = 'root';
+------+-------------+
| user | host |
+------+-------------+
| root | % |
| root | 10.10.10.10 |
| root | localhost |
+------+-------------+
3 rows in set (0.00 sec)
完整的my.cnf单机配置
# cat my.cnf
[client]
port = 33306
socket = /data/msyql/apps/mysql8/mysql.sock
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
[mysql]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci[mysqld]
# ========================
# 基础路径设置
# ========================
basedir = /data/msyql/apps/mysql8
datadir = /data/msyql/apps/mysql8/data
socket = /data/msyql/apps/mysql8/mysql.sock
pid-file = /data/msyql/apps/mysql8/mysql.pid
tmpdir = /data/msyql/apps/mysql8/tmp# ========================
# 字符集与排序规则
# ========================
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
# ========================
# 连接相关设置
# ========================
port = 33306
bind-address = 10.10.10.10 # 允许远程访问(生产注意防火墙)
max_connections = 1500 # 最大连接数
max_connect_errors = 100000 # 防止暴力登录
max_user_connections = 1000 # 单用户最大连接
back_log = 300 # 等待队列长度
thread_cache_size = 10 # 线程缓存# ========================
# 表名大小写不敏感(重要)
# ========================
# 必须在初始化前设置!初始化后修改会导致启动失败!
lower_case_table_names = 1
# 说明:0=区分大小写,1=不区分(存储小写,比较忽略大小写)# ========================
# 事务与隔离级别
# ========================
transaction-isolation = READ-COMMITTED
# 避免幻读,适合高并发 OLTP# ========================
# 二进制日志(用于备份、主从、恢复)
# ========================
log-bin = /data/msyql/apps/mysql8/mysql-bin
server-id = 1 # 单机可设为1,为未来主从准备
sync_binlog = 1 # 保证事务不丢失(性能换安全)# ========================
# GTID(为未来主从复制准备)
# ========================
gtid-mode = ON
enforce-gtid-consistency = TRUE# ========================
# 日志设置
# ========================
# 错误日志
log-error = /data/msyql/apps/mysql8/logs/mysql-error.log# 慢查询日志(性能调优必备)
slow_query_log = 1
slow_query_log_file = /data/msyql/apps/mysql8/logs/slow.log
long_query_time = 2
log_queries_not_using_indexes = 0 # 可选:记录未走索引的SQL# ========================
# InnoDB 核心性能优化
# ========================
# 缓冲池:建议设为物理内存的 50%~70%
# 例如:16G 内存 → 设为 10G~12G
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4 # 拆分实例,减少锁争用# 日志文件大小(越大越好,减少刷新频率)
innodb_redo_log_capacity=4294967296
innodb_flush_log_at_trx_commit = 1 # 1=最安全(每次提交刷盘)
# 如性能优先可设为 2(文件缓存,不刷盘)# IO 优化
innodb_flush_method = O_DIRECT # 避免双缓冲,提升IO效率
innodb_io_capacity = 2000 # SSD 推荐 2000~4000
innodb_io_capacity_max = 4000# 表空间
innodb_file_per_table = ON # 每个表独立表空间(推荐)
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:20G# 清理策略
innodb_purge_threads = 4 # 清理线程数
innodb_adaptive_hash_index = ON # 自适应哈希索引(默认ON)# ========================
# 安全与性能模式
# ========================
skip-name-resolve # 禁用DNS解析,提升性能
performance_schema = ON # 启用性能监控
default_password_lifetime = 0 # 禁用密码过期# ========================
# 其他
# ========================
explicit_defaults_for_timestamp = ON
group_concat_max_len = 10240
wait_timeout = 3600
interactive_timeout = 3600
#sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION