MySQL保姆级教程(基础篇)从小白到高手的进阶指南
本教程精心编撰,旨在为初学者提供一条从零开始的MySQL学习路径。系统地掌握MySQL的核心知识,包括但不限于数据库的无缝安装、底层架构揭秘、存储引擎解析、高效索引构建、锁机制探秘、两阶段提交详解,以及高可用架构的设计与实现。无论你是数据库领域的新人,还是希望深化MySQL技能的从业者,这都是一份不可多得的学习资料,助你全方位、多层次地掌握MySQL的精髓。
MySQL 简介与发展
2009年:Oracle 以 79 亿美金收购了 Sun 公司
2010年:MySQL 5.5 发布,其包括以下特性
1:InnoDB 代替了 MyISAM 成为 MySQL 默认的存储引擎
2:多核扩展,能充分得使用多核 CPU
3:InnoDB 的性能提升,包括支持索引的快速创建,表压缩,I/O子系统的性能提升,PURGE 操作主从线程中剥离出来,Buffer Pool 可拆分为多个 Instances
4:半同步复制
5:引入了 utf8mb4 字符集,可用于存储 emoji 表情
6:引入 metadata locks(元数据锁)
7:分区表的增强,新增两个分区类型:RANGE COLUMNS 和 LIST COLUMNS
8:MySQL 企业版引入线程池
9:可配置 IO 读写线程的数量(innodb_read_io_threads,innodb_write_io_threads),在此之前,其数量为 1,且不可配置
10:引入 innodb_io_capacity 选项,用于控制脏页刷新的数量
2013年:MySQL 5.6 发布,其包括如下重要的特性及更新
1:GTID 复制
2:无损复制
3:延迟复制
4:用于库级别的并行复制
5:mysqlbinlog 可远程备份 binlog
6:对于 TIME,DATETIME 和 TIMESTAMP 进行了重构,可支持小数秒,DATETIME 的空间需求也从之前的 8 个字节减少到了 5 个字节
7:Online DDL,ALTER 操作不再阻塞 DML
8:可传输表空间(transportable tablespaces)
9:统计信息的持久化,避免主从之间或数据库重启后,同一个 SQL 的执行计划有差异
10:全文索引
11:InnoDB Memcached plugin
12:EXPLAIN 可采用查看 DELETE,INSERT,REPLACE,UPDATE 等 DML 操作的执行计划,在此之前,只支持 SELECT 操作
13:分区表的增强,包括最大可用分区数量增加至 8192,支持分区和非分区之间的数据交换,操作时显示指定分区
14:Redo Log 总大小的限制从之前的 4G 扩展至 512G
15:Undo Log 可保存在独立表空间中,因其是随机 IO,更适合放到 SSD 中,但仍然不支持空间的自动回收
16:可 dump 和 load Buffer pool 的状态,避免数据库重启后需要较长时间的预热
17:InnoDB 内部的性能提升,包括拆分 kennel mutex,引入独立的刷新线程,可设置多个 purge 线程
18:优化器性能提升,引入了 ICP,MRR,BKA等特性,针对子查询进行了优化
MySQL 5.6 算是 MySQL 历史上的的一个的一个里成本
2015年:MySQL 5.7 发布,其包括如下重要特性及更新
1:组复制
2:InnoDB Cluster
3:多源复制
4:增强半同步复制(AFTER_SYNC)
5:基于 WRITESET 的并行复制
6:在线开启 GTID 复制
7:在线设置复制过滤规则
8:在线修改 Buffer pool 大小
9:在同一长度编码字节内,修改 VARCHAR 的大小只需要修改表的元数据,无需创建临时表
10:可设置 NUMA 架构的内存分配策略(innodb_numa_interleave)
11:透明页压缩(Transparent Page Compression)
12:UNDO 表空间的自动回收
13:查询优化器的重构和增强
14:可查看当前正在执行的 SQL 的执行计划(EXPLAIN FOR CONNECTION)
15:引入了查询改写插件(Query Rewrite Plugin),可在服务端对查询进行改写
16:EXPLAIN FORMAT=JSON 会显示成本信息,这样可直观的比较两种执行计划的优劣
17:引入虚拟列,类似于 Oracle 种的函数索引
18:新实例不再默认创建 test 数据库及匿名用户
19:引入 ALTER USER 命令,可用来修改用户密码,密码的过期策略,以及锁定用户等
20:mysql.user 表中存储密码的字段从 password 修改为 authentication_string
21:表空间加密
22:优化了 Performance Schema,其内存使用减少
23:Performance Schema 引入了众多 instrumentation,常用的有 Memory usage instrumentation,可用来查看 MySQL 的内存使用情况,Metadata Locking Instrumentation,可用来查看 MDL 的持有情况,Stage Progress Instrumentation,可用来查看 Online DDL 的进度
24:同一触发事件(INSERT,DELETE,UPDATE),同一触发时间(BEFORE,AFTER),允许创建多个触发器,在此之前,只允许创建一个触发器
25:InnoDB 原生支持分区表,在此之前,是通过 ha_partition 接口来实现的
26:分区表支持可传输表空间特性
27:集成了 SYS 数据库,简化了 MySQL 的管理及异常问题的定位
28:原生支持 JSON 类型,并引入了众多 JSON 函数
29:引入了新的逻辑备份工具 mysqlpump,支持表级别的多线程备份
30:引入了新的客户端工具 mysqlsh,其支持三种语言,js,python,SQL,两种 API,X DevAPI,Admin API,其中,前者可以将 MySQL 作为文档型数据库进行操作,后者用于管理 InnoDB Cluster
31:mysql_install_db 被 mysqld --initialize 代替,用来进行实例的初始化
32:原生支持 systemd
33:引入 super_read_only 选项
34:可设置 SELECT 操作的超时时长(max_execution_time)
35:可通过 SHUTDOWN 命令关闭 MySQL 实例
36:引入了 innodb_deadlock_delect 选项,在高并发的场景下,可使用该选项来关闭死锁检测
37:引入了 Optimize Hints,可在语句级别控制优化器的行为,如是开启 ICP,MRR 等,在此之前,只有 index Hints
38:GIS 的增强,包括使用 Boost.Geometry 替代之前的 GIS 算法,InnoDB 开始支持空间索引
2018年:MySQL 8.0 发布,其包括如下重要特性及更新
1:引入了原生的,基于 InnoDB 的数据字典,数据字典表位于 MySQL 库中,对用户不可见,同 MySQL 库的其他系统表一样,保存在数据目录的 mysql.ibd 文件中,不再置于 mysql 目录下
2:Atomic DDL
3:重构了 INFORMATION_SCHEMA,其中,部份表以重构为基于数据字典的视图,在此之前,其为临时表
4:PERFORMANCH_SCHEMA 查询性能提升,其已内置多个索引
5:不可见索引(invisible index)
6:降序索引
7:直方图
8:公用表表达式(Common table expressions)
9:窗口函数(Window functions)
10:角色(Role)
11:资源组(Resource Groups),可用来控制线程的优先级及其能使用的资源,目前,能被管理的资源只有 CPU
12:引入 innodb_dedicated_server 选项,可基于服务器的内存来动态设置 innodb_buffer_pool_size,innodb_log_file_size 和 innodb_flush_method
13:快速排列(ALGORITHM=INSTANT)
14:JSON 字段的部分更新(JSON Partial Update)
15:自增主键的持久化
16:可持久化全局变量(SET PERSIST)
17:默认字符集由 latin1 修改为 utf8mb4
18:默认开启 UNDO 表空间,且支持在线调整数量(innodb_undo_tablespaces),在 MySQL 5.7 中,默认不开启,若要开启,只能初始化时设置
19:备份锁
20:Redo Log 的优化,包括允许多个用户线程并发写入 log buffer,可动态修改 innodb_log_buffer_size 的大小
21:默认的认证插件由 mysql_native_password 修改为 caching_sha2_password
22:默认的内存临时表由 MEMORY 引擎更改为 TempTable 引擎,相对于前者,后者支持以变长方式存储 VACHAR,VARBINARY 等变长字段,从 MySQL 8.0.13 开始 TempTable 引擎支持 BLOB 字段
23:Grant 不再隐式创建用户
24:SELECT ... FOR SHARE 和 SELECT ... FOR UPDATE 语句中引入 NOWAIT 和 SKIP LOCKED 选项,解决电商场景热点行问题,
25:正则表达式的增强,新增了 4 个相关函数, REGEXP_INSTR(),REGEXP_LIKE(),REGEXP_REPLACE(),REGEXP_SUBSTR()
26:查询优化器在定制执行计划时,会考虑数据是否在 Buffer Pool 中,而在此之前,是假设数据都在磁盘中
27:ha_patition 接口从代码层移除,如果是使用分区表,只能使用 InnoDB 存储引擎
28:引入更多细粒度的权限来替代 SUPER 权限,现在授予 SUPER 权限会提示 warning
29:GROUP BY 语句不再隐式排序
30:MySQL 5.7 引入的表空间加密特性可对 Redo Log 和 Undo Log 进行加密
31:information_schema 中的 innodb_locks 和 innodb_lock_waits 表被移除,取而代之的是 performance_schema 中的 data_locks 和 data_locks_waits 表
32:引入 performance_schema.variables_info 表,记录了参数的来源及修改情况
33:增加了对于客户端报错信息的统计(performance_schema.events_errors_summary_xxxx)
34:可统计查询的响应时间分布(call sys.ps_statement_avg_latency_histotram())
35:支持直接修改列名(ALTER TABLE ... RENAME COLUMN old_name TO new_name)
36:用户密码可设置重试策略(Reuse Policy)
37:移除 PASSWORD() 函数,这就意味着无法通过 SET PASSWORD ... = PASSWORD('auth_string') 命令来修改用户密码
38:代码层移除 Query Cache 模块,故 Query Cache 相关的变量和操作均不再支持
39:BLOB,TEXT,GEOMETRY 和 JSON 字段允许设置默认值
下图出自:https://en.wikipedia.org/wiki/MySQL#Release_history
2:MySQL 的优势于应用场景
MySQL 优势
MySQL 作为一个开源的关系型数据库系统,在数据存储和管理上具有以下的优势:
- 高性能:MySQL 在大规模数据,高并发访问和复杂查询等场景下表现出色,具有高效的存储管理,索引设计和缓存机制,能够快速提供高负载下的稳定性和性能
- 可扩展性:MySQL 支持不同级别的扩展,包括垂直扩展,水平扩展,负载均衡等方式,使其能够应对不断增长的业务需求
- 安全性:MySQL 提供完整的安全功能,包括用户的权限管理,数据加密,审计和监控等,可帮助用户保护数据的机密性和完整性
- 易用性:MySQL 易于安装,配置和维护,并提供丰富的 API,工具和框架支持,使得开发人员能高效的进行数据库开发和测试
MySQL 适用场景
- Web应用:MySQL 在支持高并发,大数据和快速迭代的Web应用开发上表现优异,是许多Web应用的首选数据库
- 企业应用:MySQL 作为一个成熟稳定的关系型数据库系统,广泛应用于企业的数据存储,管理和分析,例如:金融,物流,医疗等行业
- 移动应用:MySQL 在支持移动应用的数据存储和同步上具有优势,可以作为移动应用服务器端和本地存储的首选数据库
- 大数据应用:MySQL 集合 Hadoop,Spark 等开源大数据框架,可以解决大数据处理中的部分数据存储和管理需求,例如数据采集,ETL,BI 等
3:MySQL PG Oracle,分布式数据库对比
- MySQL:1:多线程,高并发,容易扩展,社区项目比较多,逻辑复制,易于数据流转 2:优化器能力相对较多
- PG:1:多进程,并行处理,计算能力强 2:高并发支持弱,vacuum问题,事务id
- Oracle:1:商业数据库
- 分布式数据亏:1:解决扩展问题,结构复杂
4:MySQL 的安装与配置
MySQL 的安装方式其实是比较多的,我们基于虚拟机的方式都有三种
- 4.1:apt/yum 等安装方法
- 4.2:源码编译(主要是 gcc 编译源码,然后就是二进制安装)
- 4.3:二进制安装(生产普遍使用这种方法)
# 下载地址:https://dev.mysql.com/downloads/mysql/
# 这个地址可以选择自己的系统与版本去下载相应的包
1:apt 安装
root@ubuntu:~# apt-get update
root@ubuntu:~# apt-get install -y mysql-server
# 在 Ubuntu 安装 MySQL 8.0 会自动启动的
# 确认 MySQL 的状态
root@ubuntu:~# systemctl is-active mysql.service
active
# 设置开机自启
root@ubuntu:~# systemctl enable mysql
Synchronizing state of mysql.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable mysql
# 我们甚至还可以查看到它的进程打开了哪儿些文件
root@ubuntu:~# ps -ef | grep mysql
mysql 46762 1 0 14:11 ? 00:00:45 /usr/sbin/mysqld
root 47560 1554 0 16:42 pts/0 00:00:00 grep --color=auto mysql
root@ubuntu:~# lsof -p 46762
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 46762 mysql cwd DIR 253,0 4096 277574 /var/lib/mysql
mysqld 46762 mysql rtd DIR 253,0 4096 2 /
mysqld 46762 mysql txt REG 253,0 55307896 11624 /usr/sbin/mysqld
mysqld 46762 mysql DEL REG 0,19 325919 /[aio]
mysqld 46762 mysql DEL REG 0,19 325918 /[aio]
mysqld 46762 mysql DEL REG 0,19 325917 /[aio]
mysqld 46762 mysql DEL REG 0,19 325916 /[aio]
mysqld 46762 mysql DEL REG 0,19 325915 /[aio]
mysqld 46762 mysql DEL REG 0,19 325914 /[aio]
mysqld 46762 mysql DEL REG 0,19 325913 /[aio]
mysqld 46762 mysql DEL REG 0,19 325912 /[aio]
mysqld 46762 mysql DEL REG 0,19 325911 /[aio]
mysqld 46762 mysql DEL REG 0,19 325910 /[aio]
mysqld 46762 mysql mem REG 253,0 35360 277448 /usr/lib/mysql/plugin/component_reference_cache.so
mysqld 46762 mysql mem REG 253,0 29476472 11197 /usr/lib/x86_64-linux-gnu/libicudata.so.70.1
mysqld 46762 mysql mem REG 253,0 2220400 1219 /usr/lib/x86_64-linux-gnu/libc.so.6
mysqld 46762 mysql mem REG 253,0 125488 11169 /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
mysqld 46762 mysql mem REG 253,0 940560 1222 /usr/lib/x86_64-linux-gnu/libm.so.6
mysqld 46762 mysql mem REG 253,0 2260296 11327 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
mysqld 46762 mysql mem REG 253,0 48152 11271 /usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0
mysqld 46762 mysql mem REG 253,0 14456 11090 /usr/lib/x86_64-linux-gnu/libaio.so.1.0.1
mysqld 46762 mysql mem REG 253,0 125152 11227 /usr/lib/x86_64-linux-gnu/liblz4.so.1.9.3
mysqld 46762 mysql mem REG 253,0 715848 11603 /usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.23.0.4
mysqld 46762 mysql mem REG 253,0 841808 11378 /usr/lib/x86_64-linux-gnu/libzstd.so.1.4.8
mysqld 46762 mysql mem REG 253,0 4451632 1243 /usr/lib/x86_64-linux-gnu/libcrypto.so.3
mysqld 46762 mysql mem REG 253,0 667864 1244 /usr/lib/x86_64-linux-gnu/libssl.so.3
mysqld 46762 mysql mem REG 253,0 14256 11591 /usr/lib/x86_64-linux-gnu/libevent_pthreads-2.1.so.7.0.1
mysqld 46762 mysql mem REG 253,0 211136 11151 /usr/lib/x86_64-linux-gnu/libevent_core-2.1.so.7.0.1
mysqld 46762 mysql mem REG 253,0 3328472 11198 /usr/lib/x86_64-linux-gnu/libicui18n.so.70.1
mysqld 46762 mysql mem REG 253,0 2062664 11202 /usr/lib/x86_64-linux-gnu/libicuuc.so.70.1
mysqld 46762 mysql mem REG 253,0 14640 277440 /usr/lib/mysql/plugin/auth_socket.so
mysqld 46762 mysql mem REG 253,0 240936 41 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
mysqld 46762 mysql 0r CHR 1,3 0t0 5 /dev/null
mysqld 46762 mysql 1w REG 253,0 4292 277555 /var/log/mysql/error.log
mysqld 46762 mysql 2w REG 253,0 4292 277555 /var/log/mysql/error.log
mysqld 46762 mysql 3u unix 0xffff9621c1077b80 0t0 326841 type=DGRAM
mysqld 46762 mysql 4u REG 253,0 48 277941 /var/lib/mysql/binlog.index
mysqld 46762 mysql 5uW REG 253,0 196608 277559 /var/lib/mysql/#ib_16384_0.dblwr
mysqld 46762 mysql 6u REG 253,0 0 11803 /tmp/#11803 (deleted)
mysqld 46762 mysql 7u REG 253,0 0 11804 /tmp/#11804 (deleted)
mysqld 46762 mysql 8u REG 253,0 0 11806 /tmp/#11806 (deleted)
mysqld 46762 mysql 9uW REG 253,0 8585216 277560 /var/lib/mysql/#ib_16384_1.dblwr
mysqld 46762 mysql 10uW REG 253,0 12582912 277558 /var/lib/mysql/ibdata1
mysqld 46762 mysql 11u REG 253,0 3276800 277914 /var/lib/mysql/#innodb_redo/#ib_redo6
mysqld 46762 mysql 12uW REG 253,0 16777216 277567 /var/lib/mysql/undo_001
mysqld 46762 mysql 13u REG 253,0 0 11807 /tmp/#11807 (deleted)
mysqld 46762 mysql 14uW REG 253,0 16777216 277919 /var/lib/mysql/undo_002
mysqld 46762 mysql 15uW REG 253,0 12582912 277564 /var/lib/mysql/ibtmp1
mysqld 46762 mysql 16uW REG 253,0 27262976 277563 /var/lib/mysql/mysql.ibd
mysqld 46762 mysql 17u a_inode 0,14 0 13577 [eventpoll]
mysqld 46762 mysql 18r FIFO 0,13 0t0 326846 pipe
mysqld 46762 mysql 19w FIFO 0,13 0t0 326846 pipe
mysqld 46762 mysql 20u a_inode 0,14 0 13577 [eventfd]
mysqld 46762 mysql 21u IPv4 326847 0t0 TCP localhost:33060 (LISTEN)
mysqld 46762 mysql 22u unix 0xffff9621c7cd7300 0t0 326848 /var/run/mysqld/mysqlx.sock type=STREAM
mysqld 46762 mysql 23u IPv4 326849 0t0 TCP localhost:mysql (LISTEN)
mysqld 46762 mysql 24w REG 253,0 157 277940 /var/lib/mysql/binlog.000003
mysqld 46762 mysql 25u unix 0xffff9621c7cd5540 0t0 326850 /var/run/mysqld/mysqld.sock type=STREAM
mysqld 46762 mysql 26uW REG 253,0 81920 277912 /var/lib/mysql/#innodb_temp/temp_1.ibt
mysqld 46762 mysql 27uW REG 253,0 81920 277913 /var/lib/mysql/#innodb_temp/temp_2.ibt
mysqld 46762 mysql 28uW REG 253,0 81920 277915 /var/lib/mysql/#innodb_temp/temp_3.ibt
mysqld 46762 mysql 29uW REG 253,0 81920 277916 /var/lib/mysql/#innodb_temp/temp_4.ibt
mysqld 46762 mysql 30uW REG 253,0 81920 277918 /var/lib/mysql/#innodb_temp/temp_5.ibt
mysqld 46762 mysql 31uW REG 253,0 81920 277920 /var/lib/mysql/#innodb_temp/temp_6.ibt
mysqld 46762 mysql 32uW REG 253,0 81920 277921 /var/lib/mysql/#innodb_temp/temp_7.ibt
mysqld 46762 mysql 33uW REG 253,0 81920 277922 /var/lib/mysql/#innodb_temp/temp_8.ibt
mysqld 46762 mysql 34uW REG 253,0 81920 277923 /var/lib/mysql/#innodb_temp/temp_9.ibt
mysqld 46762 mysql 35uW REG 253,0 81920 277924 /var/lib/mysql/#innodb_temp/temp_10.ibt
# 这个在 Ubuntu 上登录 MySQL 是没有密码的,我们可以直接使用 MySQL 的 CLI 去登录
root@ubuntu:~# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.35-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2023, 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> ALTER USER 'root'@'localhost' IDENTIFIED with mysql_native_password BY 'MTIzNDU2Cg==';
Query OK, 0 rows affected (0.01 sec)
# 这里的密码是我使用 base64 编码的 123456,然后我们退出重新登录
root@ubuntu:~# password=$(echo "123456" | base64)
root@ubuntu:~# mysql -uroot -p$password
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.35-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2023, 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 databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
# 然后我们需要去熟悉一下这样部署的默认的数据在哪儿
root@ubuntu:~# ls -l /var/lib/mysql
total 92628
-rw-r----- 1 mysql mysql 56 Jan 19 14:11 auto.cnf # 它存储的是一个 server-id,默认自动生成,动态调整也会保存在这里
-rw-r----- 1 mysql mysql 180 Jan 19 14:11 binlog.000001
-rw-r----- 1 mysql mysql 404 Jan 19 14:11 binlog.000002
-rw-r----- 1 mysql mysql 447 Jan 19 16:55 binlog.000003
-rw-r----- 1 mysql mysql 48 Jan 19 14:11 binlog.index
-rw------- 1 mysql mysql 1705 Jan 19 14:11 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Jan 19 14:11 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Jan 19 14:11 client-cert.pem
-rw------- 1 mysql mysql 1705 Jan 19 14:11 client-key.pem
-rw-r--r-- 1 root root 0 Jan 19 14:11 debian-5.7.flag
-rw-r----- 1 mysql mysql 196608 Jan 19 16:57 '#ib_16384_0.dblwr'
-rw-r----- 1 mysql mysql 8585216 Jan 19 14:11 '#ib_16384_1.dblwr'
-rw-r----- 1 mysql mysql 3454 Jan 19 14:11 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Jan 19 16:55 ibdata1
-rw-r----- 1 mysql mysql 12582912 Jan 19 14:11 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Jan 19 14:11 '#innodb_redo'
drwxr-x--- 2 mysql mysql 4096 Jan 19 14:11 '#innodb_temp'
drwxr-x--- 2 mysql mysql 4096 Jan 19 14:11 mysql
-rw-r----- 1 mysql mysql 27262976 Jan 19 16:55 mysql.ibd # 这就是前面说的元数据文件
drwxr-x--- 2 mysql mysql 4096 Jan 19 14:11 performance_schema
-rw------- 1 mysql mysql 1705 Jan 19 14:11 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Jan 19 14:11 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Jan 19 14:11 server-cert.pem
-rw------- 1 mysql mysql 1709 Jan 19 14:11 server-key.pem
drwxr-x--- 2 mysql mysql 4096 Jan 19 14:11 sys
-rw-r----- 1 mysql mysql 6 Jan 19 14:11 ubuntu.pid
-rw-r----- 1 mysql mysql 16777216 Jan 19 16:57 undo_001
-rw-r----- 1 mysql mysql 16777216 Jan 19 14:13 undo_002
# 我们可以用自带的 ibd2sdi 的工具来转换这个元数据,然后看看元数据都有什么(它其实是一个非常长的 json 串)
root@ubuntu:~# ibd2sdi /var/lib/mysql/mysql.ibd > sql.log
# 我们主要还是需要熟悉一下 MySQL 的默认的数据库 sys 中的表,还是很多的
mysql> use sys;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------------------------------------+
| Tables_in_sys |
+-----------------------------------------------+
| host_summary |
| host_summary_by_file_io |
| host_summary_by_file_io_type |
| host_summary_by_stages |
| host_summary_by_statement_latency |
| host_summary_by_statement_type |
| innodb_buffer_stats_by_schema |
| innodb_buffer_stats_by_table |
| innodb_lock_waits | # 查询死锁用的表:select * from innodb_lock_waits;
| io_by_thread_by_latency |
| io_global_by_file_by_bytes |
| io_global_by_file_by_latency |
| io_global_by_wait_by_bytes |
| io_global_by_wait_by_latency |
| latest_file_io |
| memory_by_host_by_current_bytes |
| memory_by_thread_by_current_bytes |
| memory_by_user_by_current_bytes |
| memory_global_by_current_bytes |
| memory_global_total |
| metrics |
| processlist |
| ps_check_lost_instrumentation |
| schema_auto_increment_columns |
| schema_index_statistics |
| schema_object_overview |
| schema_redundant_indexes |
| schema_table_lock_waits |
| schema_table_statistics |
| schema_table_statistics_with_buffer |
| schema_tables_with_full_table_scans |
| schema_unused_indexes |
| session |
| session_ssl_status |
| statement_analysis |
| statements_with_errors_or_warnings |
| statements_with_full_table_scans |
| statements_with_runtimes_in_95th_percentile |
| statements_with_sorting |
| statements_with_temp_tables |
| sys_config |
| user_summary |
| user_summary_by_file_io |
| user_summary_by_file_io_type |
| user_summary_by_stages |
| user_summary_by_statement_latency |
| user_summary_by_statement_type |
| version |
| wait_classes_global_by_avg_latency |
| wait_classes_global_by_latency |
| waits_by_host_by_latency |
| waits_by_user_by_latency |
| waits_global_by_latency |
| x$host_summary |
| x$host_summary_by_file_io |
| x$host_summary_by_file_io_type |
| x$host_summary_by_stages |
| x$host_summary_by_statement_latency |
| x$host_summary_by_statement_type |
| x$innodb_buffer_stats_by_schema |
| x$innodb_buffer_stats_by_table |
| x$innodb_lock_waits |
| x$io_by_thread_by_latency |
| x$io_global_by_file_by_bytes |
| x$io_global_by_file_by_latency |
| x$io_global_by_wait_by_bytes |
| x$io_global_by_wait_by_latency |
| x$latest_file_io |
| x$memory_by_host_by_current_bytes |
| x$memory_by_thread_by_current_bytes |
| x$memory_by_user_by_current_bytes |
| x$memory_global_by_current_bytes |
| x$memory_global_total |
| x$processlist |
| x$ps_digest_95th_percentile_by_avg_us |
| x$ps_digest_avg_latency_distribution |
| x$ps_schema_table_statistics_io |
| x$schema_flattened_keys |
| x$schema_index_statistics |
| x$schema_table_lock_waits |
| x$schema_table_statistics |
| x$schema_table_statistics_with_buffer |
| x$schema_tables_with_full_table_scans |
| x$session |
| x$statement_analysis |
| x$statements_with_errors_or_warnings |
| x$statements_with_full_table_scans |
| x$statements_with_runtimes_in_95th_percentile |
| x$statements_with_sorting |
| x$statements_with_temp_tables |
| x$user_summary |
| x$user_summary_by_file_io |
| x$user_summary_by_file_io_type |
| x$user_summary_by_stages |
| x$user_summary_by_statement_latency |
| x$user_summary_by_statement_type |
| x$wait_classes_global_by_avg_latency |
| x$wait_classes_global_by_latency |
| x$waits_by_host_by_latency |
| x$waits_by_user_by_latency |
| x$waits_global_by_latency |
+-----------------------------------------------+
101 rows in set (0.00 sec)
# 其次我们还可以看看一些配置
mysql> show variables like '%innodb_log%';
+------------------------------------+----------+
| Variable_name | Value |
+------------------------------------+----------+
| innodb_log_buffer_size | 16777216 |
| innodb_log_checksums | ON |
| innodb_log_compressed_pages | ON |
| innodb_log_file_size | 50331648 | # 默认日志配置大小,默认 48M
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_log_spin_cpu_abs_lwm | 80 |
| innodb_log_spin_cpu_pct_hwm | 50 |
| innodb_log_wait_for_flush_spin_hwm | 400 |
| innodb_log_write_ahead_size | 8192 |
| innodb_log_writer_threads | ON |
+------------------------------------+----------+
11 rows in set (0.00 sec)
# 我们主要看看它在线调整配置的功能(修改 buffer_size)
mysql> select 1 * 1024 * 1024 * 1024;
+------------------------+
| 1 * 1024 * 1024 * 1024 |
+------------------------+
| 1073741824 |
+------------------------+
1 row in set (0.00 sec)
mysql> set persist innodb_log_buffer_size=1073741824;
Query OK, 0 rows affected (5.39 sec)
# 修改后
mysql> show variables like '%innodb_log%';
+------------------------------------+------------+
| Variable_name | Value |
+------------------------------------+------------+
| innodb_log_buffer_size | 1073741824 |
| innodb_log_checksums | ON |
| innodb_log_compressed_pages | ON |
| innodb_log_file_size | 50331648 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_log_spin_cpu_abs_lwm | 80 |
| innodb_log_spin_cpu_pct_hwm | 50 |
| innodb_log_wait_for_flush_spin_hwm | 400 |
| innodb_log_write_ahead_size | 8192 |
| innodb_log_writer_threads | ON |
+------------------------------------+------------+
11 rows in set (0.00 sec)
# 然后我们说 auto.cnf 去看看,它会生成一个新的文件来记录你的修改
root@ubuntu:/var/lib/mysql# cat mysqld-auto.cnf
{"Version": 2, "mysql_dynamic_variables": {"innodb_log_buffer_size": {"Value": "1073741824", "Metadata": {"Host": "localhost", "User": "root", "Timestamp": 1705657765780062}}}}
可以看到,它记录了你的修改,然后你重启数据库它也是一直生效的,这里我们先不讲 MySQL 的一些东西,只是体验一下 MySQL 的在线修改配置的功能。下面我们将使用生产常用的二进制的方式来部署它
2:二进制安装
# 安装依赖
root@ubuntu:~# apt-get install libaio-dev -y
# 下载二进制包(这个包里面包含了很多东西)
root@ubuntu:~# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.34-linux-glibc2.28-x86_64.tar
root@ubuntu:~# tar xf mysql-8.0.34-linux-glibc2.28-x86_64.tar
root@ubuntu:~# tar xf mysql-8.0.34-linux-glibc2.28-x86_64.tar.gz
root@ubuntu:~# mv mysql-8.0.34-linux-glibc2.28-x86_64 /usr/local/mysql
# 创建用户与组
root@ubuntu:~# groupadd mysql
root@ubuntu:~# useradd -r -g mysql -s /bin/false mysql
# 设置环境变量
root@ubuntu:~# echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
root@ubuntu:~# source /etc/profile
root@ubuntu:~# mysql --version
mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL)
# 创建软连接
root@ubuntu:~# ln -s /usr/local/mysql/bin/* /usr/bin/
# 创建数据存储目录
root@ubuntu:~# mkdir -p /data/{mysql_data,mysql_log,mysql_slow,mysql_sock}
# 修改目录权限
root@ubuntu:~# chown mysql:mysql /data/
root@ubuntu:~# chown mysql:mysql /data/mysql_*
root@ubuntu:~# chmod 750 -R /data
# 然后开始编辑配置文件
# /etc/my.cnf
[client]
# 设置 MySQL 服务运行的端口号
port = 3306
# MySQL 客户端默认去寻找 socket 的路径
socket = /data/mysql_sock/mysql.sock
# 默认字符集
default-character-set = utf8mb4
[mysqld]
# 服务端监听的端口
port = 3306
# 服务端 socket 存储的位置
socket = /data/mysql_sock/mysql.sock
# 数据存储的位置
datadir = /data/mysql_data
# 只能用IP地址检查客户端的登录,不用主机名
skip_name_resolve = 1
# 若你的 MySQL 数据库主要运行在境外,请务必根据实际情况调整本参数
default_time_zone = '+8:00'
# 数据库默认字符集, 主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4
# 数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_unicode_ci
# 设置client连接mysql时的字符集,防止乱码
init_connect = 'SET NAMES utf8mb4'
# 是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1
# 在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中
# 官方建议 back_log = 50 + (max_connections / 5),封顶数为65535,默认值 = max_connections
back_log = 7550
# 最大连接数
max_connections = 1500
# 最大错误连接数
max_connect_errors = 100000
# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64
# 假定系统有200个并发连接,则需将此参数设置为200 * N(N为每个连接所需的文件描述符数目);
# 当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上
table_open_cache = 2048
# SQL数据包发送的大小,如果有BLOB对象建议修改成 1G
max_allowed_packet = 64M
# # 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认 binlog_cache_size 大小32K
binlog_cache_size = 2M
# 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变
max_heap_table_size = 16M
# MySQL执行排序使用的缓冲大小。如果想要增加 ORDER BY 的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。
# 如果不能,可以尝试增加 sort_buffer_size 变量的大小
sort_buffer_size = 4M
# 联合查询操作所能使用的缓冲区大小,和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享
join_buffer_size = 4M
# MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。
# 如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能
read_buffer_size = 2M
# 分词词汇最小长度,默认4
ft_min_word_len = 4
# 如果您的服务器每秒达到数百个连接,则通常应将 thread_cache_size 设置得足够高,以便大多数新连接使用缓存线程
# default value = 8 + ( max_connections / 100) 上限为100
# 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,
# 如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,
# 增加这个值可以改善系统性能.通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。(–>表示要调整的值)
# 根据物理内存设置规则如下:
# 1G —> 8
# 2G —> 16
# 3G —> 32
# 大于3G —> 64
thread_cache_size = 100
# 批量插入缓存大小, 这个参数是针对 MyISAM 存储引擎来说的。适用于在一次性插入100-1000+ 条记录时, 提高效率。默认值是8M。可以针对数据量的大小,翻倍增加。
bulk_insert_buffer_size = 32M
# 监听地址
bind-address = 0.0.0.0
# 每个线程的堆栈大小 如果线程堆栈太小,则会限制执行复杂SQL语句
thread_stack = 192K
# MySQL 的 heap(堆积)表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。
# 大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。
# 如果某个内部heap(堆积)表大小超过 tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。还可以通过设置tmp_table_size选项来增加临时表的大小。也就是说,如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果
tmp_table_size = 16M
# 开启 bin log 功能
log-bin = /data/mysql_log/mysql-bin
# 控制 binlog 写磁盘频率
sync_binlog = 1
# 输出日志的方式
log_output = file
# 作为从库时生效, 想进行级联复制,则需要此参数
log_replica_updates
# 这个 ID 可以自己设置,我是配置的网段最后一组和 MySQL 端口的结合
server-id = 123306
# 作为从库时生效, 中继日志 relay-log 可以自我修复
relay_log_recovery = 1
# 指定慢查询日志文件的路径和名字
slow_query_log_file = /data/mysql_slow/slow.log
# 慢查询日志的开关,该参数等于1代表开启慢查询
slow_query_log
# 慢查询执行的秒数,必须达到此值可被记录
long_query_time = 1
# 错误日志路径
log_error = /data/mysql_log/error.log
# 中继日志 relay-log 的存储位置
relay-log = /data/mysql_log/relay-bin
# 记录日志的显示时间参数
log_timestamps = SYSTEM
########## MyISAM Specific options ##########
# 设置 MySQL 数据库的缓存大小
key_buffer_size = 64M
########## INNODB Specific optiopns ##########
# 事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
transaction_isolation = REPEATABLE-READ
# 一般设置物理存储的 60% ~ 70%
innodb_buffer_pool_size = 1G
# 定义 InnoDB 系统表空间数据文件的名称、大小和属性
innodb_data_file_path = ibdata1:1000M:autoextend
# 表示每个表都有自已独立的表空间
innodb_file_per_table = 1
# 控制 redolog 写磁盘频率 默认为 1
innodb_flush_log_at_trx_commit = 1
# InnoDB用于写入磁盘日志文件的缓冲区大小(以字节为单位)。默认值为16MB
innodb_log_buffer_size = 16M
# innodb主线程刷新缓存池中的数据,使脏数据比例小于90%
innodb_max_dirty_pages_pct = 90
# Metadata Lock最大时长(秒), 一般用于控制 alter 操作的最大时长 sine mysql5.6
# 执行 DM L操作时除了增加 innodb 事务锁外还增加 Metadata Lock,其他 alter(DDL)session将阻塞
lock_wait_timeout = 20
# 为了获取被锁定的资源最大等待时间,默认50秒,超过该时间会报如下错误:
# ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
innodb_lock_wait_timeout = 20
# #O_DIRECT减少操作系统级别 VFS 的缓存和 Innodb 本身的 buffer 缓存之间的冲突
innodb_flush_method = O_DIRECT_NO_FSYNC
# 提高刷新脏页数量和合并插入数量,改善磁盘I/O处理能力
# 根据您的服务器IOPS能力适当调整
# 一般配普通SSD盘的话,可以调整到 10000 - 20000
# 配置高端 PCIe SSD 卡的话,则可以调整的更高,比如 50000 - 80000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
# TIMESTAMP 如果没有显示声明 NOT NULL,允许NULL值
explicit_defaults_for_timestamp = true
authentication_policy = caching_sha2_password
# bin log日志保存的天数
# 如果 binlog_expire_logs_seconds 选项也存在则 expire_logs_days 选项无效
# expire_logs_days 已经被标注为过期参数
# expire_logs_days = 7
binlog_expire_logs_seconds = 604800
[mysqldump]
quick
# 服务器发送和接受的最大包长度
max_allowed_packet = 64M
[mysql]
[myisamchk]
key_buffer_size = 64M
sort_buffer_size = 64M
read_buffer = 8M
write_buffer = 8M
[mysqld_safe]
# 它控制着mysqld进程能使用的最大文件描述(FD)符数量。
# 需要注意的是这个变量的值并不一定是你设定的值,mysqld会在系统允许的情况下尽量获取更多的FD数量
open-files-limit = 65535
log_error_verbosity = 1
log_error = /data/mysql_log/error.log
pid-file = /data/mysql_data/mysql.pid
# 在此之前,我们要说明白,MySQL 8.0 的小版本其实也是也有很多配置在变,所以最好是自己测试配置
# 然后我们初始化
root@ubuntu:~# mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
# 启动
root@ubuntu:~# mysql_ssl_rsa_setup
root@ubuntu:~# mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
[1] 5001
root@ubuntu:~# 2024-01-19T14:12:20.967240Z mysqld_safe Logging to '/data/mysql_log/error.log'.
2024-01-19T14:12:20.985478Z mysqld_safe Starting mysqld daemon with databases from /data/mysql_data
root@ubuntu:~# tail -f /data/mysql_log/error.log
2024-01-19T22:11:50.186711+08:00 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.34) initializing of server in progress as process 4951
2024-01-19T22:11:50.198072+08:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-01-19T22:11:50.905216+08:00 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-01-19T22:11:52.500214+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: tmlnTsghI0=B
2024-01-19T22:12:21.299643+08:00 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.34) starting as process 5793
2024-01-19T22:12:21.372525+08:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-01-19T22:12:22.158341+08:00 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-01-19T22:12:22.577552+08:00 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-01-19T22:12:22.577963+08:00 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-01-19T22:12:22.605428+08:00 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.34' socket: '/data/mysql_sock/mysql.sock' port: 3306 MySQL Community Server - GPL.
2024-01-19T22:12:22.605488+08:00 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /tmp/mysqlx.sock
# 过滤日志查找初始化密码并赋值给变量
root@ubuntu:~# cat /data/mysql_log/error.log | grep password
2024-01-19T22:11:52.500214+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: tmlnTsghI0=B
root@ubuntu:~# password=$(cat /data/mysql_log/error.log | grep password | awk '{print $NF}')
root@ubuntu:~# echo $password
tmlnTsghI0=B
# 登录
root@ubuntu:~# mysql -uroot -p$password
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.34
Copyright (c) 2000, 2023, 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>
# 这样就 和 apt 安装一样使用就好了,修改密码
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
# 设置密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED with caching_sha2_password BY 'MTIzNDU2Cg==';
Query OK, 0 rows affected (0.02 sec)
# 重新登录
root@ubuntu:~# password=$(echo "123456" | base64)
root@ubuntu:~# echo $password
MTIzNDU2Cg==
root@ubuntu:~# mysql -uroot -p$password
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.34 MySQL Community Server - GPL
Copyright (c) 2000, 2023, 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 databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
# 熟悉一下常见的操作
mysql> \s
--------------
mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 11
Current database: # 当前数据库:不指定则为空
Current user: root@localhost # 当前登录的用户
SSL: Not in use # 是否使用 SSL
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.34 MySQL Community Server - GPL # 数据库版本
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /data/mysql_sock/mysql.sock
Binary data as: Hexadecimal
Uptime: 18 hours 52 min 52 sec # 运行时间
Threads: 2 Questions: 13 Slow queries: 0 Opens: 150 Flush tables: 3 Open tables: 66 Queries per second avg: 0.000
--------------
但是我们要知道,我们现在启动这个 MySQL 它是没有守护进程来托管的,还是直接放到后台运行的,所以下面我们将使用 systemd 来托管这个进程,而我们也只需要配置一个 service 文件即可
# /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Service]
User=mysql
Group=mysql
Type=notify
PIDFile=/data/mysql_data/mysqld.pid
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql_data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/data/mysql_log/error.log --open-files-limit=65535 --pid-file=/data/mysql_data/mysql.pid --socket=/data/mysql_sock/mysql.sock
RuntimeDirectory=mysql
TimeoutSec=0
[Install]
WantedBy=multi-user.target
root@ubuntu:~# systemctl daemon-reload
root@ubuntu:~# systemctl start mysqld.service
root@ubuntu:~# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/lib/systemd/system/mysqld.service; disabled; vendor preset: enabled)
Active: active (running) since Sat 2024-01-20 17:47:50 CST; 17s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Main PID: 9581 (mysqld)
Status: "Server is operational"
Tasks: 41 (limit: 2178)
Memory: 437.1M
CPU: 803ms
CGroup: /system.slice/mysqld.service
└─9581 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql_data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/data>
Jan 20 17:47:49 ubuntu systemd[1]: Starting MySQL Server...
Jan 20 17:47:50 ubuntu systemd[1]: Started MySQL Server.
# 然后验证一下登录
root@ubuntu:~# mysql -uroot -p$password
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.34 MySQL Community Server - GPL
Copyright (c) 2000, 2023, 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 databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
# 这样我们就把 MySQL 托管给了 Systemd 去管理了,下面还有一些常见的问题:
1:防火墙,selinux,内存分配过大(buffer_pool 的设置超过了系统内存),文件权限等
2:参数已被移除,格式错误,跨版本参数不兼容
3:datadir,basedir 等配置错误
4:系统原自带的 mariadb 等未删除可能导致读取配置错误等
至此,我们已圆满完成了MySQL基础篇章。 我们不仅追溯了MySQL的成长历程,还简明扼要地对比了其与业界其他主流数据库系统——PostgreSQL与Oracle——的特性,深入浅出地探讨了各自的优劣与适用场景。此外,我们还手把手带领大家走过了MySQL的安装与配置之路。
在接下来的进阶篇中,我们将进一步探索MySQL的语法精粹,解析其数据结构与存储引擎的奥秘,掌握一系列实用函数,理解事务处理与锁机制,以及如何构建高可用性解决方案。
黑客/网络安全学习路线
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
网络安全学习资源分享:
下面给大家分享一份2025最新版的网络安全学习路线资料,帮助新人小白更系统、更快速的学习黑客技术!
一、2025最新网络安全学习路线
一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
读者福利 |
优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)
我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。
L1级别:网络安全的基础入门
L1阶段:我们会去了解计算机网络的基础知识,以及网络安全在行业的应用和分析;学习理解安全基础的核心原理,关键技术,以及PHP编程基础;通过证书考试,可以获得NISP/CISP。可就业安全运维工程师、等保测评工程师。
L2级别:网络安全的技术进阶
L2阶段我们会去学习渗透测试:包括情报收集、弱口令与口令爆破以及各大类型漏洞,还有漏洞挖掘和安全检查项目,可参加CISP-PTE证书考试。
L3级别:网络安全的高阶提升
L3阶段:我们会去学习反序列漏洞、RCE漏洞,也会学习到内网渗透实战、靶场实战和技术提取技术,系统学习Python编程和实战。参加CISP-PTE考试。
L4级别:网络安全的项目实战
L4阶段:我们会更加深入进行实战训练,包括代码审计、应急响应、红蓝对抗以及SRC的挖掘技术。并学习CTF夺旗赛的要点和刷题
整个网络安全学习路线L1主要是对计算机网络安全的理论基础的一个学习掌握;而L3 L4更多的是通过项目实战来掌握核心技术,针对以上网安的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
二、技术文档和经典PDF书籍
书籍和学习文档资料是学习网络安全过程中必不可少的,我自己整理技术文档,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,(书籍含电子版PDF)
三、网络安全视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的网安视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
四、网络安全护网行动/CTF比赛
学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。
五、网络安全工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了技术之后,就需要开始准备面试,我们将提供精心整理的网安面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
**读者福利 |**
优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 **(安全链接,放心点击