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.37

Copyright (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小时,但某些环境可能设得很短)

✅ 最佳实践建议
  1. 首次登录后立即改密码,不要做其他事。
  2. 使用 -e 直接执行命令,避免交互式延迟。
  3. 确保 wait_timeout 和 interactive_timeout 设置合理(如 3600 秒):
    SHOW VARIABLES LIKE 'wait_timeout';
    SHOW VARIABLES LIKE 'interactive_timeout';
  4. 如果是脚本操作,建议在配置文件中设置:
    [mysql]
    interactive-timeout = 3600
    wait-timeout = 3600

✅ 总结

📌 最快解决方式

mysql -u root -p -e "ALTER USER 'root'@'10.10.10.10' IDENTIFIED BY 'F0o_tt919';"

输入密码后,命令立即执行,避免超时断开,完美解决 ERROR 1820ERROR 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';"

✅ 执行流程:

  1. 输入当前密码(临时密码或空密码)
  2. 客户端进入“密码过期”模式
  3. 执行 ALTER USER 修改密码
  4. 完成后退出

📌 这是 最标准、最安全、最推荐 的方式。


✅ 方法二:进入交互模式(手动操作)

如果你不想用 --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

这是“普通文本型”问题。 从你的输入可以看出: ```bash ls /root/mysql-5.7.43-linux-glibc2.12-x86_64 ``` 返回: ``` 无法访问/root/mysql-5.7.43-linux-glibc2.12-x86_64: 没有那个文件或目录 ``` 而你当前所在的 shell 提示符仍为: ``` [root@master mysql-5.7.43-linux-glibc2.12-x86_64]# ``` 这说明:**你已经删除或移动了该目录,但 shell 仍然停留在一个已不存在的路径中**。 --- ### ✅ 当前状态总结 - ❌ 目录 `/root/mysql-5.7.43-linux-glibc2.12-x86_64` 已不存在。 - ❌ 所有基于此目录的操作(如启动 MySQL、创建软链接)都将失败。 - ❌ 之前创建的软链接 `/usr/local/mysql` 指向了一个“空地址”,属于“断裂链接”。 --- ### ✅ 解决方案 #### 步骤 1:确认原始压缩包是否存在 运行: ```bash ls /root | grep mysql ``` 查看是否有: ``` mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz ``` ##### ✅ 如果存在 → 重新解压 ```bash cd /root tar -zxvf mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz ``` ##### ❌ 如果不存在 → 需重新上传 从官网或其他方式获取安装包: ```bash wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz ``` 然后解压: ```bash tar -zxvf mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz ``` --- #### 步骤 2:将解压后的目录移到标准位置(推荐) ```bash mv /root/mysql-5.7.43-linux-glibc2.12-x86_64 /usr/local/mysql ``` > 这样可避免使用软链接出错,路径更稳定。 --- #### 步骤 3:配置环境变量 PATH 编辑全局变量: ```bash echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile source /etc/profile ``` 验证命令是否可用: ```bash which my_print_defaults ``` 应输出: ``` /usr/local/mysql/bin/my_print_defaults ``` --- #### 步骤 4:初始化数据目录 ```bash mkdir -p /usr/local/mysql/data /usr/local/mysql/bin/mysqld --initialize \ --user=root \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data ``` 📌 记录打印出的临时密码(类似 `A temporary password is generated for root@localhost: xxxxxx`) --- #### 步骤 5:启动 MySQL 服务 ```bash /usr/local/mysql/support-files/mysql.server start ``` 或复制到系统服务: ```bash cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld service mysqld start ``` --- ### ✅ 后续建议 | 操作 | 建议 | |------|------| | 安装路径 | 使用 `/usr/local/mysql` 固定路径,不要依赖软链接 | | 备份 | 解压后保留 `.tar.gz` 包以防误删 | | 用户 | 推荐用专用用户 `mysql` 而非 `root` 运行 MySQL | --- 完成以上步骤后,MySQL 将能正常启动。你现在需要做的第一步是:**确保 MySQL 安装包存在并重新解压到正确位置**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值