direktori cari
目录 前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 1.8.6. MySQL处理约束的方式 2. 安装MySQL 2.1. 一般安装问题 2.1.1. MySQL支持的操作系统 2.1.2. 选择要安装的MySQL分发版 2.1.3. 怎样获得MySQL 2.1.4. 通过MD5校验和或GnuPG验证软件包的完整性 2.1.5. 安装布局 2.2. 使用二进制分发版的标准MySQL安装 2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL 2.3.4. 使用MySQL安装向导 2.3.5. 使用配置向导 2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7. 在其它类Unix系统中安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在Windows下从源码安装MySQL 2.8.7. 在Windows下编译MySQL客户端 2.9. 安装后的设置和测试 2.9.1. Windows下安装后的过程 2.9.2. Unix下安装后的过程 2.9.3. 使初始MySQL账户安全 2.10. 升级MySQL 2.10.1. 从5.0版升级 2.10.2. 升级授权表 2.10.3. 将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.12. 具体操作系统相关的注意事项 2.12.1. Linux注意事项 2.12.2. Mac OS X注意事项 2.12.3. Solaris注意事项 2.12.4. BSD注意事项 2.12.5. 其它Unix注意事项 2.12.6. OS/2注意事项 2.13. Perl安装注意事项 2.13.1. 在Unix中安装Perl 2.13.2. 在Windows下安装ActiveState Perl 2.13.3. 使用Perl DBI/DBD接口的问题 3. 教程 3.1. 连接与断开服务器 3.2. 输入查询 3.3. 创建并使用数据库 3.3.1. 创建并选择数据库 3.3.2. 创建表 3.3.3. 将数据装入表中 3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 NoName 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找所有未分发的孪生项 3.7.2. 显示孪生对状态的表 3.8. 与Apache一起使用MySQL 4. MySQL程序概述 4.1. MySQL程序概述 4.2. 调用MySQL程序 4.3. 指定程序选项 4.3.1. 在命令行上使用选项 4.3.2. 使用选项文件 4.3.3. 用环境变量指定选项 4.3.4. 使用选项设置程序变量 5. 数据库管理 5.1. MySQL服务器和服务器启动脚本 5.1.1. 服务器端脚本和实用工具概述 5.1.2. mysqld-max扩展MySQL服务器 5.1.3. mysqld_safe:MySQL服务器启动脚本 5.1.4. mysql.server:MySQL服务器启动脚本 5.1.5. mysqld_multi:管理多个MySQL服务器的程序 5.2. mysqlmanager:MySQL实例管理器 5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL服务器 5.3.1. mysqld命令行选项 5.3.2. SQL服务器模式 5.3.3. 服务器系统变量 5.3.4. 服务器状态变量 5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA LOCAL安全问题 5.7. MySQL访问权限系统 5.7.1. 权限系统的作用 5.7.2. 权限系统工作原理 5.7.3. MySQL提供的权限 5.7.4. 与MySQL服务器连接 5.7.5. 访问控制 5.7.6. 访问控制 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. MySQL服务器时区支持 5.11. MySQL日志文件 5.11.1. 错误日志 5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1. 复制介绍 6.2. 复制实施概述 6.3. 复制实施细节 6.3.1. 复制主线程状态 6.3.2. 复制从I/O线程状态 6.3.3. 复制从SQL线程状态 6.3.4. 复制传递和状态文件 6.4. 如何设置复制 6.5. 不同MySQL版本之间的复制兼容性 6.6. 升级复制设置 6.6.1. 将复制升级到5.0版 6.7. 复制特性和已知问题 6.8. 复制启动选项 6.9. 复制FAQ 6.10. 复制故障诊断与排除 6.11. 通报复制缺陷 6.12. 多服务器复制中的Auto-Increment 7. 优化 7.1. 优化概述 7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息) 7.2.2. 估计查询性能 7.2.3. SELECT查询的速度 7.2.4. MySQL怎样优化WHERE子句 7.2.5. 范围优化 7.2.6. 索引合并优化 7.2.7. MySQL如何优化IS NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它优化技巧 7.3. 锁定事宜 7.3.1. 锁定方法 7.3.2. 表锁定事宜 7.4. 优化数据库结构 7.4.1. 设计选择 7.4.2. 使你的数据尽可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM键高速缓冲 7.4.7. MyISAM索引统计集合 7.4.8. MySQL如何计算打开的表 7.4.9. MySQL如何打开和关闭表 7.4.10. 在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具概述 8.2. myisampack:生成压缩、只读MyISAM表 8.3. mysql:MySQL命令行工具 8.3.1. 选项 8.3.2. mysql命令 8.3.3. 怎样从文本文件执行SQL语句 8.3.4. mysql技巧 8.4. mysqlaccess:用于检查访问权限的客户端 8.5. mysqladmin:用于管理MySQL服务器的客户端 8.6. mysqlbinlog:用于处理二进制日志文件的实用工具 8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM日志文件内容 8.13. perror:解释错误代码 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1. 识别符限制条件 9.2.2. 识别符大小写敏感性 9.3. 用户变量 9.4. 系统变量 9.4.1. 结构式系统变量 9.5. 注释语法 9.6. MySQL中保留字的处理 10. 字符集支持 10.1. 常规字符集和校对 10.2. MySQL中的字符集和校对 10.3. 确定默认字符集和校对 10.3.1. 服务器字符集和校对 10.3.2. 数据库字符集和校对 10.3.3. 表字符集和校对 10.3.4. 列字符集和校对 10.3.5. 字符集和校对分配示例 10.3.6. 连接字符集和校对 10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 10.4. 字符集支持影响到的操作 10.4.1. 结果字符串 10.4.2. CONVERT() 10.4.3. CAST() 10.4.4. SHOW语句 10.5. Unicode支持 10.6. 用于元数据的UTF8 10.7. 与其它DBMS的兼容性 10.8. 新字符集配置文件格式 10.9. 国家特有字符集 10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 11.1. 列类型概述 11.1.1. 数值类型概述 11.1.2. 日期和时间类型概述 11.1.3. 字符串类型概述 11.2. 数值类型 11.3. 日期和时间类型 11.3.1. DATETIME、DATE和TIMESTAMP类型 11.3.2. TIME类型 11.3.3. YEAR类型 11.3.4. Y2K事宜和日期类型 11.4. String类型 11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 12. 函数和操作符 12.1. 操作符 12.1.1. 操作符优先级 12.1.2. 圆括号 12.1.3. 比较函数和操作符 12.1.4. 逻辑操作符 12.2. 控制流程函数 12.3. 字符串函数 12.3.1. 字符串比较函数 12.4. 数值函数 12.4.1. 算术操作符 12.4.2. 数学函数 12.5. 日期和时间函数 12.6. MySQL使用什么日历? 12.7. 全文搜索功能 12.7.1. 布尔全文搜索 12.7.2. 全文搜索带查询扩展 12.7.3. 全文停止字 12.7.4. 全文限定条件 12.7.5. 微调MySQL全文搜索 12.8. Cast函数和操作符 12.9. 其他函数 12.9.1. 位函数 12.9.2. 加密函数 12.9.3. 信息函数 12.9.4. 其他函数 NoName 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 13.1.5. CREATE TABLE语法 13.1.6. DROP DATABASE语法 13.1.7. DROP INDEX语法 13.1.8. DROP TABLE语法 13.1.9. RENAME TABLE语法 13.2. 数据操作语句 13.2.1. DELETE语法 13.2.2. DO语法 13.2.3. HANDLER语法 13.2.4. INSERT语法 13.2.5. LOAD DATA INFILE语法 13.2.6. REPLACE语法 13.2.7. SELECT语法 13.2.8. Subquery语法 13.2.9. TRUNCATE语法 13.2.10. UPDATE语法 13.3. MySQL实用工具语句 13.3.1. DESCRIBE语法(获取有关列的信息) 13.3.2. USE语法 13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制语句 13.6.1. 用于控制主服务器的SQL语句 13.6.2. 用于控制从服务器的SQL语句 13.7. 用于预处理语句的SQL语法 14. 插件式存储引擎体系结构 14.1. 前言 14.2. 概述 14.3. 公共MySQL数据库服务器层 14.4. 选择存储引擎 14.5. 将存储引擎指定给表 14.6. 存储引擎和事务 14.7. 插入存储引擎 14.8. 拔出存储引擎 14.9. 插件式存储器的安全含义 15. 存储引擎和表类型 15.1. MyISAM存储引擎 15.1.1. MyISAM启动选项 15.1.2. 键所需的空间 15.1.3. MyISAM表的存储格式 15.1.4. MyISAM表方面的问题 15.2. InnoDB存储引擎 15.2.1. InnoDB概述 15.2.2. InnoDB联系信息 15.2.3. InnoDB配置 15.2.4. InnoDB启动选项 15.2.5. 创建InnoDB表空间 15.2.6. 创建InnoDB表 15.2.7. 添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和索引结构 15.2.14. 文件空间管理和磁盘I/O 15.2.15. InnoDB错误处理 15.2.16. 对InnoDB表的限制 15.2.17. InnoDB故障诊断与排除 15.3. MERGE存储引擎 15.3.1. MERGE表方面的问题 15.4. MEMORY (HEAP)存储引擎 15.5. BDB (BerkeleyDB)存储引擎 15.5.1. BDB支持的操作系统 15.5.2. 安装BDB 15.5.3. BDB启动选项 15.5.4. BDB表的特性 15.5.5. 修改BDB所需的事宜 15.5.6. 对BDB表的限制 15.5.7. 使用BDB表时可能出现的错误 15.6. EXAMPLE存储引擎 15.7. FEDERATED存储引擎 15.7.1. 安装FEDERATED存储引擎 15.7.2. FEDERATED存储引擎介绍 15.7.3. 如何使用FEDERATED表 15.7.4. FEDERATED存储引擎的局限性 15.8. ARCHIVE存储引擎 15.9. CSV存储引擎 15.10. BLACKHOLE存储引擎 16. 编写自定义存储引擎 16.1. 前言 16.2. 概述 16.3. 创建存储引擎源文件 NoName 16.5. 对处理程序进行实例化处理 16.6. 定义表扩展 16.7. 创建表 16.8. 打开表 16.9. 实施基本的表扫描功能 16.9.1. 实施store_lock()函数 16.9.2. 实施external_lock()函数 16.9.3. 实施rnd_init()函数 16.9.4. 实施info()函数 16.9.5. 实施extra()函数 16.9.6. 实施rnd_next()函数 16.10. 关闭表 NoName NoName NoName 16.14. API引用 16.14.1. bas_ext 16.14.2. close 16.14.3. create 16.14.4. delete_row 16.14.5. delete_table 16.14.6. external_lock 16.14.7. extra 16.14.8. info 16.14.9. open 16.14.10. rnd_init 16.14.11. rnd_next 16.14.12. store_lock 16.14.13. update_row 16.14.14. write_row 17. MySQL簇 17.1. MySQL簇概述 17.2. MySQL簇的基本概念 17.3. 多计算机的简单基础知识 17.3.1. 硬件、软件和联网 17.3.2. 安装 17.3.3. 配置 17.3.4. 首次启动 17.3.5. 加载示例数据并执行查询 17.3.6. 安全关闭和重启 17.4. MySQL簇的配置 17.4.1. 从源码创建MySQL簇 17.4.2. 安装软件 17.4.3. MySQL簇的快速测试设置 17.4.4. 配置文件 17.5. MySQL簇中的进程管理 17.5.1. 用于MySQL簇的MySQL服务器进程使用 17.5.2. ndbd,存储引擎节点进程 17.5.3. ndb_mgmd,“管理服务器”进程 17.5.4. ndb_mgm,“管理客户端”进程 17.5.5. 用于MySQL簇进程的命令选项 17.6. MySQL簇的管理 17.6.1. MySQL簇的启动阶段 17.6.2. “管理客户端”中的命令 17.6.3. MySQL簇中生成的事件报告 17.6.4. 单用户模式 17.6.5. MySQL簇的联机备份 17.7. 使用与MySQL簇的高速互连 17.7.1. 配置MySQL簇以使用SCI套接字 17.7.2. 理解簇互连的影响 17.8. MySQL簇的已知限制 17.9. MySQL簇发展的重要历程 17.9.1. MySQL 5.0中的MySQL簇变化 17.9.2. 关于MySQL簇的MySQL 5.1发展历程 17.10. MySQL簇常见问题解答 17.11. MySQL簇术语表 18. 分区 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. KEY分区 18.2.5. 子分区 18.2.6. MySQL分区处理NULL值的方式 18.3. 分区管理 18.3.1. RANGE和LIST分区的管理 18.3.2. HASH和KEY分区的管理 18.3.3. 分区维护 18.3.4. 获取关于分区的信息 19. MySQL中的空间扩展 19.1. 前言 19.2. OpenGIS几何模型 19.2.1. Geometry类的层次 19.2.2. 类Geometry 19.2.3. 类Point 19.2.4. 类Curve 19.2.5. 类LineString 19.2.6. 类Surface 19.2.7. 类Polygon 19.2.8. 类GeometryCollection 19.2.9. 类MultiPoint 19.2.10. 类MultiCurve 19.2.11. 类MultiLineString 19.2.12. 类MultiSurface 19.2.13. 类MultiPolygon 19.3. 支持的空间数据格式 19.3.1. 著名的文本(WKT)格式 19.3.2. 著名的二进制(WKB)格式 19.4. 创建具备空间功能的MySQL数据库 19.4.1. MySQL空间数据类型 19.4.2. 创建空间值 19.4.3. 创建空间列 19.4.4. 填充空间列 19.4.5. 获取空间数据 19.5. 分析空间信息 19.5.1. Geometry格式转换函数 19.5.2. Geometry函数 19.5.3. 从已有Geometry创建新Geometry的函数 19.5.4. 测试几何对象间空间关系的函数 19.5.5. 关于几何最小边界矩形(MBR)的关系 19.5.6. 测试几何类之间空间关系的函数 19.6. 优化空间分析 19.6.1. 创建空间索引 19.6.2. 使用空间索引 19.7. MySQL的一致性和兼容性 19.7.1. 尚未实施的GIS特性 20. 存储程序和函数 20.1. 存储程序和授权表 20.2. 存储程序的语法 20.2.1. CREATE PROCEDURE和CREATE FUNCTION 20.2.2. ALTER PROCEDURE和ALTER FUNCTION 20.2.3. DROP PROCEDURE和DROP FUNCTION 20.2.4.SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION 20.2.5.SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS 20.2.6. CALL语句 20.2.7. BEGIN ... END复合语句 20.2.8. DECLARE语句 20.2.9. 存储程序中的变量 20.2.10. 条件和处理程序 20.2.11. 光标 20.2.12. 流程控制构造 20.3. 存储程序、函数、触发程序和复制:常见问题 20.4. 存储子程序和触发程序的二进制日志功能 21. 触发程序 21.1. CREATE TRIGGER语法 21.2. DROP TRIGGER语法 21.3. 使用触发程序 22. 视图 22.1. ALTER VIEW语法 22.2. CREATE VIEW语法 22.3. DROP VIEW语法 22.4. SHOW CREATE VIEW语法 23. INFORMATION_SCHEMA信息数据库 23.1. INFORMATION_SCHEMA表 23.1.1. INFORMATION_SCHEMA SCHEMATA表 23.1.2. INFORMATION_SCHEMA TABLES表 23.1.3. INFORMATION_SCHEMA COLUMNS表 23.1.4. INFORMATION_SCHEMA STATISTICS表 23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表 23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表 23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表 23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表 23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表 23.1.10. INFORMATION_SCHEMA COLLATIONS表 23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表 23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表 23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表 23.1.14. INFORMATION_SCHEMA ROUTINES表 23.1.15. INFORMATION_SCHEMA VIEWS表 23.1.16. INFORMATION_SCHEMA TRIGGERS表 23.1.17. 其他INFORMATION_SCHEMA表 NoName 24. 精度数学 24.1. 数值的类型 24.2. DECIMAL数据类型更改 24.3. 表达式处理 24.4. 四舍五入 24.5. 精度数学示例 25. API和库 25.1. libmysqld,嵌入式MySQL服务器库 25.1.1. 嵌入式MySQL服务器库概述 25.1.2. 使用libmysqld编译程序 25.1.3. 使用嵌入式MySQL服务器时的限制 25.1.4. 与嵌入式服务器一起使用的选项 25.1.5. 嵌入式服务器中尚需完成的事项(TODO) 25.1.6. 嵌入式服务器示例 25.1.7. 嵌入式服务器的许可 25.2. MySQL C API 25.2.1. C API数据类型 25.2.2. C API函数概述 25.2.3. C API函数描述 25.2.4. C API预处理语句 25.2.5. C API预处理语句的数据类型 25.2.6. C API预处理语句函数概述 25.2.7. C API预处理语句函数描述 25.2.8. C API预处理语句方面的问题 25.2.9. 多查询执行的C API处理 25.2.10. 日期和时间值的C API处理 25.2.11. C API线程函数介绍 25.2.12. C API嵌入式服务器函数介绍 25.2.13. 使用C API时的常见问题 25.2.14. 创建客户端程序 25.2.15. 如何生成线程式客户端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常见问题 25.4. MySQL Perl API 25.5. MySQL C++ API 25.5.1. Borland C++ 25.6. MySQL Python API 25.7. MySQL Tcl API 25.8. MySQL Eiffel Wrapper 25.9. MySQL程序开发实用工具 25.9.1. msql2mysql:转换mSQL程序以用于MySQL 25.9.2. mysql_config:获取编译客户端的编译选项 26. 连接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介绍 26.1.2. 关于ODBC和MyODBC的一般信息 26.1.3. 如何安装MyODBC 26.1.4. 在Windows平台上从二进制版本安装MyODBC 26.1.5. I在Unix平台上从二进制版本安装MyODBC 26.1.6. 在Windows平台上从源码版本安装MyODBC 26.1.7. 在Unix平台上从源码版本安装MyODBC 26.1.8. 从BitKeeper开发源码树安装MyODBC 26.1.9. MyODBC配置 26.1.10. 与MyODBC连接相关的事宜 26.1.11. MyODBC和Microsoft Access 26.1.12. MyODBC和Microsoft VBA及ASP 26.1.13. MyODBC和第三方ODBC工具 26.1.14. MyODBC通用功能 26.1.15. 基本的MyODBC应用步骤 26.1.16. MyODBC API引用 26.1.17. MyODBC数据类型 26.1.18. MyODBC错误代码 26.1.19. MyODBC与VB:ADO、DAO和RDO 26.1.20. MyODBC与Microsoft.NET 26.1.21. 感谢 26.2. MySQL Connector/NET 26.2.1. 前言 26.2.2. 下载并安装MySQL Connector/NET 26.2.3. Connector/NET体系结构 26.2.4. 使用MySQL Connector/NET 26.2.5. MySQL Connector/NET变更史 26.3. MySQL Connector/J 26.3.1. 基本的JDBC概念 26.3.2. 安装 Connector/J 26.3.3. JDBC引用 26.3.4. 与J2EE和其他Java框架一起使用 Connector/J 26.3.5. 诊断 Connector/J方面的问题 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.4.1. 前言 26.4.2. 支持平台: 26.4.3. Junit测试要求 26.4.4. 运行Junit测试 26.4.5. 作为JDBC驱动程序的一部分运行 26.4.6. 在Java对象中运行 26.4.7. MysqldResource API 26.4.8. 在JMX代理(custom)中运行 26.4.9. 部署在标准的JMX代理环境下 (JBoss) 26.4.10. 安装 27. 扩展MySQL 27.1. MySQL内部控件 27.1.1. MySQL线程 27.1.2. MySQL测试套件 27.2. 为MySQL添加新函数 27.2.1. 自定义函数接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION语法 27.2.3. 添加新的自定义函数 27.2.4. 添加新的固有函数 27.3. 为MySQL添加新步骤 27.3.1. 步骤分析 27.3.2. 编写步骤 A. 问题和常见错误 A.1. 如何确定导致问题的原因 A.2. 使用MySQL程序时的常见错误 A.2.1. 拒绝访问 A.2.2. 无法连接到[local] MySQL服务器 A.2.3. 客户端不支持鉴定协议 A.2.4. 输入密码时出现密码错误 NoName A.2.6. 连接数过多 A.2.7. 内存溢出 A.2.8. MySQL服务器不可用 A.2.9. 信息包过大 A.2.10. 通信错误和失效连接 A.2.11. 表已满 A.2.12. 无法创建文件/写入文件 A.2.13. 命令不同步 A.2.14. 忽略用户 A.2.15. 表tbl_name不存在 A.2.16. 无法初始化字符集 A.2.17. 文件未找到 A.3. 与安装有关的事宜 A.3.1. 与MySQL客户端库的链接问题 A.3.2. 如何以普通用户身份运行MySQL A.3.3. 与文件许可有关的问题 A.4. 与管理有关的事宜 A.4.1. 如何复位根用户密码 A.4.2. 如果MySQL依然崩溃,应作些什么 A.4.3. MySQL处理磁盘满的方式 A.4.4. MySQL将临时文件储存在哪里 A.4.5. 如何保护或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 时区问题 A.5. 与查询有关的事宜 A.5.1. 搜索中的大小写敏感性 A.5.2. 使用DATE列方面的问题 A.5.3. 与NULL值有关的问题 A.5.4. 与列别名有关的问题 A.5.5. 非事务表回滚失败 A.5.6. 从相关表删除行 A.5.7. 解决与不匹配行有关的问题 A.5.8. 与浮点比较有关的问题 A.6. 与优化器有关的事宜 A.7. 与表定义有关的事宜 A.7.1. 与ALTER TABLE有关的问题 A.7.2. 如何更改表中的列顺序 A.7.3. TEMPORARY TABLE问题 A.8. MySQL中的已知事宜 A.8.1. MySQL中的打开事宜 B. 错误代码和消息 B.1. 服务器错误代码和消息 B.2. 客户端错误代码和消息 C. 感谢 C.1. MySQL AB处的开发人 C.2. MySQL贡献人 C.3. 资料员和译员 C.4. MySQL使用和包含的库 C.5. 支持MySQL的软件包 C.6. 用于创建MySQL的工具 C.7. MySQL支持人员 D. MySQL变更史 D.1. 5.1.x版中的变更情况(开发) D.1.1. 5.1.2版中的变更情况(尚未发布) D.1.2. 5.1.1版中的变更情况(尚未发布) D.2. MyODBC的变更情况 D.2.1. MyODBC 3.51.12的变更情况 D.2.2. MyODBC 3.51.11的变更情况 E. 移植到其他系统 E.1. 调试MySQL服务器 E.1.1. 针对调试编译MySQL E.1.2. 创建跟踪文件 E.1.3. 在gdb环境下调试mysqld E.1.4. 使用堆栈跟踪 E.1.5. 使用日志文件找出mysqld中的错误原因 E.1.6. 如果出现表崩溃,请生成测试案例 E.2. 调试MySQL客户端 E.3. DBUG软件包 E.4. 关于RTS线程的注释 E.5. 线程软件包之间的差异 F. 环境变量 G. MySQL正则表达式 H. MySQL中的限制 H.1. 联合的限制 I. 特性限制 I.1. 对存储子程序和触发程序的限制 I.2. 对服务器端光标的限制 I.3. 对子查询的限制 I.4. 对视图的限制 I.5. 对XA事务的限制 J. GNU通用公共许可 K. MySQL FLOSS许可例外 索引
watak

附录E:移植到其它系统

目录

E.1. 调试MySQL服务器
E.1.1. 针对调试编译MySQL
E.1.2. 创建跟踪文件
E.1.3. 在gdb环境下调试mysqld
E.1.4. 使用堆栈跟踪
E.1.5. 使用日志文件找出mysqld出错原因
E.1.6. 如果出现表格崩溃,请生成测试案例
E.2. 测试MySQL 客户端
E.3. DBUG 软件包
E.4. 关于RTS线程的注释
E.5. 线程软件包之间的差异

这个附录帮助你把MySQL移植到其它操作系统。请先查看一下当前支持操作系统列表。请参阅2.1.1节,“MySQL支持的操作系统”。如果你创建了一个新的MySQL移植(移植到列表上没有的操作系统),请通知我们,以便我们能把这个操作系统列到我们网站上(http://www.mysql.com/),推荐给其它的用户。

注意:如果你创建一个新的MySQL移植,你可以在GPL许可证下任意复制和发布它,但这不能使你成为MySQL的版权持有者。

这个服务器需要一个正在工作的POSIX 线程库在。在Solaris 2.5 上我们使用Sun PThreads (在2.4版和更早的版本上,原生线程支持得不是很好),在Linux上,我们使用Xavier Leroy<Xavier.Leroy@inria.fr>的LinuxThreads。

对于那些对原生线程支持不好的新Unix变体,移植到其上的艰难部分大概就是移植MIT-pthreads包。请参阅mit-pthreads/README 和Programming POSIX Threads (http://www.humanfactor.com/pthreads/)。

直到MySQL 4.0.2版,MySQL发布包包括来自MIT经过补丁的Chris Provenzano的Pthreads(请参阅MIT Pthreads 网页http://www.mit.edu/afs/sipb/project/pthreads/ 以及http://www.mit.edu:8001/people/proven/IAP_2000/上的编程指导)。对于某些没有POSIX线程的操作系统可能有用。请参阅2.8.5节,“MIT-pthreads 注意事项”。

也可能会用到另一个名为 FSU Pthreads的用户级线程软件包(请参阅http://moss.csc.ncsu.edu/~mueller/pthreads/)。 这个工具被用来到SCO的移植。

参阅 mysys目录下的thr_lock.c 和thr_alarm.c 程序获取一些关于这些问题的测试/例子。

服务器和客户端需要一个能用的C++编译器。我们在很多平台上使用gcc。其它编译器,据了解,可用的编译器是SPARCworks, Sun Forte, Irix cc, HP-UX aCC, IBM AIX xlC_r), Intel ecc/icc 和 Compaq cxx)。

要仅编译客户端,请使用./configure --without-server.

现在不支持仅编译服务器,也不能加这个功能,除非有人找出一个好的理由。

如果你想/需要改变任何Makefile 或配置脚本,你也会需要到GNU Automake 和 Autoconf。请参阅2.8.3节 ,“从开发源树安装”。

所有步骤需要从最基本的文件重新生成(remake)所有东西。

/bin/rm */.deps/*.P
/bin/rm -f config.cache
aclocal
autoheader
aclocal
automake
autoconf
./configure --with-debug=full --prefix='your installation directory'

# The makefiles generated above need GNU make 3.75 or newer.
# (called gmake below)
gmake clean all install init-db

如果在新移植MySQL上遇到问题,最好做一些调试!请参阅E.1节,“调试MySQL服务器”。

注意:在你开始调试mysqld之前,首先要让测试程序mysys/thr_alarmmysys/thr_lock工作。这会确保你的线程安装只有非常小的机会能运行!

E.1. 调试MySQL服务器

E.1.1. 为调试编译MySQL
E.1.2. 创建追踪文件
E.1.3. 在gdb环境下调试
E.1.4. 使用堆栈跟踪
E.1.5. 使用日志文件找出mysqld错误原因
E.1.6. 如果发生表崩溃则做一个测试案例

如果你使用MySQL某些非常新的功能,你可以带--skip-new参数(这个选项禁止掉所有新的潜在不安全的功能)或带 --safe-mode参数(它禁止掉很多可能导致问题的优化设置)来运行mysqld 请参阅A.4.2节,“如果MySQL依旧崩溃,应该做什么”。

如果 mysqld 不启动,你应该查证有没有干扰你的设置的my.cnf文件。你可以用mysqld --print-defaults...检查my.cnf参量,并用mysqld --no-defaults来启动去避免它们。

如果mysqld 启动耗尽CPU或内存资源,或者它“挂”了起来,你可以使用 mysqladmin processlist status去找出是否有人执行了一个占用很长时间的查询。如果你正面临着性能问题或新客户端不能连 之时的问题,在某些窗口中运行mysqladmin -i10 processlist status可能是一个好主意。

mysqladmin debug 命令把一些有关使用中的锁,使用的内存以及查询使用的信息转储到MySQL日志文件里。这将有助于解决一些问题。即使你没有为调试编译MySQL,这个命令也提供一些有用的信息!

如果问题是一些表变得越来越慢,你应该试着用PTIMIZE TABLE或myisamchk优化表。I请参阅第5章:数据库管理 。你也可以用EXPLAIN检查慢 的查询。 

对那些于你的环境是独特的问题,你也应该查阅这个手册里OS规格的部分请参阅 2.12节,“操作系统系统的注意事项”。

E.1.1. 针对调试编译MySQL

如果你遇到一些非常明确的问题,你可以总是试着调试MySQL。要调试MySQL,你必须用--with-debug或--with-debug=full选项来配置MySQL。你可以检查MySQL是否是通过mysqld --help来和调试一起编译的。如果--debug标记和选项一起被列出了,你就可以调试了。在这种情况mysqladmin ver下把mysqld版本列成mysql ... --debug

如果你使用gccegcs,推荐的configure 行如下:

CC=gcc CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors \
   -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \
   --with-debug --with-extra-charsets=complex

这避免了libstdc++库和C++异常(很多编译器在线程代码里有C++异常的问题)的问题,并编译了一个支持所有字符集的MySQL版本。

如果你怀疑内存溢出错误,你可以用--with-debug=full来配置MySQL,这会安装一个内存分配(SAFEMALLOC)检查器。可是,运行SAFEMALLOC是非常慢的,所以如果你遇到性能上的问题,你应该 用--skip-safemalloc选项启动mysqld。这样禁止掉对调用malloc()和free()的内存检查。

当你用--with-debug编译mysqld时,如果它不再崩溃,你大致已经在MySQL内找到一个编译器缺陷或计时缺陷。这种情况下,你可以试着把-g加到上面的CFLAGSCXXFLAGS变量,并且不使用--with-debug。如果mysqld失败,你至少可以gdb用附着上它或使用核心文件上的gdb去找出发生什么问题。

当你为调试配置MySQL时,你就自动允许许多额外的监视mysqld健康的安全检查函数。如果它们发现一些“不期望”的事,会写一个条目到stderr,safe_mysqld指引这个stderr到错误日志!这也意味着如果MySQL发生什么意外的问题,并且你正使用一个源文件发布版本,那么你要做的第一件事就是去为调试配置MySQL!(第二件事是发邮件到MySQL邮件列表请求帮助)。请参阅1.7.1.1节,“MySQL邮件列表”。请根据你使用的MySQL版本对所有缺陷报告或问题使用mysqlbug脚本!

在Windows MySQL发布包里,mysqld.exe默认编译为支持追踪文件。

E.1.2. 创建跟踪文件

如果mysqld 服务器没有启动或者你可以快速地使其崩溃,你可以创建一个跟踪文件来找出问题。

要这么做的话,你必须有一个编译了支持调试的mysqld 你可以通过执行mysqld -V来检查一下。如果版本号后面跟着-debug,它就是被编译成支持跟踪文件。(在 Windows中,调试服务器被命名为mysqld-debug 而不是象MySQL 4.1 那样的mysqld )。

如下命令,启动带跟踪文件的 mysqld 服务器,跟踪文件位于Unix上的/tmp/mysqld.trace目录里,Windows上 的C:\mysqld.trace目录里:

shell> mysqld --debug

在Windows上,你也可以使用--standalone参数,启动mysqld让它不作为服务。在控制台窗口,使用这个命令:

C:\> mysqld-debug --debug --standalone

完毕之后,你可以使用第二个窗口中的 mysql.exe 命令行工具重新制造问题。你可以用mysqladmin shutdown命令停止mysqld服务器。

注意,跟踪文件会变得很大!如果你想生成一个小一点的跟踪文件,你可以使用类似这样的调制选项:

mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace

这样就仅把带最感兴趣标记的信息写进跟踪文件里.

如果你生成一个有关于此的缺陷报告,请只用把跟踪文件中的相关行发送到恰当的邮件列表去,那里关注你报告出问题的部分。如果你不能找出哪里出问题,你可以ftp上载整个跟踪文件到ftp://ftp.mysql.com/pub/mysql/upload/,并附有完全的缺陷报告,MySQL开发人员会看到它的。

追踪文件是由Fred Fish用DBUG软件包生成的,请参阅E.3节,“DBUG软件包”。

E.1.3. 在gdb环境下调试mysqld

如果mysqld崩溃了,在大多数系统上,你也可是从gdb启动mysqld来获取更多信息。

Linux上,有一些老版本的gdb,如果你想要能调试mysqld线程,你必须使用run --one-threadsome。在这种情况下,你可以一次只激活一个线程。我们推荐你升级到gdb 5.1 ASAP ,这个版本上线程调试工作得更好!

NTPL 线程(Linux上的新线程库)可能会在gdb下运行mysqld时遇到问题。一些症状如下:

  • mysqld 在启动过程中挂起(在它写ready for connections之前)。

  • mysqld 在调用pthread_mutex_lock()或pthread_mutex_unlock()过程中崩溃。

在这种情况下你应该在启动gdb之前在外壳上设置如下环境变量:

LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL

gdb下运行mysqld时,你应该用--skip-stack-trace来禁止堆栈跟踪,以便能捕获gdb内的段错误。

在MySQL 4.0.14和以上版本,你应该对mysqld使用--gdb选项。 这会为SIGINT安装一个中断处理器(需要用^C停止mysqld来设置断点),并且禁止堆栈跟踪和核心文件处理。

gdb没有给旧线程释放内存的整个时间里,如果你做了大量的新连接,在gdb下调试MySQL是非常困难的。你可以通过带 -O thread_cache_size= 'max_connections +1' 启动mysqld 来避免这个问题。在多数情况下,只使用-O thread_cache_size=5'就受益无穷了!

如果mysqld带着SIGSEGV信号死掉了,而你想在Linux上转储核心,你可以带--core-file选项启动mysqld。这个核心文件可以被用来生成 向后跟踪,它可以帮你找出mysqld 为何死掉:

shell> gdb mysqld core
gdb>   backtrace full
gdb>   exit

请参阅A.4.2节,“如果MySQL依旧崩溃,该如何去做”。

如果你在Linux上使用gdb 4.17.x 或以上版本,你应该安装一个带有如下信息的 .gdb 文件到你当前目录:

set print sevenbit off
handle SIGUSR1 nostop noprint
handle SIGUSR2 nostop noprint
handle SIGWAITING nostop noprint
handle SIGLWP nostop noprint
handle SIGPIPE nostop
handle SIGALRM nostop
handle SIGHUP nostop
handle SIGTERM nostop noprint

如果你用gdb调试线程遇到问题,你应该下载gdb 5.x版本并用它试一下调试。新版本的 gdb 大大改善了线程处理!

下面是如何调试mysqld的例子:

shell> gdb /usr/local/libexec/mysqld
gdb> run
...
backtrace full # Do this when mysqld crashes

把上面的输入写进一个用mysqlbug生成的邮件里,发送到综合MySQL邮件列表。请参阅1.7.1.1节,“MySQL 邮件列表”。

如果mysqld 挂起,你可以试着用一些诸如strace 或 /usr/proc/bin/pstack 这样的系统工具连检查mysqld 在哪里挂起。

strace /tmp/log libexec/mysqld

如果你使用 Perl DBI 接口,你可以使用trace方法或设置DBI_TRACE环境变量来打开调试信息。

E.1.4. 使用堆栈跟踪

在一些操作系统上,如果mysqld意外死掉,错误日志包含一个堆栈跟踪。你可以用它来找出mysqld 在哪里(也许可能找出为什么)死掉。请参阅5.11.1节,“错误日志”。要获得堆栈跟踪,你不能用-fomit-frame-pointer 选项编译mysqld 为gcc。 请参阅E.1.1节,“针对调试编译MySQL”。

如果错误文件包含类似下面的一些内容:

mysqld got signal 11;
The manual section 'Debugging a MySQL server' tells you how to use a
stack trace and/or the core file to produce a readable backtrace that may
help in finding out why mysqld died
Attempting backtrace. You can use the following information to find out
where mysqld died.  If you see no messages after this, something went
terribly wrong...
stack range sanity check, ok, backtrace follows
0x40077552
0x81281a0
0x8128f47
0x8127be0
0x8127995
0x8104947
0x80ff28f
0x810131b
0x80ee4bc
0x80c3c91
0x80c6b43
0x80c1fd9
0x80c1686

你可以使用如下步骤找出mysqld在什么地方出现问题:

  1. 复制前面的数字到一个文件,如mysqld.stack。

  2. mysqld 服务器生成符号文件:

    nm -n libexec/mysqld > /tmp/mysqld.sym
    

    注意,多数MySQL二进制发布包("debug" 软件包,包含这些信息的地方就在二进制发布包本身之内)带上述文件,在其中这些文件名为mysqld.sym.gz。在这种情况下,你可以简单地解压缩它:

    gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym
    
  3. 执行 resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack.

    这个命令会打印出mysqld死在哪里。如果这个不能帮你找出mysqld为什么死掉,你应该生成一个缺陷报告,并在缺陷报告里包含上述命令的输出结果。

    注意,尽管在多数情况下,仅有一个堆栈跟踪不能帮助我们找出问题的原因。为了定位缺陷或找到一个大致范围,我们在大多数情况下需要知道杀掉mysqld的查询,并最好知道一个测试案例 ,以便我们能重复问题!请参阅1.7.1.3节,“如何报告缺陷和问题”。

E.1.5. 使用日志文件找出mysqld中的错误原因

注意,在带--log选项启动 mysqld之前,你应该用myisamchk检查所有的表。请参阅第5章:数据库管理 .

如果 mysqld 死了或挂起,你应该用--log启动 mysqld 。当mysqld 再次死掉时,你可以检查日志文件的最后,找出杀掉mysqld的查询。

如果你不带文件名使用 --log ,日志被保存在名为host_name.log的数据库目录里。在多数情况下,日志文件中的最后一个查询杀掉mysqld,但如果有可能,你应该重启mysqld并从mysq命令行工具执行找到的查询来验证一下。如果这个查询杀掉了mysqld,你也应该测试所有没有完成的复杂查询

你也可以在所有占用长时间的SELECT声明上用命令EXPLAIN来确认 mysqld正适当地使用索引。请参阅7.2.1节,“EXPLAIN 语法(获得关于SELECT的信息)”。

你可以带 --log-slow-queries启动mysqld来找出占用长时间来执行的查询。请参阅5.11.4节 ,“缓慢查询日志”。

如果你在错误日志文件(通常名为hostname.err)中发现 mysqld restarted 字样,你大致已经找到导致mysqld的查询。如果发生这种情况,你应该用myisamchk检查所有表(参阅 第5章:数据库管理 ),并在MySQL日志文件中测试这些查询看是否有不执行的。如果找到这样一个查询,试着升级到最新的MySQL版本。如果这样不能帮助你,你不能在mysql邮件存档中发现任何相关内容,你应该把缺陷报告给MySQL邮件列表。邮件列表在http://lists.mysql.com/订阅,这个地址上也有连到在线列表存档的链接。

如果你已经用myisam-recover启动了mysqld,MySQL自动检查并试着修复MyISAM 表,看是否它们被标志为“未正常关闭”或“崩溃”。如果发生这种情况,MySQL在文件hostname.err 写一个条目'Warning: Checking table ...',后面跟着警告:如果表需要修复,请修复它。如果你遇上大量的这些错误而mysqld没有意外死掉,那就是有问题了,需要进一步调查。请参阅5.3.1节,“mysqld命令行选项”。

如果mysqld意外死掉,这可不是一个好兆头,但在这种情况下不用研究Checking table...信息,而是要找出mysqld为什么死掉。

E.1.6. 如果出现表崩溃,请生成测试案例

如果在一些更新命令之后,mysqld总是当掉,或者如果你遇到被破坏的表,你可以用下面的操作测试看这个缺陷是否是可重复产生的:

  • 卸掉MySQL守护进程(用mysqladmin shutdown)。

  • 给该表做备份(防止修复操作反而搞坏这种很不可能出现的情况)。

  • myisamchk -s database/*.MYI 检查所有的表,用myisamchk -r database/table.MYI修理有错误的表。

  • 对该表做第二次备份。

  • 如果需要更多的空间就从MySQL数据库目录删除(或移走)旧日志文件。

  • 带--log-bin启动Start mysqld 。请参阅5.11.3节,“二进制日志”。如果你想找出搞mysqld的查询,你应该使用use --log --log-bin。

  • 当你已经遭遇一个被破坏的表时,请停止mysqld server 。

  • 还原备份。

  • 不带--log-bin重启动mysqld 服务器。 

  • 重新执行mysqlbinlog update-log-file | mysql命令。更新的日志用名字hostname-bin.#保存在MySQL数据库目录下。

  • 如果该表再次被破坏,或者你可用上诉命令让mysqld 死掉,你就已经找到可重复产生的缺陷,它应该很容易被修复!可以ftp上传表和二进制日志到 ftp://ftp.mysql.com/pub/mysql/upload/ 然后把它输入我们在 http://bugs.mysql.com/上的缺陷系统。(请注意,/pub/mysql/upload/ 在FTP时是不可以列出(内容)的,所以不能在FTP客户端看见你已经上载的东西。)如果你是一个支持客户,你可以使用 MySQL客户支持中心https://support.mysql.com/ 来 提醒MySQL 技术人员这个问题,让这个问题尽快得到解决。

如果你想缩小问题的范围,你也可以使用 mysql_find_rows脚本来只执行一些 更新语句。

E.2. 调试MySQL客户端

为能够用集成的调试软件包调试MySQL客户端 ,你应该用--with-debug或--with-debug=full配置MySQL。请参阅2.8.2节,“典型的配置选项”。

在运行客户端之前,你应该设置 MYSQL_DEBUG环境变量:

shell> MYSQL_DEBUG=d:t:O,/tmp/client.trace
shell> export MYSQL_DEBUG

这会导致客户端在 /tmp/client.trace目录产生一个跟踪文件。

如果你自己的客户端代码有问题,你应该试着连接到服务器,用已知可用的客户端运行你的查询。在调试模式下,按下面命令运行(假设你已经带调试编译了MySQL):

shell> mysql --debug=d:t:O,/tmp/client.trace

万一你要发送一个缺陷报告邮件,这会提供给你有用的信息。请查阅“如何报告缺陷或问题”。

如果你的客户端在一些看起来合法的代码处崩溃了,你应该检查你的mysql.h文件是否包括匹配你的MySQL库文件。一个常见的错误就是用新的版本的MySQL库使用一个来自老版本安装的mysql.h文件。

E.3. DBUG软件包

MySQL服务器和多数MySQL客户端都带着由Fred Fish初创的DBUG 软件包编译成的。当你为调试配置MytSQL之时,这个软件使你可以得到一个程序正在调试什么的跟踪文件。请参阅E.1.2节,“创建跟踪文件”。

这一节总结了你对已建立支持调试的MySQL程序在命令行的调试选项处可以指定的参量值。要获取更多使用DBUG软件包来编程的信息,请参阅MySQL源发布包里dbug目录下的DBUG手册。最好使用最近的MySQL 5.1发布包以获得最近更新的DBUG手册。

你通过用--debug="..."或the -#... 选项调用一个程序来使用调试软件包。

多数MySQL程序有默认的调试字符串,如果你不给--debug指定一个选项,就使用这个默认的。默认的跟踪文件通常是/tmp/program_name.trace(在Unix上)和program_name.trace (在Windows上)。

调试字符串是一系列冒号隔开的区段,如下:

<field_1>:<field_2>:...:<field_N>

每个区段包含一个强制标志字符,后面跟着已和可选的 ‘,’ 以及一列用逗号隔开的修改量:

flag[,modifier,modifier,...,modifier]

当前被识别的标记符号是:

标记 描述
d 允许对当前状态从DBUG_<N>宏输出。可能跟着一列关键词,这些关键词仅对那些带有关键词的DBUG宏选择输出。一个空的关键词列意味着对所有宏输出。
D 在每个调试起输出行后延迟。参量一个十分之一秒为单位来延迟的数,它受限于机器的能力。比如 -#D,20 指定一个2秒的延迟。
f 限制调试和/或跟踪,以及简单设定于列出名字的函数。注意,空列将禁止所用函数。应该给出适当的d 或 t 标记,如果它们被允许了,这个标记仅限制它们的动作。
F 对调试或跟踪输出的每一行识别源文件名。
i 对调试或跟踪输出的每一行用PID或线程ID识别进程。
g 允许解析,创建名为的dbugmon.out文件,它包含可用来简单设定程序的信息。可能跟着一列关键词,它们是选择只对列中的函数做简单设定。一个空列意味着所有函数都要考虑到。
L 为调试或跟踪输出的每一行识别源文件行号。
n 为调试或跟踪输出的每一行打印当前函数嵌套深度。
N 给调试输出的每一行编号。
o 重定向调试器输出流到指定文件。默认输出是stderr 文件。
O 类似于 o,但是文件在每次写操作之间被冲刷。当需要之时,文件在每次写操作之间被关闭然后重新打开。
p 限制调试器作用于指定进程。为使调试器动作,一个进程必须用DBUG_PROCESS宏来识别,且匹配列表中的一个。
P 为调试或跟踪输出的每一行打印当前进程名字。
r 当推出一个新状态时,不继承前状态的操作嵌套深度级别。当输出在左边空白开始时有用。
S 在每个调试过的函数做_sanity(_file_,_line_)函数直到 _sanity() 返回不同于0的结果。(大多数的时候与safemalloc 一起用来找出内存漏洞)。
t 允许函数调用/退出跟踪行。可能跟着一个给出最大跟踪级别的数字列(只含一个修改量),超过这个数字,调试中或跟踪中的宏不能产生任何输出。 默认为一个编译时间选项。

可能出现在外壳命令行(-# 典型地被用来引入一个控制字符串到一个应用程序中) 的调试控制字符串的一些例子如下:

-#d:t
-#d:f,main,subr1:F:L:t,20
-#d,input,output,files:n
-#d:t:i:O,\\mysqld.trace

在MySQL中, 打印的一般标记是(用 d 选项)是 enter, exit, error, warning, info, 和 loop 。

E.4. 关于RTS线程的注释

我曾尝试让MySQL使用RTS线程软件包,但是在下面的问题上遇到阻碍:

RTS线程软件包很多老版本的POSIX调用,对所有函数的写封装就很枯燥。我倾向于认为把线程库换成最新的POSIX规格,会更容易些。。

一些封装正在编写中。更多信息请参阅mysys/my_pthread.c 文件。

至少下面说道的应该改变一下:

pthread_get_specific该使用一个参量。 sigwait应该使用两个参量。很多函数(至少pthread_cond_wait, pthread_cond_timedwait())应该返回错误的错误代码。现在它们返回 -1 且设置 errno。

另一个问题是,用户级线程使用ALRM信号,这会终止很多函数(read, write, open...)。MySQL应该重试一下所有这上面的中断,但是这并非很容易去验证。

最大的未解决问题如下:

要获得线程级警报,我使用pthread_cond_timedwait()改变 mysys/thr_alarm.c,让它在警报之间等待。但是它发生EINTR错误,终止了。我试着调试线程库找出为什么会出这个错误,但是找不到一个简便 的解决办法。

如果人人想要用RTS线程跑一下MySQL,我建议以下几点:

  • 把MySQL使用的函数从线程库变到POSIX。这不会占据那么长时间。

  • 用-DHAVE_rts_threads编译所有库。

  • 编译thr_alarm。

  • 若在执行中有一些小的差异,可以改变my_pthread.h和my_pthread.c来修复它们。

  • 运行thr_alarm。如果它没有任何警告,错误或终止信息地运行,你就做对了。这里是一个在Solaris成功运行的例子:

    Main thread: 1
    Thread 0 (5) started
    Thread: 5  Waiting
    process_alarm
    Thread 1 (6) started
    Thread: 6  Waiting
    process_alarm
    process_alarm
    thread_alarm
    Thread: 6  Slept for 1 (1) sec
    Thread: 6  Waiting
    process_alarm
    process_alarm
    thread_alarm
    Thread: 6  Slept for 2 (2) sec
    Thread: 6  Simulation of no alarm needed
    Thread: 6  Slept for 0 (3) sec
    Thread: 6  Waiting
    process_alarm
    process_alarm
    thread_alarm
    Thread: 6  Slept for 4 (4) sec
    Thread: 6  Waiting
    process_alarm
    thread_alarm
    Thread: 5  Slept for 10 (10) sec
    Thread: 5  Waiting
    process_alarm
    process_alarm
    thread_alarm
    Thread: 6  Slept for 5 (5) sec
    Thread: 6  Waiting
    process_alarm
    process_alarm
    
    ...
    thread_alarm
    Thread: 5  Slept for 0 (1) sec
    end
    

E.5. 线程软件包之间的差异

MySQL非常依赖使用中的线程软件包。 所以当为MySQL选择一个好平台的时候,线程软件包就非常重要。

至少有三种线程软件包:

  • 用户线程在单个进程中。线程切换用警报管理,线程库用锁管理所有非线程安全函数。读,写和选择操作通常被线程专有的切换器管理, 如果运行中的线程要等待数据,这个切换器就会切换操作到另一个线程。如果用户线程软件包集成在标准库(FreeBSD 和 BSDI 线程软件包)里,这样的 线程软件包比那些不得不映射所有不安全调用(MIT-pthreads, FSU Pthreads 和 RTS 线程软件包)的线程软件包需要更少的系统开销。在某些环境下(如SCO),所有系统调用都是线程安全的,所以映射非常容易(SCO上的FSU Pthreads包)。不足之处是:所有映射的调用占用很少的时间,于是想要能处理所有的情况就相当繁杂。有一些系统调用通常不被线程软件包(类似MIT-pthreads and sockets包)处理。线程计划不总是最优化的。

  • 在分离进程中的用户线程。线程切换是由内核来做,且所有的数据在线程之间共享。线程软件包管理标准线程调用,允许在线程之间共享数据。LinuxThreads包就使用这种方法。不足之处:太多进程。线程创建得慢,如果一个线程死掉了,其余得线程通常就挂起来,你必须在重启之前杀掉这些挂起的线程。线程切换开销有些大。

  • 内核线程。线程切换由线程库或内核来做,并且非常快。一个进程就可以了。但在一些系统中ps可能显示不同线程。如果一个线程终止,整个进程就终止了。多数系统 调用是线程安全的,并且只要非常小的系统开销。Solaris, HP-UX, AIX 和OSF/1 都有内核线程。

在一些系统中内核线程被系统库中整合用户级线程管理。在这种情况下,线程切换只能由线程库来做,而内核并不是真正的“线程感知”的。


这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

Artikel sebelumnya: Artikel seterusnya: