MySQL学习笔记(8.0)

​ 一切只因花几十块买了一年的云服务器。刚好目前需要用 用 JDBC ,于是就把数据库部署到了服务器上面。然而这其中却遇到了难以想象的困难(后来才发现没有必要这么弄,且一般也不这么弄,安全性大打折扣)。

1.部署环境以及初始化配置

  • Ubuntu

1.下载安装,配置密码

以root用户登录之后:

1
2
3
apt update
apt upgrade #不解释
apt install mysql-server -y #下载

此时你可以直接进入mysql

1
2
3
4
5
6
7
8
9
10
11
12
mysql

mysql> use mysql;
mysql> apt install mysql-server -y #(将密码置为空)
mysql> quit;
# 然后重启mysql,再次进入
systemstl restart mysql
mysql

mysql> use mysql;
mysql> ALTER USER 'root'@'localhost' (如果不用远程链接则为'localhost')IDENTIFIED WITH mysql_native_password BY '新密码';
mysql> quit #修改完成
  • 开启远程链接功能
1
2
3
mysql
mysql> use mysql;
mysql> apt install mysql-server -y #修改访问权限,默认只能本地访问。
  • 修改MySQL配置文件
1
2
3
4
5
6
7
8
vim /etc/mysql/mysql.conf.d/mysqld.cnf
将[mysqld]下面的 bind-address ***以及mysqlx-bind-address ****注释
同时取消注释
port
user
socket
server-id
重启测试即可

2. 开始正式学习mysql

1. 修改数据库root密码

通过各类手段确定数据库信息:

1
mysql --version

如果没直接显示则可能docker容器中运行的。

  1. 停止数据库服务
1
2
3
sudo systemctl stop mysql
# 或
sudo systemctl stop mariadb
  1. “跳过授权表”方式启动(安全模式
1
mysqld_safe --skip-grant-tables &
  1. root 用户无密码登录
1
mysql -u root
  1. 修改 root 密码
  • MySQL 5.7+ / 8.0 / MariaDB 新版本
1
2
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
  • 旧版本
1
2
3
FLUSH PRIVILEGES;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码');

  1. 退出并重启数据库
1
2
3
4
5
6
7
8
9
exit

sudo systemctl stop mysql
# 或
sudo systemctl stop mariadb

sudo systemctl start mysql
# 或
sudo systemctl start mariadb
  1. 用新密码验证
1
mysql -u root -p

2. 数据迁移

数据的导入导出:

1
2
3
mysqldump -uroot -p --all-databases > /tmp/all_databases_backup.sql

mysql -u root -p < /tmp/all_databases_backup.sql

4. 配置文件分析

有时候会遇到一些奇怪的需求例如修改大小写敏感等。这类参数是初始化级别的,只能通过重新起容器或者重装实现。

除了 lower_case_table_names,常见的系统级参数有:


1. 字符集和排序规则(部分情况)

  • character_set_server
  • collation_server

如果是 MySQL 初始化数据目录时设置的,之后只能通过重新初始化才能完全替换已有数据的默认字符集。
(已存在的数据库、表、列不会自动改变字符集。)


2. 数据目录位置

  • datadir
    数据目录路径是初始化时就绑定的,如果换路径,需要复制数据并修改权限,或者重新 mysqld --initialize 初始化。

3. 事务日志大小

  • innodb_log_file_size
    更改这个值需要先关闭 MySQL,删除旧的 InnoDB 日志文件(ib_logfile0ib_logfile1),再重启让 MySQL 重新生成。

4. 系统表空间大小

  • innodb_system_tablespace(旧版用 ibdata1
    这个大小一旦初始化生成就不能缩小,只能重建实例或导出导入数据。

5. GTID 模式

  • gtid_mode(从关闭到开启)
    在部分情况下从 OFF → ON 需要清理或重建数据才能确保 GTID 一致性。

6. binlog 格式启用状态

  • log_bin(是否启用二进制日志)
    关闭 → 开启需要 MySQL 重启;某些场景下修改会影响数据同步,需要新建数据目录才能确保一致。

3. 日志分析

​ MySQL 自带的日志类型主要是这些


1. MySQL 日志分类

日志类型 作用 默认状态 典型文件位置
错误日志 (log_error) 记录 MySQL 启动、关闭、运行错误等 开启 /var/lib/mysql/hostname.err
通用查询日志 (general_log) 记录所有客户端的连接和执行的 SQL 语句(类似“访问日志”) 关闭 /var/log/mysql/general.log
慢查询日志 (slow_query_log) 记录执行时间超过阈值的 SQL 关闭 /var/log/mysql/slow.log
二进制日志 (log_bin) 记录所有数据变更(用于主从同步和恢复) 关闭 /var/lib/mysql/mysql-bin.000001
中继日志 (relay_log) 用于从库复制 关闭 /var/lib/mysql/relay-log.000001
审计日志(需插件) 记录详细的安全访问情况 关闭 自定义

2. 你说的“访问日志”

在 MySQL 里,一般用 通用查询日志 (general_log) 来当“访问日志”,它会记录:

  • 连接/断开时间
  • 用户名
  • 客户端 IP
  • 每条执行的 SQL

但是性能开销很大,不建议长期开启。


3. 如何开启“访问日志”

在你挂载的配置目录 /data/soft/mysql8-20280812/mysql-conf 里新建:

1
2
3
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/general.log

重启 MySQL:

1
docker restart mysql8-2

然后挂载的 /data/soft/mysql8-20280812/log/mysql-logs/general.log 就能看到访问记录了,例如:

1
2
3
2025-08-12T06:45:01.234567Z     10 Connect	root@192.168.1.5 on test
2025-08-12T06:45:01.234567Z 10 Query SELECT * FROM users;
2025-08-12T06:45:02.234567Z 10 Quit