做书app下载网站有哪些,网站的具体内容,旅游网站开发数据库,软件开发与网站建设#xff08;一#xff09;MySQL 基础操作与服务故障类
连接层错误#xff08;客户端与服务器的连接建立失败#xff09;
解决 socket 路径、文件存在性及服务可用性问题。
1、MySQL 客户端连接失败#xff08;报错 “Cant connect to local MySQL server throgh socket…一MySQL 基础操作与服务故障类
连接层错误客户端与服务器的连接建立失败
解决 socket 路径、文件存在性及服务可用性问题。
1、MySQL 客户端连接失败报错 “Cant connect to local MySQL server throgh socket...”
①确认mysql启动②查找实际socket路径在mysql配置文件中grep socket /etc/mysql/my.cnf /etc/my.cnf /etc/mysql/mysql.conf.d/mysqld.cnf③ 如果 socket 文件位置与客户端默认查找的位置不一致则手动指定mysql -u 用户名 -p --socket/实际的socket路径 ④确保 MySQL 进程客户端有权限创建和访问 socket 文件。msyql:mysqlls -ld /var/run/mysqld/ ls -l /var/run/mysqld/mysqld.sock
2、多路径存在 mysql.sock 的情况确认
①搜索系统中所有名为 mysql.sock 的文件
sudo find / -name mysql.sock 2/dev/null //
②方法一确认当前 MySQL 实例实际使用的 socket 路径
grep -r socket /etc/mysql/ /etc/my.cnf /etc/mysql/mysql.conf.d/ 2/dev/null 方法二登录 MySQL 实例查询
SHOW VARIABLES LIKE socket;
③ 多 socket 文件的原因
多个 MySQL 实例共存系统中可能运行着多个 MySQL 服务如官方版与第三方包、不同版本每个实例生成独立的 socket 文件。历史残留文件旧版本 MySQL 卸载不彻底遗留了未删除的 mysql.sock。配置修改后未清理修改 socket 路径后旧路径的 socket 文件未删除。权限问题导致的残留MySQL 服务异常退出时可能未自动清理 socket 文件。
④ 停止多余的服务假设服务名为 mysql2 删除对应的 socket 文件
sudo systemctl stop mysql2 sudo rm -f /path/to/unused/mysql.sock
⑤ 统一客户端与服务端的 socket 路径在客户端配置文件
[client] socket /var/run/mysqld/mysqld.sock # 与服务端配置一致
⑥ 重启 MySQL 服务确保 socket 正确生成
sudo systemctl restart mysql # 验证 socket 文件是否存在 ls -l /var/run/mysqld/mysqld.sock
服务层错误MySQL 服务自身启动 / 运行失败
聚焦服务启动 / 重启失败核心是权限和配置正确性。
1、MySQL 服务启动失败报错 “权限不够Error: 13”
①找到权限不足的具体文件或目录在错误日志中
sudo tail -f /var/log/mysql/error.log Cant create/write to file /path/to/file (Errcode: 13 - Permission denied)
②查看数据目录权限 # 正确的权限应为属主和属组都是 mysql权限至少为 700
ls -ld /var/lib/mysql/
③排查 SELinux/AppArmor 等安全机制的限制、检查 MySQL 运行用户
2、MySQL 停服改配置后重启卡住的处理
sudo tail -f /var/log/mysql/error.log //查看 MySQL 错误日志
配置修改不当如参数冲突、权限错误导致服务重启时进程阻塞。
3、MySQL 首次启动自动初始化规则及目录修改触发条件
首次启动时自动初始化数据目录、系统表等目录修改可能触发重新初始化逻辑。
4、其他触发 MySQL 初始化的操作删关键文件 /--initialize 参数
删除数据目录关键文件或使用初始化参数会触发服务重新初始化可能影响服务启动。
权限验证错误连接已建立但权限校验失败
围绕账号、密码、主机匹配及权限授予展开。
1、MySQL 登录被拒报错 “Access denied for user rootlocalhost”
① 密码是否正确 ② 检查登录主机是否匹配 ③重置 root 密码忘记密码或密码错误
停止 MySQL 服务步骤--跳过权限验证启动 MySQL--无密码登录并修改密码--重启 MySQL 服务
④MySQL 8.0 默认使用 caching_sha2_password 认证插件而部分旧客户端如 Navicat 旧版本不支持会导致登录失败。可修改为旧插件
⑤检查用户是否被锁定
SELECT user, host, account_locked FROM mysql.user WHERE userroot; # 若 account_locked 为 Y执行解锁 ALTER USER rootlocalhost ACCOUNT UNLOCK; FLUSH PRIVILEGES;
2、从库复制权限不足ERROR 1227: Access denied普通用户执行 STOP SLAVE
① 使用 REPLICATION SLAVE ADMIN 权限 mysql -u root -pGRANT REPLICATION SLAVE ADMIN ON *.* TO username%; FLUSH PRIVILEGES;
//授权时尽量指定具体主机如 username192.168.1.100避免使用 % 允许所有主机访问。
3、主从复制时出现 ERROR 1045 (28000): Access denied for user replslave_ip (using password: YES) 错误
① 检查主库复制账号是否存在及密码是否正确
SELECT user, host, authentication_string FROM mysql.user WHERE user repl;
② 在从库测试连接主库 登录失败说明密码错误或账号不存在需在主库重新配置
mysql -h 主库IP -u repl -p
③检查从库复制配置中的账号密码
STOP SLAVE;CHANGE MASTER TO MASTER_HOST 主库IP, MASTER_USER repl, MASTER_PASSWORD 正确的密码, MASTER_LOG_FILE 主库当前binlog文件,MASTER_LOG_POS 主库当前binlog位置; START SLAVE; SHOW SLAVE STATUS\G
④ DNS 反向解析
SET GLOBAL skip_name_resolve ON; //主库执行临时关闭 DNS 反向解析在从库重新执行 START SLAVE若错误消失说明是反向解析问题修改主库配置文件[mysqld] skip_name_resolve ON # 添加此行禁用 DNS 反向解析
⑤确保网络和防火墙允许从库访问主库 3306 端口
4、健康检查用户连接错误monitor 用户连接后端库被拒 原因monitor 账号不存在、密码错误、主机权限未开放或网络 / 防火墙限制。
配置层错误参数配置不当导致功能异常
服务已启动且连接正常但因配置参数错误导致功能失效
关注参数生效规则、版本兼容性及系统变量特性。
1、GTID 配置不生效gtid_modeOFF改配置未重启
原因修改 GTID 模式后未重启服务导致参数未生效。
validate_password 变量含义 / 配置解读MEDIUM 策略
说明密码验证插件的参数配置控制密码强度要求如长度、复杂度。
validate_password 变量格式区别. 与_版本兼容性
说明不同 MySQL 版本中密码验证变量的命名格式差异影响配置生效。
带_的 validate_password 变量能否删除系统兼容项不可删
二MySQL 数据备份与恢复类
1、备份 SQL 文件导入无效果文件空 / 损坏 / 路径错 / SQL 语法错
①文件为空或损坏
ls -lh backup.sql head -n 10 backup.sql
②文件路径错误使用绝对路径导入确保 MySQL 进程有权限读取文件
③SQL 语法错误查看错误日志定位具体错误行grep ERROR /var/log/mysql/error.log
2、误删数据后的备份与恢复方法备份剩余数据 备份 / 二进制日志 / 第三方工具
1利用全量备份 二进制日志恢复
①恢复全量备份到故障前状态
# 假设全量备份为 full_backup.sql mysql -u root -p 数据库名 full_backup.sql
②找到全量备份对应的二进制日志位置
grep CHANGE MASTER TO full_backup.sql
③导出从备份点到误删前的二进制日志
mysqlbinlog --start-position154 --stop-datetime2024-08-27 10:00:00 /var/log/mysql/binlog.000003 增量日志.sql
④导入增量日志
mysql -u root -p 数据库名 增量日志.sql
2无备份但开启二进制日志直接通过 binlog 恢复
①mysql -u root -p -e SHOW BINARY LOGS; # 分析日志内容定位误删语句
mysqlbinlog /var/log/mysql/binlog.000003 | grep -i DELETE FROM 表名
②生成反向 SQL跳过误删操作或执行反向语句
若为 DELETE可提取对应 INSERT 语句恢复
三MySQL 表结构与约束类
文件与存储引擎类核心表文件含义、缺失与结构关联
1、表空间缺失报错 “Tablespace is missing”.ibd 文件丢失 / 损坏 解释InnoDB 表的表空间文件.ibd丢失或损坏导致 MySQL 无法加载表数据。.ibd 是 InnoDB 独立表空间文件存储表数据和索引若误删、磁盘损坏或迁移时遗漏该文件会触发此错误。
外键约束类核心外键创建 / 删除 / 数据操作的约束冲突
1、删除表因外键约束失败报错 “referenced by a foreign key constraint”
解释要删除的表是 “主表”有其他 “子表” 通过外键关联它子表外键引用主表主键MySQL 为保证数据一致性禁止直接删除被引用的主表需先删除子表或解除外键约束。
2、创建外键报错 “incompatible”tid 字段 UNSIGNED 属性不一致
解释外键字段与引用的主键字段 “数据属性不兼容”—— 子表外键 tid 若为 UNSIGNED无符号主表被引用的 tid 必须也是 UNSIGNED若一方有、一方无MySQL 判定类型不匹配拒绝创建外键。
3、添 / 更数据报错 “cannot add or update a child row”子表外键值主表不存在
解释子表插入 / 更新数据时外键字段的值在主表中不存在违反 “外键引用完整性”。例如子表订单表外键 user_id100但主表用户表中无 user_id100 的记录MySQL 阻止操作以避免数据孤立。
表设计与数据操作类核心建表、插数、查询的具体实现
语法转换与错误修正类核心跨数据库语法适配、建表 / 查询错误修复
四MySQL 查询与 SQL 语法类
1. 语法报错 先查关键字 / 命令格式确认命令结构完整无多余空格、关键字拼写正确、标点为英文格式 再查对象名匹配性核对表 / 字段名与数据库实际结构一致别名在查询中已定义且作用域正确含特殊字符的对象名用反引号包裹 最后查查询结构逻辑确保 SELECT/FROM/WHERE/GROUP BY 等子句完整GROUP BY 与 SELECT 字段匹配子查询返回结果符合关联要求。
1关键字 / 命令格式错误语法规则违反
① 命令关键字空格 / 拼写错误
示例SHOW SLAVE Hosts; 报错多余空格 关键字小写、show database user 报错语法结构错误。 原因MySQL 关键字需遵循固定格式无多余空格、命令结构完整如查看用户需 SELECT user FROM mysql.user而非 show database user且关键字大小写不敏感但格式需规范。
② 标点符号错误
示例字段列表多逗号如 SELECT id, name, FROM student、中文标点如用 “” 代替 “,”、“” 代替 “()”、占位符 / 括号不匹配。 原因MySQL 仅识别英文标点且语法解析对 “逗号、括号” 敏感 。 多逗号会导致解析中断中文标点被判定为非法字符最终触发 1064 语法错。
③ 注释特殊字符干扰
示例注释中含 # -- 外的特殊字符如 /* 注释内容# */导致 SQL 解析失败。 原因MySQL 注释格式有严格限制# 单行注释、-- 单行注释需加空格、/* */ 多行注释注释内若含未转义的特殊字符可能被误认为 SQL 语句一部分引发解析错误。
2对象名表 / 字段 / 别名错误标识符无法识别
① 字段名拼写 / 格式错误
示例“查卖笔记本商店 ID” 报错实际字段为 ID写为 “商品 ID” 含空格、Unknown column s. 商店 ID字段名含空格未用反引号包裹。 原因字段名若含空格、特殊字符如中文需用反引号 包裹如 商店 ID直接写 “商品 ID” 会被 MySQL 拆分为 “商品” 和 “ID” 两个未知字段触发 1054 未知列错误。
② 表 / 别名未定义 / 不匹配
示例表别名未定义如 SELECT t.name FROM student 中 t 未关联表、子查询用外部表别名如子查询中用 t.TID但 t 是外部查询的表别名子查询内未定义、子查询改原表名仍报错如未关联 tutors 表却用其字段。 原因表别名需在 FROM/JOIN 中定义如 FROM tutors t且作用域仅限当前查询层级 —— 子查询无法直接使用外部查询的别名未关联的表其字段也无法被识别均会触发 1054 错误。
③ 字段 / 表名混淆
示例“查卖笔记本商店 ID” 中误将 “商品表” 字段写为 “商店表” 字段如实际商品表存商品类型却从商店表查 “笔记本” 相关字段、表名拼写错如 FROM studnet 代替 student。 原因查询时引用的表 / 字段与实际数据库结构不匹配MySQL 无法在指定表中找到对应字段或无法找到指定表导致报错。
3查询结构不完整 / 逻辑错误语法逻辑违反
① 查询核心子句缺失
示例查询结构缺 FROM如 SELECT id, name WHERE age18、子查询缺 FROM如 SELECT (SELECT name WHERE id1)。 原因SELECT 查询需 FROM 子句指定数据来源表除非是无表查询如 SELECT 11缺失 FROM 会导致 MySQL 无法定位数据直接报错。
②GROUP BY 用法错误
示例GROUP BY 单独使用无 SELECT 对应字段、未按非聚合字段分组如 SELECT t.TID, t.Tname, SUM(score) FROM test GROUP BY t.TID缺 t.Tname 分组、HAVING 子句处理不当如 HAVING score90 中 score 未聚合且非分组字段。 原因MySQL 开启 ONLY_FULL_GROUP_BY 模式时SELECT 中非聚合字段必须全部在 GROUP BY 中GROUP BY 需配合 SELECT 聚合 / 分组字段使用单独使用或字段不匹配会触发语法错且可能导致结果逻辑错误如未分组字段返回随机值。
③ 子查询逻辑错误
示例子查询 HAVING 子句返回多列如 SELECT * FROM student WHERE EXISTS (SELECT id, name FROM score HAVING avg80)、子查询结果与外部查询不匹配如用 关联返回多列的子查询。 原因HAVING 子句用于过滤分组结果需配合 GROUP BY 且返回单值子查询若用 与外部字段关联需确保子查询仅返回一列一行多列 / 多行会导致语法解析失败。
2. 查询逻辑与结果异常
1索引使用异常联合索引失效 核心是未遵循联合索引的使用规则导致索引无法生效、查询效率下降。 当联合索引如idx_col1_col2_col3遇到以下情况时会失效 未遵循 “最左前缀原则”如仅用右侧列col2/col3过滤跳过左侧col1 对索引列使用函数如DATE(col1)2024-01-01破坏索引结构 发生隐式类型转换如索引列col1为INT查询用col1123字符串匹配无法匹配索引格式。
2查询结果不符合预期数据 / 条件匹配错误
此类问题均因 “查询条件不精准” 或 “数据关联异常”导致结果与业务需求偏差具体分两类
① 结果范围过大返全部 / 多余数据
如 “查卖笔记本商店 ID 返全部”“商店 1 有铅笔库存返 1-3”本质是筛选条件未精准锁定目标 要么 “商品标识错误”如笔记本 / 铅笔的 ID / 名称写错匹配到所有商品 要么 “数据关联异常”如库存表中所有商店都关联了目标商品或未加商店 ID 筛选条件 或 “子查询逻辑错误”子查询未返回有效筛选结果导致主查询无法过滤。
② 结果缺失部分数据无值
如 “查询部分课程无平均分”核心是左连接的特性与数据缺失共同导致 用 “课程表左连接成绩表” 时若某课程在成绩表中无记录左连接会保留课程信息但成绩字段为NULL 而AVG()函数会忽略NULL最终该课程无平均分结果表现为 “结果缺失”。
3. SQL 函数与语法知识
1函数用法类 SUM 函数写法与大小写 写法SUM(列名/表达式)函数名与括号间可加空格如 SUM (price*num)括号内支持列名或计算表达式如统计总金额 SUM(price*quantity)。 大小写MySQL 中不强制函数名大写SUM() 与 sum() 效果一致仅为代码规范建议大写以区分关键字。 SELECT 1 返回 TRUE 与 WHERE TRUE 含义 SELECT 1查询结果返回一个值为 1 的单列数据本质是返回 “逻辑真”非空结果即代表条件成立常用于 EXISTS 子查询中判断 “是否存在满足条件的记录”。 WHERE TRUEWHERE 子句中条件恒为真会查询表中所有记录类似 WHERE 11常用于动态拼接 SQL 时避免开头多逗号的问题如后续可灵活追加 AND 条件。
2条件查询与逻辑运算符类 NOT EXISTS 定义 / 语法 / 原理 / 场景 定义判断子查询是否 “无满足条件的记录”若子查询返回空则 NOT EXISTS 结果为 TRUE否则为 FALSE。 语法SELECT 列 FROM 主表 WHERE NOT EXISTS (子查询);。 原理子查询不返回具体数据仅判断 “是否存在记录”效率高于 NOT IN避免 NULL 值影响。 场景查询 “无关联数据的记录”如 “未下单的用户”SELECT * FROM user u WHERE NOT EXISTS (SELECT 1 FROM order o WHERE o.user_id u.id)。 NOT 逻辑运算符用法 作用对条件结果取反仅作用于单个布尔条件如 NOT (price 10) 等价于 price 10。 常见场景结合 INNOT IN查 “不在指定范围内的记录”、EXISTSNOT EXISTS、BETWEENNOT BETWEEN等如 SELECT * FROM product WHERE NOT category IN (文具, 玩具)。
五ProxySQL 相关问题类
ProxySQL 连接与命令报错类
1. ProxySQL 管理端连接报错 问题现象使用 mysql -uadmin 连接管理端时系统默认寻找本地 socket 文件导致连接失败。 原因与解决ProxySQL 管理端默认监听端口 6032需显式指定端口正确命令为 mysql -uadmin -P6032 -h127.0.0.1需补充密码时加 -p。
2. mysql_server_connect_log 查询报错 问题现象查询连接日志表 mysql_server_connect_log 时使用 time_start 或 time 字段提示不存在。 原因与解决该表中存储时间的字段实际名为 time_start_us微秒级时间戳需用此字段查询。
3. stats_mysql_query_digest 查询报错 问题现象执行查询时提示 Unknown database stats。 原因与解决stats_mysql_query_digest 属于 stats 数据库下的表需先显式指定数据库如 USE stats;再执行查询。
ProxySQL 核心配置与表结构类
1. mysql_users 表核心字段含义 字段名 作用 active 控制用户是否启用值为 1 表示用户可用于连接 ProxySQL0 表示禁用该用户。 transaction_persistent 控制事务路由一致性值为 1 时同一事务的所有 SQL 会路由到同一后端节点避免事务跨节点问题与 active用户启用状态无关联需区分开。
2. ProxySQL 用户与主库用户关系 核心规则ProxySQL 中配置的用户mysql_users 表其用户名、密码需与后端主库的用户 完全一致。 影响若不一致ProxySQL 转发连接请求时会因主库身份验证失败导致客户端连接报错。
3. ProxySQL 不支持的操作 不支持 DESCRIBE 命令查看表结构需用 SHOW COLUMNS FROM 表名; 替代。 无 information_schema.columns 表ProxySQL 不兼容 MySQL 原生的 information_schema 库需通过 SHOW COLUMNS 查看字段信息。
4. 不同 LOAD/SAVE 命令区别 作用用于将配置在 “磁盘文件”“运行时内存”“管理端内存” 间同步对应不同配置模块 规则类如 mysql_query_rulesLOAD MYSQL QUERY RULES FROM DISK/RUNTIMESAVE MYSQL QUERY RULES TO DISK/RUNTIME 变量类如全局变量LOAD MYSQL VARIABLES FROM DISK/RUNTIMESAVE MYSQL VARIABLES TO DISK/RUNTIME 管理配置如 mysql_usersLOAD MYSQL USERS FROM DISK/RUNTIMESAVE MYSQL USERS TO DISK/RUNTIME。
ProxySQL 路由与查询分析类
1. 路由规则修改问题
问题场景向 mysql_query_rules 表插入路由规则后发现错误如规则条件写错。解决方式ProxySQL 无 “修改规则” 的直接命令需先通过 DELETE FROM mysql_query_rules WHERE 条件; 删除错误规则或用 UPDATE 修正字段值再执行 LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK; 生效。 MySQL 从库问题类
1、从库 IO 线程启动失败Slave_IO_Running: No 问题现象查看从库状态SHOW SLAVE STATUS\G时Slave_IO_Running 字段值为 NoIO 线程未启动。 常见原因master_log_file 配置错误即从库指定的主库二进制日志文件名前缀错误如主库实际日志为 mysql-bin.000001从库误写为 master-bin.000001。解决方向重新在从库执行 CHANGE MASTER TO 命令指定正确的 master_log_file 和 master_log_pos主库当前日志位置再启动从库线程START SLAVE;。
六版本差异类
MySQL 5.X以 5.7 为代表与 8.0 在用户创建和授权上的核心区别主要源于 8.0 对权限管理逻辑的重构更严格的权限分离、默认加密升级等具体可从 4 个关键维度简单解释
1. 操作逻辑“创建用户” 与 “授权” 是否可合并 MySQL 5.X支持 “创建用户” 与 “授权” 合并为一条命令无需先单独创建用户。 示例直接通过授权语句自动创建用户若用户不存在 -- 5.X 支持创建 test 用户并授权无需提前 CREATE USER
GRANT SELECT ON db1.* TO testlocalhost IDENTIFIED BY 123456;MySQL 8.0强制 “先创建用户再授权”不允许通过 GRANT 直接创建用户IDENTIFIED BY 无法在 GRANT 中使用。 示例必须分两步执行 -- 8.0 必须先创建用户
CREATE USER testlocalhost IDENTIFIED BY 123456;
-- 再执行授权
GRANT SELECT ON db1.* TO testlocalhost;2. 默认认证插件密码加密方式不同 MySQL 5.X默认使用 mysql_native_password 插件密码加密算法较简单基于 SHA-1。 若需兼容旧客户端5.X 通常无需额外配置插件 MySQL 8.0默认使用 caching_sha2_password 插件密码加密算法更安全基于 SHA-256但可能存在旧客户端兼容问题如低版本 Navicat、JDBC 驱动。 若需兼容 5.X 客户端需手动指定旧插件 -- 8.0 创建兼容 5.X 的用户指定 mysql_native_password
CREATE USER testlocalhost IDENTIFIED WITH mysql_native_password BY 123456;3. 权限回收REVOKE 对 “隐式创建用户” 的处理 MySQL 5.X若用户是通过 GRANT 隐式创建的未手动 CREATE USER执行 REVOKE ALL 后用户会被自动删除因无独立用户记录。 MySQL 8.0因强制 “先创建用户”用户是独立存在的REVOKE 仅回收权限不会删除用户需单独执行 DROP USER 才能删除用户。
4. 角色功能官方角色支持差异 MySQL 5.X无官方 “角色” 功能无法创建角色并批量授权若需批量管理权限需手动维护相同权限的用户操作繁琐。 MySQL 8.0新增官方角色功能可创建角色、给角色授权再将角色赋予用户简化批量权限管理。 示例 -- 8.0 创建角色并授权
CREATE ROLE read_role; -- 创建角色
GRANT SELECT ON db1.* TO read_role; -- 给角色授权
GRANT read_role TO testlocalhost; -- 将角色赋予用户