MySQL 数据库 1(Day49)
主题:MySQL 数据库管理软件本质、密码设置与破解(skip-grant-tables)、配置文件 /etc/my.cnf 管理、SQL 语句基本操作(库/表/记录 CRUD)、MySQL 源码编译安装、二进制安装
结构总览
MySQL 数据库 1
├─ 数据库介绍
│ ├─ MySQL = socket 服务端程序 + 本地文件管理
│ ├─ 库/表/记录/字段 ↔ 文件夹/文件/行/列
│ └─ RDBMS(二维表+外键+ACID)vs NoSQL(灵活结构+高并发)
├─ 密码设置与破解
│ ├─ 初始密码:grep 'temporary password' /var/log/mysqld.log
│ ├─ 修改密码:ALTER USER(5.7+)/ SET PASSWORD(5.6-)
│ └─ 忘记密码:skip-grant-tables 跳过授权表 → 无密码登录 → 改密 → 移除配置重启
├─ 配置文件管理:/etc/my.cnf([client]/[mysqld] 段)+ 核心配置项 + 加载顺序
├─ SQL 语句:DDL/DML/DQL/DCL 分类 + 库/表/记录 CRUD(含 ORDER BY / LIMIT)
├─ 源码编译安装:依赖 → cmake 配置 → make && make install → 初始化 → systemd
└─ 二进制安装:解压 → 初始化(临时密码)→ 环境变量 → my.cnf → systemd → 改密
关键要点
数据库本质(与 Day48 一致): MySQL 是 socket 服务端程序,管理本地文件。库=文件夹、表=文件(取决于存储引擎一表对应一个或多个文件)、记录=文件内一行、字段=文件内一列。RDBMS 以二维表组织数据、固定 Schema、支持 ACID、SQL 操作、存硬盘;NoSQL 结构灵活无需预定义 Schema、事务弱、读写性能高适合高并发、部分存内存。
初始密码获取: 源码和二进制安装的 MySQL,初始密码生成在错误日志中:grep 'temporary password' /var/log/mysqld.log。若日志路径不同,检查 /var/log/mysqld.log 或 /usr/local/mysql/data/hostname.err。
修改密码: MySQL 5.7+:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; FLUSH PRIVILEGES;。MySQL 5.6 及之前:SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码');。
忘记密码破解(skip-grant-tables): ① systemctl stop mysqld;② 在 /etc/my.cnf 的 [mysqld] 段添加 skip-grant-tables;③ 启动 MySQL;④ mysql -uroot 无密码登录;⑤ FLUSH PRIVILEGES; 后 ALTER USER ... 修改密码;⑥ 退出并移除 skip-grant-tables 配置,重启 MySQL。此配置仅限临时故障恢复使用,用完立即移除(否则任何人可无密码登录)。
常见排错: 无法登录 → 密码错误/忘记,用 skip-grant-tables 破解;密码验证失败 → MySQL 5.7+ 默认密码策略,使用复杂密码或调整 validate_password 策略;初始密码找不到 → 检查日志路径。
配置文件 /etc/my.cnf: 结构分 [client](客户端,port/socket)与 [mysqld](服务端,user/port/socket/datadir/pid-file/log-error)。核心配置项:datadir(数据目录,默认 /var/lib/mysql)、port(默认 3306)、max_connections(最大连接数,建议 500-2000 按业务调整)、character-set-server(字符集 utf8mb4 支持 emoji)、innodb_buffer_pool_size(InnoDB 缓存池,物理内存 60%-70%)、skip-grant-tables(仅临时恢复用)。加载顺序:/etc/my.cnf → /etc/mysql/my.cnf → /usr/local/mysql/etc/my.cnf → ~/.my.cnf,后面的配置覆盖前面同名项。
SQL 分类与操作: DDL(CREATE/ALTER/DROP 定义结构)、DML(INSERT/UPDATE/DELETE 操作数据)、DQL(SELECT 查询)、DCL(GRANT/REVOKE 权限)。库操作:CREATE/DROP/ALTER DATABASE + SHOW DATABASES。表操作:CREATE TABLE / DROP TABLE / ALTER TABLE ADD·MODIFY / SHOW TABLES / DESC。记录 CRUD:INSERT(可指定列 INSERT INTO t1 (name, age) VALUES ('tom', 20))、SELECT(支持 WHERE / ORDER BY age DESC / LIMIT 10)、UPDATE、DELETE。危险操作警示:DELETE FROM t1; 不带 WHERE 会删除全部数据。
源码编译安装: 适合有定制需求的生产环境(可定制编译参数)。步骤:① 安装依赖(yum install gcc gcc-c++ cmake make ncurses-devel bison openssl-devel);② 下载源码 tar.gz 解压;③ CMake 编译配置(-DCMAKE_INSTALL_PREFIX=/usr/local/mysql、-DMYSQL_DATADIR=/data/mysql、-DSYSCONFDIR=/etc、-DWITH_INNOBASE_STORAGE_ENGINE=1、-DWITH_SSL=system);④ make && make install;⑤ 创建 mysql 用户(useradd -s /sbin/nologin mysql);⑥ 初始化数据目录(mysqld --initialize --user=mysql --basedir=... --datadir=...);⑦ 复制 my-default.cnf 到 /etc/my.cnf;⑧ 配置 systemd/init.d 服务。对比:源码安装慢(需编译)但定制灵活;二进制安装快(解压即用)但定制有限。
二进制安装: 官方预编译版本,适合快速部署。步骤:① 下载 mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz 解压并 mv 到 /usr/local/mysql;② 创建 mysql 用户;③ 创建数据目录并授权(chown -R mysql:mysql /usr/local/mysql /data/mysql);④ 配置环境变量(echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh; source ...);⑤ mysqld --initialize 初始化(输出中生成临时密码 [Note] A temporary password is generated for root@localhost: xxxxxxxx);⑥ 配置 /etc/my.cnf(basedir/datadir/port/socket/user/character-set-server);⑦ 编写 mysqld.service(Type=forking,ExecStart=mysqld_safe —defaults-file=/etc/my.cnf,ExecStop=mysqladmin shutdown,User=mysql)→ systemctl daemon-reload && systemctl start/enable mysqld;⑧ 登录修改密码(grep 'temporary password' /data/mysql/*.err 或从初始化输出获取)。排错:找不到 mysqld 命令 → PATH 未配置;初始化失败 → 数据目录权限;启动失败 → my.cnf 路径;无法连接 socket → client 与 mysqld 的 socket 路径必须一致。
相关页面
- MySQL 概念页 — 本课核心概念页(部署/密码管理/配置文件/SQL/安装方式)
- 数据库导学(Day48) — MySQL 学习周期全景路线图
- PHP 体系架构 — LNMP 部署中的 MySQL 角色(Day38)
- Nginx 概念页 — LNMP 架构中的反向代理层
- Supervisor 进程管理 — 进程守护思路可类比 mysqld 服务托管