国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

directory search
目錄 前言 1. 一般信息 1.1. 關(guān)于本手冊(cè) 1.2. 本手冊(cè)采用的慣例 1.3. MySQL AB概述 1.4. MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)概述 1.4.1. MySQL的歷史 1.4.2. MySQL的的主要特性 1.4.3. MySQL穩(wěn)定性 1.4.4. MySQL表最大能達(dá)到多少 1.4.5. 2000年兼容性 1.5. MaxDB數(shù)據(jù)庫(kù)管理系統(tǒng)概述 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之間的協(xié)同性 1.5.7. 與MaxDB有關(guān)的鏈接 1.6. MySQL發(fā)展大事記 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL郵件列表 1.7.2. IRC(在線聊天系統(tǒng))上的MySQL社區(qū)支持 1.7.3. MySQL論壇上的MySQL社區(qū)支持 1.8. MySQL標(biāo)準(zhǔn)的兼容性 1.8.1. MySQL遵從的標(biāo)準(zhǔn)是什么 1.8.2. 選擇SQL模式 1.8.3. 在ANSI模式下運(yùn)行MySQL 1.8.4. MySQL對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展 1.8.5. MySQL與標(biāo)準(zhǔn)SQL的差別 1.8.6. MySQL處理約束的方式 2. 安裝MySQL 2.1. 一般安裝問(wèn)題 2.1.1. MySQL支持的操作系統(tǒng) 2.1.2. 選擇要安裝的MySQL分發(fā)版 2.1.3. 怎樣獲得MySQL 2.1.4. 通過(guò)MD5校驗(yàn)和或GnuPG驗(yàn)證軟件包的完整性 2.1.5. 安裝布局 2.2. 使用二進(jìn)制分發(fā)版的標(biāo)準(zhǔn)MySQL安裝 2.3. 在Windows上安裝MySQL 2.3.1. Windows系統(tǒng)要求 2.3.2. 選擇安裝軟件包 2.3.3. 用自動(dòng)安裝器安裝MySQL 2.3.4. 使用MySQL安裝向?qū)?/a> 2.3.5. 使用配置向?qū)?/a> 2.3.6. 通過(guò)非安裝Zip文件安裝MySQL 2.3.7. 提取安裝檔案文件 2.3.8. 創(chuàng)建選項(xiàng)文件 2.3.9. 選擇MySQL服務(wù)器類型 2.3.10. 首次啟動(dòng)服務(wù)器 2.3.11. 從Windows命令行啟動(dòng)MySQL 2.3.12. 以Windows服務(wù)方式啟動(dòng)MySQL 2.3.13. 測(cè)試MySQL安裝 2.3.14. 在Windows環(huán)境下對(duì)MySQL安裝的故障診斷與排除 2.3.15. 在Windows下升級(jí)MySQL 2.3.16. Windows版MySQL同Unix版MySQL對(duì)比 2.4. 在Linux下安裝MySQL 2.5.在Mac OS X中安裝MySQL 2.6. 在NetWare中安裝MySQL 2.7. 在其它類Unix系統(tǒng)中安裝MySQL 2.8. 使用源碼分發(fā)版安裝MySQL 2.8.1. 源碼安裝概述 2.8.2. 典型配置選項(xiàng) 2.8.3. 從開發(fā)源碼樹安裝 2.8.4. 處理MySQL編譯問(wèn)題 2.8.5. MIT-pthreads注意事項(xiàng) 2.8.6. 在Windows下從源碼安裝MySQL 2.8.7. 在Windows下編譯MySQL客戶端 2.9. 安裝后的設(shè)置和測(cè)試 2.9.1. Windows下安裝后的過(guò)程 2.9.2. Unix下安裝后的過(guò)程 2.9.3. 使初始MySQL賬戶安全 2.10. 升級(jí)MySQL 2.10.1. 從5.0版升級(jí) 2.10.2. 升級(jí)授權(quán)表 2.10.3. 將MySQL數(shù)據(jù)庫(kù)拷貝到另一臺(tái)機(jī)器 2.11. 降級(jí)MySQL 2.12. 具體操作系統(tǒng)相關(guān)的注意事項(xiàng) 2.12.1. Linux注意事項(xiàng) 2.12.2. Mac OS X注意事項(xiàng) 2.12.3. Solaris注意事項(xiàng) 2.12.4. BSD注意事項(xiàng) 2.12.5. 其它Unix注意事項(xiàng) 2.12.6. OS/2注意事項(xiàng) 2.13. Perl安裝注意事項(xiàng) 2.13.1. 在Unix中安裝Perl 2.13.2. 在Windows下安裝ActiveState Perl 2.13.3. 使用Perl DBI/DBD接口的問(wèn)題 3. 教程 3.1. 連接與斷開服務(wù)器 3.2. 輸入查詢 3.3. 創(chuàng)建并使用數(shù)據(jù)庫(kù) 3.3.1. 創(chuàng)建并選擇數(shù)據(jù)庫(kù) 3.3.2. 創(chuàng)建表 3.3.3. 將數(shù)據(jù)裝入表中 3.3.4. 從表檢索信息 3.4. 獲得數(shù)據(jù)庫(kù)和表的信息 NoName 3.6. 常用查詢的例子 3.6.1. 列的最大值 3.6.2. 擁有某個(gè)列的最大值的行 3.6.3. 列的最大值:按組 3.6.4. 擁有某個(gè)字段的組間最大值的行 3.6.5. 使用用戶變量 3.6.6. 使用外鍵 3.6.7. 根據(jù)兩個(gè)鍵搜索 3.6.8. 根據(jù)天計(jì)算訪問(wèn)量 3.6.9. 使用AUTO_INCREMENT 3.7. 孿生項(xiàng)目的查詢 3.7.1. 查找所有未分發(fā)的孿生項(xiàng) 3.7.2. 顯示孿生對(duì)狀態(tài)的表 3.8. 與Apache一起使用MySQL 4. MySQL程序概述 4.1. MySQL程序概述 4.2. 調(diào)用MySQL程序 4.3. 指定程序選項(xiàng) 4.3.1. 在命令行上使用選項(xiàng) 4.3.2. 使用選項(xiàng)文件 4.3.3. 用環(huán)境變量指定選項(xiàng) 4.3.4. 使用選項(xiàng)設(shè)置程序變量 5. 數(shù)據(jù)庫(kù)管理 5.1. MySQL服務(wù)器和服務(wù)器啟動(dòng)腳本 5.1.1. 服務(wù)器端腳本和實(shí)用工具概述 5.1.2. mysqld-max擴(kuò)展MySQL服務(wù)器 5.1.3. mysqld_safe:MySQL服務(wù)器啟動(dòng)腳本 5.1.4. mysql.server:MySQL服務(wù)器啟動(dòng)腳本 5.1.5. mysqld_multi:管理多個(gè)MySQL服務(wù)器的程序 5.2. mysqlmanager:MySQL實(shí)例管理器 5.2.1. 用MySQL實(shí)例管理器啟動(dòng)MySQL服務(wù)器 5.2.2. 連接到MySQL實(shí)例管理器并創(chuàng)建用戶賬戶 5.2.3. MySQL實(shí)例管理器命令行選項(xiàng) 5.2.4. MySQL實(shí)例管理器配置文件 5.2.5. MySQL實(shí)例管理器識(shí)別的命令 5.3. mysqld:MySQL服務(wù)器 5.3.1. mysqld命令行選項(xiàng) 5.3.2. SQL服務(wù)器模式 5.3.3. 服務(wù)器系統(tǒng)變量 5.3.4. 服務(wù)器狀態(tài)變量 5.4. mysql_fix_privilege_tables:升級(jí)MySQL系統(tǒng)表 5.5. MySQL服務(wù)器關(guān)機(jī)進(jìn)程 5.6. 一般安全問(wèn)題 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻擊者面前保持安全 5.6.3. Mysqld安全相關(guān)啟動(dòng)選項(xiàng) 5.6.4. LOAD DATA LOCAL安全問(wèn)題 5.7. MySQL訪問(wèn)權(quán)限系統(tǒng) 5.7.1. 權(quán)限系統(tǒng)的作用 5.7.2. 權(quán)限系統(tǒng)工作原理 5.7.3. MySQL提供的權(quán)限 5.7.4. 與MySQL服務(wù)器連接 5.7.5. 訪問(wèn)控制 5.7.6. 訪問(wèn)控制 5.7.7. 權(quán)限更改何時(shí)生效 5.7.8. 拒絕訪問(wèn)錯(cuò)誤的原因 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. 設(shè)置賬戶密碼 5.8.6. 使你的密碼安全 5.8.7. 使用安全連接 5.9. 備份與恢復(fù) 5.9.1. 數(shù)據(jù)庫(kù)備份 5.9.2. 示例用備份與恢復(fù)策略 5.9.3. 自動(dòng)恢復(fù) 5.9.4. 表維護(hù)和崩潰恢復(fù) 5.9.5. myisamchk:MyISAM表維護(hù)實(shí)用工具 5.9.6. 建立表維護(hù)計(jì)劃 5.9.7. 獲取關(guān)于表的信息 5.10. MySQL本地化和國(guó)際應(yīng)用 5.10.1. 數(shù)據(jù)和排序用字符集 5.10.2. 設(shè)置錯(cuò)誤消息語(yǔ)言 5.10.3. 添加新的字符集 5.10.4. 字符定義數(shù)組 5.10.5. 字符串比較支持 5.10.6. 多字節(jié)字符支持 5.10.7. 字符集問(wèn)題 5.10.8. MySQL服務(wù)器時(shí)區(qū)支持 5.11. MySQL日志文件 5.11.1. 錯(cuò)誤日志 5.11.2. 通用查詢?nèi)罩?/a> 5.11.3. 二進(jìn)制日志 5.11.4. 慢速查詢?nèi)罩?/a> 5.11.5. 日志文件維護(hù) 5.12. 在同一臺(tái)機(jī)器上運(yùn)行多個(gè)MySQL服務(wù)器 5.12.1. 在Windows下運(yùn)行多個(gè)服務(wù)器 5.12.2. 在Unix中運(yùn)行多個(gè)服務(wù)器 5.12.3. 在多服務(wù)器環(huán)境中使用客戶端程序 5.13. MySQL查詢高速緩沖 5.13.1. 查詢高速緩沖如何工作 5.13.2. 查詢高速緩沖SELECT選項(xiàng) 5.13.3. 查詢高速緩沖配置 5.13.4. 查詢高速緩沖狀態(tài)和維護(hù) 6. MySQL中的復(fù)制 6.1. 復(fù)制介紹 6.2. 復(fù)制實(shí)施概述 6.3. 復(fù)制實(shí)施細(xì)節(jié) 6.3.1. 復(fù)制主線程狀態(tài) 6.3.2. 復(fù)制從I/O線程狀態(tài) 6.3.3. 復(fù)制從SQL線程狀態(tài) 6.3.4. 復(fù)制傳遞和狀態(tài)文件 6.4. 如何設(shè)置復(fù)制 6.5. 不同MySQL版本之間的復(fù)制兼容性 6.6. 升級(jí)復(fù)制設(shè)置 6.6.1. 將復(fù)制升級(jí)到5.0版 6.7. 復(fù)制特性和已知問(wèn)題 6.8. 復(fù)制啟動(dòng)選項(xiàng) 6.9. 復(fù)制FAQ 6.10. 復(fù)制故障診斷與排除 6.11. 通報(bào)復(fù)制缺陷 6.12. 多服務(wù)器復(fù)制中的Auto-Increment 7. 優(yōu)化 7.1. 優(yōu)化概述 7.1.1. MySQL設(shè)計(jì)局限與折衷 7.1.2. 為可移植性設(shè)計(jì)應(yīng)用程序 7.1.3. 我們已將MySQL用在何處? 7.1.4. MySQL基準(zhǔn)套件 7.1.5. 使用自己的基準(zhǔn) 7.2. 優(yōu)化SELECT語(yǔ)句和其它查詢 7.2.1. EXPLAIN語(yǔ)法(獲取SELECT相關(guān)信息) 7.2.2. 估計(jì)查詢性能 7.2.3. SELECT查詢的速度 7.2.4. MySQL怎樣優(yōu)化WHERE子句 7.2.5. 范圍優(yōu)化 7.2.6. 索引合并優(yōu)化 7.2.7. MySQL如何優(yōu)化IS NULL 7.2.8. MySQL如何優(yōu)化DISTINCT 7.2.9. MySQL如何優(yōu)化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何優(yōu)化嵌套Join 7.2.11. MySQL如何簡(jiǎn)化外部聯(lián)合 7.2.12. MySQL如何優(yōu)化ORDER BY 7.2.13. MySQL如何優(yōu)化GROUP BY 7.2.14. MySQL如何優(yōu)化LIMIT 7.2.15. 如何避免表掃描 7.2.16. INSERT語(yǔ)句的速度 7.2.17. UPDATE語(yǔ)句的速度 7.2.18. DELETE語(yǔ)句的速度 7.2.19. 其它優(yōu)化技巧 7.3. 鎖定事宜 7.3.1. 鎖定方法 7.3.2. 表鎖定事宜 7.4. 優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu) 7.4.1. 設(shè)計(jì)選擇 7.4.2. 使你的數(shù)據(jù)盡可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM鍵高速緩沖 7.4.7. MyISAM索引統(tǒng)計(jì)集合 7.4.8. MySQL如何計(jì)算打開的表 7.4.9. MySQL如何打開和關(guān)閉表 7.4.10. 在同一個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建多個(gè)表的缺陷 7.5. 優(yōu)化MySQL服務(wù)器 7.5.1. 系統(tǒng)因素和啟動(dòng)參數(shù)的調(diào)節(jié) 7.5.2. 調(diào)節(jié)服務(wù)器參數(shù) 7.5.3. 控制查詢優(yōu)化器的性能 7.5.4. 編譯和鏈接怎樣影響MySQL的速度 7.5.5. MySQL如何使用內(nèi)存 7.5.6. MySQL如何使用DNS 7.6. 磁盤事宜 7.6.1. 使用符號(hào)鏈接 8. 客戶端和實(shí)用工具程序 8.1. 客戶端腳本和實(shí)用工具概述 8.2. myisampack:生成壓縮、只讀MyISAM表 8.3. mysql:MySQL命令行工具 8.3.1. 選項(xiàng) 8.3.2. mysql命令 8.3.3. 怎樣從文本文件執(zhí)行SQL語(yǔ)句 8.3.4. mysql技巧 8.4. mysqlaccess:用于檢查訪問(wèn)權(quán)限的客戶端 8.5. mysqladmin:用于管理MySQL服務(wù)器的客戶端 8.6. mysqlbinlog:用于處理二進(jìn)制日志文件的實(shí)用工具 8.7. mysqlcheck:表維護(hù)和維修程序 8.8. mysqldump:數(shù)據(jù)庫(kù)備份程序 8.9. mysqlhotcopy:數(shù)據(jù)庫(kù)備份程序 8.10. mysqlimport:數(shù)據(jù)導(dǎo)入程序 8.11. mysqlshow-顯示數(shù)據(jù)庫(kù)、表和列信息 8.12. myisamlog:顯示MyISAM日志文件內(nèi)容 8.13. perror:解釋錯(cuò)誤代碼 8.14. replace:字符串替換實(shí)用工具 8.15. mysql_zap:殺死符合某一模式的進(jìn)程 9. 語(yǔ)言結(jié)構(gòu) 9.1. 文字值 9.1.1. 字符串 9.1.2. 數(shù)值 9.1.3. 十六進(jìn)制值 9.1.4. 布爾值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 數(shù)據(jù)庫(kù)、表、索引、列和別名 9.2.1. 識(shí)別符限制條件 9.2.2. 識(shí)別符大小寫敏感性 9.3. 用戶變量 9.4. 系統(tǒng)變量 9.4.1. 結(jié)構(gòu)式系統(tǒng)變量 9.5. 注釋語(yǔ)法 9.6. MySQL中保留字的處理 10. 字符集支持 10.1. 常規(guī)字符集和校對(duì) 10.2. MySQL中的字符集和校對(duì) 10.3. 確定默認(rèn)字符集和校對(duì) 10.3.1. 服務(wù)器字符集和校對(duì) 10.3.2. 數(shù)據(jù)庫(kù)字符集和校對(duì) 10.3.3. 表字符集和校對(duì) 10.3.4. 列字符集和校對(duì) 10.3.5. 字符集和校對(duì)分配示例 10.3.6. 連接字符集和校對(duì) 10.3.7. 字符串文字字符集和校對(duì) 10.3.8. 在SQL語(yǔ)句中使用COLLATE 10.3.9. COLLATE子句優(yōu)先 10.3.10. BINARY操作符 10.3.11. 校對(duì)確定較為復(fù)雜的一些特殊情況 10.3.12. 校對(duì)必須適合字符集 10.3.13. 校對(duì)效果的示例 10.4. 字符集支持影響到的操作 10.4.1. 結(jié)果字符串 10.4.2. CONVERT() 10.4.3. CAST() 10.4.4. SHOW語(yǔ)句 10.5. Unicode支持 10.6. 用于元數(shù)據(jù)的UTF8 10.7. 與其它DBMS的兼容性 10.8. 新字符集配置文件格式 10.9. 國(guó)家特有字符集 10.10. MySQL支持的字符集和校對(duì) 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. 數(shù)值類型概述 11.1.2. 日期和時(shí)間類型概述 11.1.3. 字符串類型概述 11.2. 數(shù)值類型 11.3. 日期和時(shí)間類型 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. 列類型存儲(chǔ)需求 11.6. 選擇正確的列類型 11.7. 使用來(lái)自其他數(shù)據(jù)庫(kù)引擎的列類型 12. 函數(shù)和操作符 12.1. 操作符 12.1.1. 操作符優(yōu)先級(jí) 12.1.2. 圓括號(hào) 12.1.3. 比較函數(shù)和操作符 12.1.4. 邏輯操作符 12.2. 控制流程函數(shù) 12.3. 字符串函數(shù) 12.3.1. 字符串比較函數(shù) 12.4. 數(shù)值函數(shù) 12.4.1. 算術(shù)操作符 12.4.2. 數(shù)學(xué)函數(shù) 12.5. 日期和時(shí)間函數(shù) 12.6. MySQL使用什么日歷? 12.7. 全文搜索功能 12.7.1. 布爾全文搜索 12.7.2. 全文搜索帶查詢擴(kuò)展 12.7.3. 全文停止字 12.7.4. 全文限定條件 12.7.5. 微調(diào)MySQL全文搜索 12.8. Cast函數(shù)和操作符 12.9. 其他函數(shù) 12.9.1. 位函數(shù) 12.9.2. 加密函數(shù) 12.9.3. 信息函數(shù) 12.9.4. 其他函數(shù) NoName 12.10.1. GROUP BY(聚合)函數(shù) 12.10.2. GROUP BY修改程序 12.10.3. 具有隱含字段的GROUP BY 13. SQL語(yǔ)句語(yǔ)法 13.1. 數(shù)據(jù)定義語(yǔ)句 13.1.1. ALTER DATABASE語(yǔ)法 13.1.2. ALTER TABLE語(yǔ)法 13.1.3. CREATE DATABASE語(yǔ)法 13.1.4. CREATE INDEX語(yǔ)法 13.1.5. CREATE TABLE語(yǔ)法 13.1.6. DROP DATABASE語(yǔ)法 13.1.7. DROP INDEX語(yǔ)法 13.1.8. DROP TABLE語(yǔ)法 13.1.9. RENAME TABLE語(yǔ)法 13.2. 數(shù)據(jù)操作語(yǔ)句 13.2.1. DELETE語(yǔ)法 13.2.2. DO語(yǔ)法 13.2.3. HANDLER語(yǔ)法 13.2.4. INSERT語(yǔ)法 13.2.5. LOAD DATA INFILE語(yǔ)法 13.2.6. REPLACE語(yǔ)法 13.2.7. SELECT語(yǔ)法 13.2.8. Subquery語(yǔ)法 13.2.9. TRUNCATE語(yǔ)法 13.2.10. UPDATE語(yǔ)法 13.3. MySQL實(shí)用工具語(yǔ)句 13.3.1. DESCRIBE語(yǔ)法(獲取有關(guān)列的信息) 13.3.2. USE語(yǔ)法 13.4. MySQL事務(wù)處理和鎖定語(yǔ)句 13.4.1. START TRANSACTION 13.4.2. 不能回滾的語(yǔ)句 13.4.3. 會(huì)造成隱式提交的語(yǔ)句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT語(yǔ)法 13.4.5. LOCK TABLES和UNLOCK TABLES語(yǔ)法 13.4.6. SET TRANSACTION語(yǔ)法 13.4.7. XA事務(wù) 13.5. 數(shù)據(jù)庫(kù)管理語(yǔ)句 13.5.1. 賬戶管理語(yǔ)句 13.5.2. 表維護(hù)語(yǔ)句 13.5.3. SET語(yǔ)法 13.5.4. SHOW語(yǔ)法 13.5.5. 其它管理語(yǔ)句 13.6. 復(fù)制語(yǔ)句 13.6.1. 用于控制主服務(wù)器的SQL語(yǔ)句 13.6.2. 用于控制從服務(wù)器的SQL語(yǔ)句 13.7. 用于預(yù)處理語(yǔ)句的SQL語(yǔ)法 14. 插件式存儲(chǔ)引擎體系結(jié)構(gòu) 14.1. 前言 14.2. 概述 14.3. 公共MySQL數(shù)據(jù)庫(kù)服務(wù)器層 14.4. 選擇存儲(chǔ)引擎 14.5. 將存儲(chǔ)引擎指定給表 14.6. 存儲(chǔ)引擎和事務(wù) 14.7. 插入存儲(chǔ)引擎 14.8. 拔出存儲(chǔ)引擎 14.9. 插件式存儲(chǔ)器的安全含義 15. 存儲(chǔ)引擎和表類型 15.1. MyISAM存儲(chǔ)引擎 15.1.1. MyISAM啟動(dòng)選項(xiàng) 15.1.2. 鍵所需的空間 15.1.3. MyISAM表的存儲(chǔ)格式 15.1.4. MyISAM表方面的問(wèn)題 15.2. InnoDB存儲(chǔ)引擎 15.2.1. InnoDB概述 15.2.2. InnoDB聯(lián)系信息 15.2.3. InnoDB配置 15.2.4. InnoDB啟動(dòng)選項(xiàng) 15.2.5. 創(chuàng)建InnoDB表空間 15.2.6. 創(chuàng)建InnoDB表 15.2.7. 添加和刪除InnoDB數(shù)據(jù)和日志文件 15.2.8. InnoDB數(shù)據(jù)庫(kù)的備份和恢復(fù) 15.2.9. 將InnoDB數(shù)據(jù)庫(kù)移到另一臺(tái)機(jī)器上 15.2.10. InnoDB事務(wù)模型和鎖定 15.2.11. InnoDB性能調(diào)節(jié)提示 15.2.12. 多版本的實(shí)施 15.2.13. 表和索引結(jié)構(gòu) 15.2.14. 文件空間管理和磁盤I/O 15.2.15. InnoDB錯(cuò)誤處理 15.2.16. 對(duì)InnoDB表的限制 15.2.17. InnoDB故障診斷與排除 15.3. MERGE存儲(chǔ)引擎 15.3.1. MERGE表方面的問(wèn)題 15.4. MEMORY (HEAP)存儲(chǔ)引擎 15.5. BDB (BerkeleyDB)存儲(chǔ)引擎 15.5.1. BDB支持的操作系統(tǒng) 15.5.2. 安裝BDB 15.5.3. BDB啟動(dòng)選項(xiàng) 15.5.4. BDB表的特性 15.5.5. 修改BDB所需的事宜 15.5.6. 對(duì)BDB表的限制 15.5.7. 使用BDB表時(shí)可能出現(xiàn)的錯(cuò)誤 15.6. EXAMPLE存儲(chǔ)引擎 15.7. FEDERATED存儲(chǔ)引擎 15.7.1. 安裝FEDERATED存儲(chǔ)引擎 15.7.2. FEDERATED存儲(chǔ)引擎介紹 15.7.3. 如何使用FEDERATED表 15.7.4. FEDERATED存儲(chǔ)引擎的局限性 15.8. ARCHIVE存儲(chǔ)引擎 15.9. CSV存儲(chǔ)引擎 15.10. BLACKHOLE存儲(chǔ)引擎 16. 編寫自定義存儲(chǔ)引擎 16.1. 前言 16.2. 概述 16.3. 創(chuàng)建存儲(chǔ)引擎源文件 NoName 16.5. 對(duì)處理程序進(jìn)行實(shí)例化處理 16.6. 定義表擴(kuò)展 16.7. 創(chuàng)建表 16.8. 打開表 16.9. 實(shí)施基本的表掃描功能 16.9.1. 實(shí)施store_lock()函數(shù) 16.9.2. 實(shí)施external_lock()函數(shù) 16.9.3. 實(shí)施rnd_init()函數(shù) 16.9.4. 實(shí)施info()函數(shù) 16.9.5. 實(shí)施extra()函數(shù) 16.9.6. 實(shí)施rnd_next()函數(shù) 16.10. 關(guān)閉表 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. 多計(jì)算機(jī)的簡(jiǎn)單基礎(chǔ)知識(shí) 17.3.1. 硬件、軟件和聯(lián)網(wǎng) 17.3.2. 安裝 17.3.3. 配置 17.3.4. 首次啟動(dòng) 17.3.5. 加載示例數(shù)據(jù)并執(zhí)行查詢 17.3.6. 安全關(guān)閉和重啟 17.4. MySQL簇的配置 17.4.1. 從源碼創(chuàng)建MySQL簇 17.4.2. 安裝軟件 17.4.3. MySQL簇的快速測(cè)試設(shè)置 17.4.4. 配置文件 17.5. MySQL簇中的進(jìn)程管理 17.5.1. 用于MySQL簇的MySQL服務(wù)器進(jìn)程使用 17.5.2. ndbd,存儲(chǔ)引擎節(jié)點(diǎn)進(jìn)程 17.5.3. ndb_mgmd,“管理服務(wù)器”進(jìn)程 17.5.4. ndb_mgm,“管理客戶端”進(jìn)程 17.5.5. 用于MySQL簇進(jìn)程的命令選項(xiàng) 17.6. MySQL簇的管理 17.6.1. MySQL簇的啟動(dòng)階段 17.6.2. “管理客戶端”中的命令 17.6.3. MySQL簇中生成的事件報(bào)告 17.6.4. 單用戶模式 17.6.5. MySQL簇的聯(lián)機(jī)備份 17.7. 使用與MySQL簇的高速互連 17.7.1. 配置MySQL簇以使用SCI套接字 17.7.2. 理解簇互連的影響 17.8. MySQL簇的已知限制 17.9. MySQL簇發(fā)展的重要?dú)v程 17.9.1. MySQL 5.0中的MySQL簇變化 17.9.2. 關(guān)于MySQL簇的MySQL 5.1發(fā)展歷程 17.10. MySQL簇常見問(wèn)題解答 17.11. MySQL簇術(shù)語(yǔ)表 18. 分區(qū) 18.1. MySQL中的分區(qū)概述 18.2. 分區(qū)類型 18.2.1. RANGE分區(qū) 18.2.2. LIST分區(qū) 18.2.3. HASH分區(qū) 18.2.4. KEY分區(qū) 18.2.5. 子分區(qū) 18.2.6. MySQL分區(qū)處理NULL值的方式 18.3. 分區(qū)管理 18.3.1. RANGE和LIST分區(qū)的管理 18.3.2. HASH和KEY分區(qū)的管理 18.3.3. 分區(qū)維護(hù) 18.3.4. 獲取關(guān)于分區(qū)的信息 19. MySQL中的空間擴(kuò)展 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. 支持的空間數(shù)據(jù)格式 19.3.1. 著名的文本(WKT)格式 19.3.2. 著名的二進(jìn)制(WKB)格式 19.4. 創(chuàng)建具備空間功能的MySQL數(shù)據(jù)庫(kù) 19.4.1. MySQL空間數(shù)據(jù)類型 19.4.2. 創(chuàng)建空間值 19.4.3. 創(chuàng)建空間列 19.4.4. 填充空間列 19.4.5. 獲取空間數(shù)據(jù) 19.5. 分析空間信息 19.5.1. Geometry格式轉(zhuǎn)換函數(shù) 19.5.2. Geometry函數(shù) 19.5.3. 從已有Geometry創(chuàng)建新Geometry的函數(shù) 19.5.4. 測(cè)試幾何對(duì)象間空間關(guān)系的函數(shù) 19.5.5. 關(guān)于幾何最小邊界矩形(MBR)的關(guān)系 19.5.6. 測(cè)試幾何類之間空間關(guān)系的函數(shù) 19.6. 優(yōu)化空間分析 19.6.1. 創(chuàng)建空間索引 19.6.2. 使用空間索引 19.7. MySQL的一致性和兼容性 19.7.1. 尚未實(shí)施的GIS特性 20. 存儲(chǔ)程序和函數(shù) 20.1. 存儲(chǔ)程序和授權(quán)表 20.2. 存儲(chǔ)程序的語(yǔ)法 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語(yǔ)句 20.2.7. BEGIN ... END復(fù)合語(yǔ)句 20.2.8. DECLARE語(yǔ)句 20.2.9. 存儲(chǔ)程序中的變量 20.2.10. 條件和處理程序 20.2.11. 光標(biāo) 20.2.12. 流程控制構(gòu)造 20.3. 存儲(chǔ)程序、函數(shù)、觸發(fā)程序和復(fù)制:常見問(wèn)題 20.4. 存儲(chǔ)子程序和觸發(fā)程序的二進(jìn)制日志功能 21. 觸發(fā)程序 21.1. CREATE TRIGGER語(yǔ)法 21.2. DROP TRIGGER語(yǔ)法 21.3. 使用觸發(fā)程序 22. 視圖 22.1. ALTER VIEW語(yǔ)法 22.2. CREATE VIEW語(yǔ)法 22.3. DROP VIEW語(yǔ)法 22.4. SHOW CREATE VIEW語(yǔ)法 23. INFORMATION_SCHEMA信息數(shù)據(jù)庫(kù) 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. 精度數(shù)學(xué) 24.1. 數(shù)值的類型 24.2. DECIMAL數(shù)據(jù)類型更改 24.3. 表達(dá)式處理 24.4. 四舍五入 24.5. 精度數(shù)學(xué)示例 25. API和庫(kù) 25.1. libmysqld,嵌入式MySQL服務(wù)器庫(kù) 25.1.1. 嵌入式MySQL服務(wù)器庫(kù)概述 25.1.2. 使用libmysqld編譯程序 25.1.3. 使用嵌入式MySQL服務(wù)器時(shí)的限制 25.1.4. 與嵌入式服務(wù)器一起使用的選項(xiàng) 25.1.5. 嵌入式服務(wù)器中尚需完成的事項(xiàng)(TODO) 25.1.6. 嵌入式服務(wù)器示例 25.1.7. 嵌入式服務(wù)器的許可 25.2. MySQL C API 25.2.1. C API數(shù)據(jù)類型 25.2.2. C API函數(shù)概述 25.2.3. C API函數(shù)描述 25.2.4. C API預(yù)處理語(yǔ)句 25.2.5. C API預(yù)處理語(yǔ)句的數(shù)據(jù)類型 25.2.6. C API預(yù)處理語(yǔ)句函數(shù)概述 25.2.7. C API預(yù)處理語(yǔ)句函數(shù)描述 25.2.8. C API預(yù)處理語(yǔ)句方面的問(wèn)題 25.2.9. 多查詢執(zhí)行的C API處理 25.2.10. 日期和時(shí)間值的C API處理 25.2.11. C API線程函數(shù)介紹 25.2.12. C API嵌入式服務(wù)器函數(shù)介紹 25.2.13. 使用C API時(shí)的常見問(wèn)題 25.2.14. 創(chuàng)建客戶端程序 25.2.15. 如何生成線程式客戶端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常見問(wèn)題 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程序開發(fā)實(shí)用工具 25.9.1. msql2mysql:轉(zhuǎn)換mSQL程序以用于MySQL 25.9.2. mysql_config:獲取編譯客戶端的編譯選項(xiàng) 26. 連接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介紹 26.1.2. 關(guān)于ODBC和MyODBC的一般信息 26.1.3. 如何安裝MyODBC 26.1.4. 在Windows平臺(tái)上從二進(jìn)制版本安裝MyODBC 26.1.5. I在Unix平臺(tái)上從二進(jìn)制版本安裝MyODBC 26.1.6. 在Windows平臺(tái)上從源碼版本安裝MyODBC 26.1.7. 在Unix平臺(tái)上從源碼版本安裝MyODBC 26.1.8. 從BitKeeper開發(fā)源碼樹安裝MyODBC 26.1.9. MyODBC配置 26.1.10. 與MyODBC連接相關(guān)的事宜 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應(yīng)用步驟 26.1.16. MyODBC API引用 26.1.17. MyODBC數(shù)據(jù)類型 26.1.18. MyODBC錯(cuò)誤代碼 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體系結(jié)構(gòu) 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方面的問(wèn)題 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.4.1. 前言 26.4.2. 支持平臺(tái): 26.4.3. Junit測(cè)試要求 26.4.4. 運(yùn)行Junit測(cè)試 26.4.5. 作為JDBC驅(qū)動(dòng)程序的一部分運(yùn)行 26.4.6. 在Java對(duì)象中運(yùn)行 26.4.7. MysqldResource API 26.4.8. 在JMX代理(custom)中運(yùn)行 26.4.9. 部署在標(biāo)準(zhǔn)的JMX代理環(huán)境下 (JBoss) 26.4.10. 安裝 27. 擴(kuò)展MySQL 27.1. MySQL內(nèi)部控件 27.1.1. MySQL線程 27.1.2. MySQL測(cè)試套件 27.2. 為MySQL添加新函數(shù) 27.2.1. 自定義函數(shù)接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION語(yǔ)法 27.2.3. 添加新的自定義函數(shù) 27.2.4. 添加新的固有函數(shù) 27.3. 為MySQL添加新步驟 27.3.1. 步驟分析 27.3.2. 編寫步驟 A. 問(wèn)題和常見錯(cuò)誤 A.1. 如何確定導(dǎo)致問(wèn)題的原因 A.2. 使用MySQL程序時(shí)的常見錯(cuò)誤 A.2.1. 拒絕訪問(wèn) A.2.2. 無(wú)法連接到[local] MySQL服務(wù)器 A.2.3. 客戶端不支持鑒定協(xié)議 A.2.4. 輸入密碼時(shí)出現(xiàn)密碼錯(cuò)誤 NoName A.2.6. 連接數(shù)過(guò)多 A.2.7. 內(nèi)存溢出 A.2.8. MySQL服務(wù)器不可用 A.2.9. 信息包過(guò)大 A.2.10. 通信錯(cuò)誤和失效連接 A.2.11. 表已滿 A.2.12. 無(wú)法創(chuàng)建文件/寫入文件 A.2.13. 命令不同步 A.2.14. 忽略用戶 A.2.15. 表tbl_name不存在 A.2.16. 無(wú)法初始化字符集 A.2.17. 文件未找到 A.3. 與安裝有關(guān)的事宜 A.3.1. 與MySQL客戶端庫(kù)的鏈接問(wèn)題 A.3.2. 如何以普通用戶身份運(yùn)行MySQL A.3.3. 與文件許可有關(guān)的問(wèn)題 A.4. 與管理有關(guān)的事宜 A.4.1. 如何復(fù)位根用戶密碼 A.4.2. 如果MySQL依然崩潰,應(yīng)作些什么 A.4.3. MySQL處理磁盤滿的方式 A.4.4. MySQL將臨時(shí)文件儲(chǔ)存在哪里 A.4.5. 如何保護(hù)或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 時(shí)區(qū)問(wèn)題 A.5. 與查詢有關(guān)的事宜 A.5.1. 搜索中的大小寫敏感性 A.5.2. 使用DATE列方面的問(wèn)題 A.5.3. 與NULL值有關(guān)的問(wèn)題 A.5.4. 與列別名有關(guān)的問(wèn)題 A.5.5. 非事務(wù)表回滾失敗 A.5.6. 從相關(guān)表刪除行 A.5.7. 解決與不匹配行有關(guān)的問(wèn)題 A.5.8. 與浮點(diǎn)比較有關(guān)的問(wèn)題 A.6. 與優(yōu)化器有關(guān)的事宜 A.7. 與表定義有關(guān)的事宜 A.7.1. 與ALTER TABLE有關(guān)的問(wèn)題 A.7.2. 如何更改表中的列順序 A.7.3. TEMPORARY TABLE問(wèn)題 A.8. MySQL中的已知事宜 A.8.1. MySQL中的打開事宜 B. 錯(cuò)誤代碼和消息 B.1. 服務(wù)器錯(cuò)誤代碼和消息 B.2. 客戶端錯(cuò)誤代碼和消息 C. 感謝 C.1. MySQL AB處的開發(fā)人 C.2. MySQL貢獻(xiàn)人 C.3. 資料員和譯員 C.4. MySQL使用和包含的庫(kù) C.5. 支持MySQL的軟件包 C.6. 用于創(chuàng)建MySQL的工具 C.7. MySQL支持人員 D. MySQL變更史 D.1. 5.1.x版中的變更情況(開發(fā)) D.1.1. 5.1.2版中的變更情況(尚未發(fā)布) D.1.2. 5.1.1版中的變更情況(尚未發(fā)布) D.2. MyODBC的變更情況 D.2.1. MyODBC 3.51.12的變更情況 D.2.2. MyODBC 3.51.11的變更情況 E. 移植到其他系統(tǒng) E.1. 調(diào)試MySQL服務(wù)器 E.1.1. 針對(duì)調(diào)試編譯MySQL E.1.2. 創(chuàng)建跟蹤文件 E.1.3. 在gdb環(huán)境下調(diào)試mysqld E.1.4. 使用堆棧跟蹤 E.1.5. 使用日志文件找出mysqld中的錯(cuò)誤原因 E.1.6. 如果出現(xiàn)表崩潰,請(qǐng)生成測(cè)試案例 E.2. 調(diào)試MySQL客戶端 E.3. DBUG軟件包 E.4. 關(guān)于RTS線程的注釋 E.5. 線程軟件包之間的差異 F. 環(huán)境變量 G. MySQL正則表達(dá)式 H. MySQL中的限制 H.1. 聯(lián)合的限制 I. 特性限制 I.1. 對(duì)存儲(chǔ)子程序和觸發(fā)程序的限制 I.2. 對(duì)服務(wù)器端光標(biāo)的限制 I.3. 對(duì)子查詢的限制 I.4. 對(duì)視圖的限制 I.5. 對(duì)XA事務(wù)的限制 J. GNU通用公共許可 K. MySQL FLOSS許可例外 索引
characters

附錄E:移植到其它系統(tǒng)

目錄

E.1. 調(diào)試MySQL服務(wù)器
E.1.1. 針對(duì)調(diào)試編譯MySQL
E.1.2. 創(chuàng)建跟蹤文件
E.1.3. 在gdb環(huán)境下調(diào)試mysqld
E.1.4. 使用堆棧跟蹤
E.1.5. 使用日志文件找出mysqld出錯(cuò)原因
E.1.6. 如果出現(xiàn)表格崩潰,請(qǐng)生成測(cè)試案例
E.2. 測(cè)試MySQL 客戶端
E.3. DBUG 軟件包
E.4. 關(guān)于RTS線程的注釋
E.5. 線程軟件包之間的差異

這個(gè)附錄幫助你把MySQL移植到其它操作系統(tǒng)。請(qǐng)先查看一下當(dāng)前支持操作系統(tǒng)列表。請(qǐng)參閱2.1.1節(jié),“MySQL支持的操作系統(tǒng)”。如果你創(chuàng)建了一個(gè)新的MySQL移植(移植到列表上沒(méi)有的操作系統(tǒng)),請(qǐng)通知我們,以便我們能把這個(gè)操作系統(tǒng)列到我們網(wǎng)站上(http://www.mysql.com/),推薦給其它的用戶。

注意:如果你創(chuàng)建一個(gè)新的MySQL移植,你可以在GPL許可證下任意復(fù)制和發(fā)布它,但這不能使你成為MySQL的版權(quán)持有者。

這個(gè)服務(wù)器需要一個(gè)正在工作的POSIX 線程庫(kù)在。在Solaris 2.5 上我們使用Sun PThreads (在2.4版和更早的版本上,原生線程支持得不是很好),在Linux上,我們使用Xavier Leroy<Xavier.Leroy@inria.fr>的LinuxThreads。

對(duì)于那些對(duì)原生線程支持不好的新Unix變體,移植到其上的艱難部分大概就是移植MIT-pthreads包。請(qǐng)參閱mit-pthreads/README 和Programming POSIX Threads (http://www.humanfactor.com/pthreads/)。

直到MySQL 4.0.2版,MySQL發(fā)布包包括來(lái)自MIT經(jīng)過(guò)補(bǔ)丁的Chris Provenzano的Pthreads(請(qǐng)參閱MIT Pthreads 網(wǎng)頁(yè)http://www.mit.edu/afs/sipb/project/pthreads/ 以及http://www.mit.edu:8001/people/proven/IAP_2000/上的編程指導(dǎo))。對(duì)于某些沒(méi)有POSIX線程的操作系統(tǒng)可能有用。請(qǐng)參閱2.8.5節(jié),“MIT-pthreads 注意事項(xiàng)”。

也可能會(huì)用到另一個(gè)名為 FSU Pthreads的用戶級(jí)線程軟件包(請(qǐng)參閱http://moss.csc.ncsu.edu/~mueller/pthreads/)。 這個(gè)工具被用來(lái)到SCO的移植。

參閱 mysys目錄下的thr_lock.c 和thr_alarm.c 程序獲取一些關(guān)于這些問(wèn)題的測(cè)試/例子。

服務(wù)器和客戶端需要一個(gè)能用的C++編譯器。我們?cè)诤芏嗥脚_(tái)上使用gcc。其它編譯器,據(jù)了解,可用的編譯器是SPARCworks, Sun Forte, Irix cc, HP-UX aCC, IBM AIX xlC_r), Intel ecc/icc 和 Compaq cxx)。

要僅編譯客戶端,請(qǐng)使用./configure --without-server.

現(xiàn)在不支持僅編譯服務(wù)器,也不能加這個(gè)功能,除非有人找出一個(gè)好的理由。

如果你想/需要改變?nèi)魏蜯akefile 或配置腳本,你也會(huì)需要到GNU Automake 和 Autoconf。請(qǐng)參閱2.8.3節(jié) ,“從開發(fā)源樹安裝”。

所有步驟需要從最基本的文件重新生成(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上遇到問(wèn)題,最好做一些調(diào)試!請(qǐng)參閱E.1節(jié),“調(diào)試MySQL服務(wù)器”。

注意:在你開始調(diào)試mysqld之前,首先要讓測(cè)試程序mysys/thr_alarmmysys/thr_lock工作。這會(huì)確保你的線程安裝只有非常小的機(jī)會(huì)能運(yùn)行!

E.1.?調(diào)試MySQL服務(wù)器

E.1.1. 為調(diào)試編譯MySQL
E.1.2. 創(chuàng)建追蹤文件
E.1.3. 在gdb環(huán)境下調(diào)試
E.1.4. 使用堆棧跟蹤
E.1.5. 使用日志文件找出mysqld錯(cuò)誤原因
E.1.6. 如果發(fā)生表崩潰則做一個(gè)測(cè)試案例

如果你使用MySQL某些非常新的功能,你可以帶--skip-new參數(shù)(這個(gè)選項(xiàng)禁止掉所有新的潛在不安全的功能)或帶 --safe-mode參數(shù)(它禁止掉很多可能導(dǎo)致問(wèn)題的優(yōu)化設(shè)置)來(lái)運(yùn)行mysqld 請(qǐng)參閱A.4.2節(jié),“如果MySQL依舊崩潰,應(yīng)該做什么”。

如果 mysqld 不啟動(dòng),你應(yīng)該查證有沒(méi)有干擾你的設(shè)置的my.cnf文件。你可以用mysqld --print-defaults...檢查my.cnf參量,并用mysqld --no-defaults來(lái)啟動(dòng)去避免它們。

如果mysqld 啟動(dòng)耗盡CPU或內(nèi)存資源,或者它“掛”了起來(lái),你可以使用 mysqladmin processlist status去找出是否有人執(zhí)行了一個(gè)占用很長(zhǎng)時(shí)間的查詢。如果你正面臨著性能問(wèn)題或新客戶端不能連 之時(shí)的問(wèn)題,在某些窗口中運(yùn)行mysqladmin -i10 processlist status可能是一個(gè)好主意。

mysqladmin debug 命令把一些有關(guān)使用中的鎖,使用的內(nèi)存以及查詢使用的信息轉(zhuǎn)儲(chǔ)到MySQL日志文件里。這將有助于解決一些問(wèn)題。即使你沒(méi)有為調(diào)試編譯MySQL,這個(gè)命令也提供一些有用的信息!

如果問(wèn)題是一些表變得越來(lái)越慢,你應(yīng)該試著用PTIMIZE TABLE或myisamchk優(yōu)化表。I請(qǐng)參閱第5章:數(shù)據(jù)庫(kù)管理 。你也可以用EXPLAIN檢查慢 的查詢。?

對(duì)那些于你的環(huán)境是獨(dú)特的問(wèn)題,你也應(yīng)該查閱這個(gè)手冊(cè)里OS規(guī)格的部分請(qǐng)參閱?2.12節(jié),“操作系統(tǒng)系統(tǒng)的注意事項(xiàng)”。

E.1.1.?針對(duì)調(diào)試編譯MySQL

如果你遇到一些非常明確的問(wèn)題,你可以總是試著調(diào)試MySQL。要調(diào)試MySQL,你必須用--with-debug或--with-debug=full選項(xiàng)來(lái)配置MySQL。你可以檢查MySQL是否是通過(guò)mysqld --help來(lái)和調(diào)試一起編譯的。如果--debug標(biāo)記和選項(xiàng)一起被列出了,你就可以調(diào)試了。在這種情況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++庫(kù)和C++異常(很多編譯器在線程代碼里有C++異常的問(wèn)題)的問(wèn)題,并編譯了一個(gè)支持所有字符集的MySQL版本。

如果你懷疑內(nèi)存溢出錯(cuò)誤,你可以用--with-debug=full來(lái)配置MySQL,這會(huì)安裝一個(gè)內(nèi)存分配(SAFEMALLOC)檢查器。可是,運(yùn)行SAFEMALLOC是非常慢的,所以如果你遇到性能上的問(wèn)題,你應(yīng)該 用--skip-safemalloc選項(xiàng)啟動(dòng)mysqld。這樣禁止掉對(duì)調(diào)用malloc()和free()的內(nèi)存檢查。

當(dāng)你用--with-debug編譯mysqld時(shí),如果它不再崩潰,你大致已經(jīng)在MySQL內(nèi)找到一個(gè)編譯器缺陷或計(jì)時(shí)缺陷。這種情況下,你可以試著把-g加到上面的CFLAGSCXXFLAGS變量,并且不使用--with-debug。如果mysqld失敗,你至少可以gdb用附著上它或使用核心文件上的gdb去找出發(fā)生什么問(wèn)題。

當(dāng)你為調(diào)試配置MySQL時(shí),你就自動(dòng)允許許多額外的監(jiān)視mysqld健康的安全檢查函數(shù)。如果它們發(fā)現(xiàn)一些“不期望”的事,會(huì)寫一個(gè)條目到stderr,safe_mysqld指引這個(gè)stderr到錯(cuò)誤日志!這也意味著如果MySQL發(fā)生什么意外的問(wèn)題,并且你正使用一個(gè)源文件發(fā)布版本,那么你要做的第一件事就是去為調(diào)試配置MySQL!(第二件事是發(fā)郵件到MySQL郵件列表請(qǐng)求幫助)。請(qǐng)參閱1.7.1.1節(jié),“MySQL郵件列表”。請(qǐng)根據(jù)你使用的MySQL版本對(duì)所有缺陷報(bào)告或問(wèn)題使用mysqlbug腳本!

在Windows MySQL發(fā)布包里,mysqld.exe默認(rèn)編譯為支持追蹤文件。

E.1.2.?創(chuàng)建跟蹤文件

如果mysqld 服務(wù)器沒(méi)有啟動(dòng)或者你可以快速地使其崩潰,你可以創(chuàng)建一個(gè)跟蹤文件來(lái)找出問(wèn)題。

要這么做的話,你必須有一個(gè)編譯了支持調(diào)試的mysqld, 你可以通過(guò)執(zhí)行mysqld -V來(lái)檢查一下。如果版本號(hào)后面跟著-debug,它就是被編譯成支持跟蹤文件。(在 Windows中,調(diào)試服務(wù)器被命名為mysqld-debug 而不是象MySQL 4.1 那樣的mysqld )。

如下命令,啟動(dòng)帶跟蹤文件的 mysqld 服務(wù)器,跟蹤文件位于Unix上的/tmp/mysqld.trace目錄里,Windows上 的C:\mysqld.trace目錄里:

shell> mysqld --debug

在Windows上,你也可以使用--standalone參數(shù),啟動(dòng)mysqld讓它不作為服務(wù)。在控制臺(tái)窗口,使用這個(gè)命令:

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

完畢之后,你可以使用第二個(gè)窗口中的 mysql.exe 命令行工具重新制造問(wèn)題。你可以用mysqladmin shutdown命令停止mysqld服務(wù)器。

注意,跟蹤文件會(huì)變得很大!如果你想生成一個(gè)小一點(diǎn)的跟蹤文件,你可以使用類似這樣的調(diào)制選項(xiàng):

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

這樣就僅把帶最感興趣標(biāo)記的信息寫進(jìn)跟蹤文件里.

如果你生成一個(gè)有關(guān)于此的缺陷報(bào)告,請(qǐng)只用把跟蹤文件中的相關(guān)行發(fā)送到恰當(dāng)?shù)泥]件列表去,那里關(guān)注你報(bào)告出問(wèn)題的部分。如果你不能找出哪里出問(wèn)題,你可以ftp上載整個(gè)跟蹤文件到ftp://ftp.mysql.com/pub/mysql/upload/,并附有完全的缺陷報(bào)告,MySQL開發(fā)人員會(huì)看到它的。

追蹤文件是由Fred Fish用DBUG軟件包生成的,請(qǐng)參閱E.3節(jié),“DBUG軟件包”。

E.1.3.?在gdb環(huán)境下調(diào)試mysqld

如果mysqld崩潰了,在大多數(shù)系統(tǒng)上,你也可是從gdb啟動(dòng)mysqld來(lái)獲取更多信息。

Linux上,有一些老版本的gdb,如果你想要能調(diào)試mysqld線程,你必須使用run --one-threadsome。在這種情況下,你可以一次只激活一個(gè)線程。我們推薦你升級(jí)到gdb 5.1 ASAP ,這個(gè)版本上線程調(diào)試工作得更好!

NTPL 線程(Linux上的新線程庫(kù))可能會(huì)在gdb下運(yùn)行mysqld時(shí)遇到問(wèn)題。一些癥狀如下:

  • mysqld 在啟動(dòng)過(guò)程中掛起(在它寫ready for connections之前)。

  • mysqld 在調(diào)用pthread_mutex_lock()或pthread_mutex_unlock()過(guò)程中崩潰。

在這種情況下你應(yīng)該在啟動(dòng)gdb之前在外殼上設(shè)置如下環(huán)境變量:

LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL

gdb下運(yùn)行mysqld時(shí),你應(yīng)該用--skip-stack-trace來(lái)禁止堆棧跟蹤,以便能捕獲gdb內(nèi)的段錯(cuò)誤。

在MySQL 4.0.14和以上版本,你應(yīng)該對(duì)mysqld使用--gdb選項(xiàng)。 這會(huì)為SIGINT安裝一個(gè)中斷處理器(需要用^C停止mysqld來(lái)設(shè)置斷點(diǎn)),并且禁止堆棧跟蹤和核心文件處理。

當(dāng)gdb沒(méi)有給舊線程釋放內(nèi)存的整個(gè)時(shí)間里,如果你做了大量的新連接,在gdb下調(diào)試MySQL是非常困難的。你可以通過(guò)帶 -O thread_cache_size= 'max_connections +1' 啟動(dòng)mysqld 來(lái)避免這個(gè)問(wèn)題。在多數(shù)情況下,只使用-O thread_cache_size=5'就受益無(wú)窮了!

如果mysqld帶著SIGSEGV信號(hào)死掉了,而你想在Linux上轉(zhuǎn)儲(chǔ)核心,你可以帶--core-file選項(xiàng)啟動(dòng)mysqld。這個(gè)核心文件可以被用來(lái)生成 向后跟蹤,它可以幫你找出mysqld 為何死掉:

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

請(qǐng)參閱A.4.2節(jié),“如果MySQL依舊崩潰,該如何去做”。

如果你在Linux上使用gdb 4.17.x 或以上版本,你應(yīng)該安裝一個(gè)帶有如下信息的 .gdb 文件到你當(dāng)前目錄:

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調(diào)試線程遇到問(wèn)題,你應(yīng)該下載gdb 5.x版本并用它試一下調(diào)試。新版本的 gdb 大大改善了線程處理!

下面是如何調(diào)試mysqld的例子:

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

把上面的輸入寫進(jìn)一個(gè)用mysqlbug生成的郵件里,發(fā)送到綜合MySQL郵件列表。請(qǐng)參閱1.7.1.1節(jié),“MySQL 郵件列表”。

如果mysqld 掛起,你可以試著用一些諸如strace 或 /usr/proc/bin/pstack 這樣的系統(tǒng)工具連檢查mysqld 在哪里掛起。

strace /tmp/log libexec/mysqld

如果你使用 Perl DBI 接口,你可以使用trace方法或設(shè)置DBI_TRACE環(huán)境變量來(lái)打開調(diào)試信息。

E.1.4.?使用堆棧跟蹤

在一些操作系統(tǒng)上,如果mysqld意外死掉,錯(cuò)誤日志包含一個(gè)堆棧跟蹤。你可以用它來(lái)找出mysqld 在哪里(也許可能找出為什么)死掉。請(qǐng)參閱5.11.1節(jié),“錯(cuò)誤日志”。要獲得堆棧跟蹤,你不能用-fomit-frame-pointer 選項(xiàng)編譯mysqld 為gcc。 請(qǐng)參閱E.1.1節(jié),“針對(duì)調(diào)試編譯MySQL”。

如果錯(cuò)誤文件包含類似下面的一些內(nèi)容:

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在什么地方出現(xiàn)問(wèn)題:

  1. 復(fù)制前面的數(shù)字到一個(gè)文件,如mysqld.stack。

  2. mysqld 服務(wù)器生成符號(hào)文件:

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

    注意,多數(shù)MySQL二進(jìn)制發(fā)布包("debug" 軟件包,包含這些信息的地方就在二進(jìn)制發(fā)布包本身之內(nèi))帶上述文件,在其中這些文件名為mysqld.sym.gz。在這種情況下,你可以簡(jiǎn)單地解壓縮它:

    gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym
    
  3. 執(zhí)行 resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack.

    這個(gè)命令會(huì)打印出mysqld死在哪里。如果這個(gè)不能幫你找出mysqld為什么死掉,你應(yīng)該生成一個(gè)缺陷報(bào)告,并在缺陷報(bào)告里包含上述命令的輸出結(jié)果。

    注意,盡管在多數(shù)情況下,僅有一個(gè)堆棧跟蹤不能幫助我們找出問(wèn)題的原因。為了定位缺陷或找到一個(gè)大致范圍,我們?cè)诖蠖鄶?shù)情況下需要知道殺掉mysqld的查詢,并最好知道一個(gè)測(cè)試案例 ,以便我們能重復(fù)問(wèn)題!請(qǐng)參閱1.7.1.3節(jié),“如何報(bào)告缺陷和問(wèn)題”。

E.1.5.?使用日志文件找出mysqld中的錯(cuò)誤原因

注意,在帶--log選項(xiàng)啟動(dòng) mysqld之前,你應(yīng)該用myisamchk檢查所有的表。請(qǐng)參閱第5章:數(shù)據(jù)庫(kù)管理 .

如果 mysqld 死了或掛起,你應(yīng)該用--log啟動(dòng) mysqld 。當(dāng)mysqld 再次死掉時(shí),你可以檢查日志文件的最后,找出殺掉mysqld的查詢。

如果你不帶文件名使用 --log ,日志被保存在名為host_name.log的數(shù)據(jù)庫(kù)目錄里。在多數(shù)情況下,日志文件中的最后一個(gè)查詢殺掉mysqld,但如果有可能,你應(yīng)該重啟mysqld并從mysq命令行工具執(zhí)行找到的查詢來(lái)驗(yàn)證一下。如果這個(gè)查詢殺掉了mysqld,你也應(yīng)該測(cè)試所有沒(méi)有完成的復(fù)雜查詢。

你也可以在所有占用長(zhǎng)時(shí)間的SELECT聲明上用命令EXPLAIN來(lái)確認(rèn) mysqld正適當(dāng)?shù)厥褂盟饕?。?qǐng)參閱7.2.1節(jié),“EXPLAIN 語(yǔ)法(獲得關(guān)于SELECT的信息)”。

你可以帶 --log-slow-queries啟動(dòng)mysqld來(lái)找出占用長(zhǎng)時(shí)間來(lái)執(zhí)行的查詢。請(qǐng)參閱5.11.4節(jié) ,“緩慢查詢?nèi)罩尽薄?

如果你在錯(cuò)誤日志文件(通常名為hostname.err)中發(fā)現(xiàn) mysqld restarted 字樣,你大致已經(jīng)找到導(dǎo)致mysqld的查詢。如果發(fā)生這種情況,你應(yīng)該用myisamchk檢查所有表(參閱 第5章:數(shù)據(jù)庫(kù)管理 ),并在MySQL日志文件中測(cè)試這些查詢看是否有不執(zhí)行的。如果找到這樣一個(gè)查詢,試著升級(jí)到最新的MySQL版本。如果這樣不能幫助你,你不能在mysql郵件存檔中發(fā)現(xiàn)任何相關(guān)內(nèi)容,你應(yīng)該把缺陷報(bào)告給MySQL郵件列表。郵件列表在http://lists.mysql.com/訂閱,這個(gè)地址上也有連到在線列表存檔的鏈接。

如果你已經(jīng)用myisam-recover啟動(dòng)了mysqld,MySQL自動(dòng)檢查并試著修復(fù)MyISAM 表,看是否它們被標(biāo)志為“未正常關(guān)閉”或“崩潰”。如果發(fā)生這種情況,MySQL在文件hostname.err 寫一個(gè)條目'Warning: Checking table ...',后面跟著警告:如果表需要修復(fù),請(qǐng)修復(fù)它。如果你遇上大量的這些錯(cuò)誤而mysqld沒(méi)有意外死掉,那就是有問(wèn)題了,需要進(jìn)一步調(diào)查。請(qǐng)參閱5.3.1節(jié),“mysqld命令行選項(xiàng)”。

如果mysqld意外死掉,這可不是一個(gè)好兆頭,但在這種情況下不用研究Checking table...信息,而是要找出mysqld為什么死掉。

E.1.6.?如果出現(xiàn)表崩潰,請(qǐng)生成測(cè)試案例

如果在一些更新命令之后,mysqld總是當(dāng)?shù)?,或者如果你遇到被破壞的表,你可以用下面的操作測(cè)試看這個(gè)缺陷是否是可重復(fù)產(chǎn)生的:

  • 卸掉MySQL守護(hù)進(jìn)程(用mysqladmin shutdown)。

  • 給該表做備份(防止修復(fù)操作反而搞壞這種很不可能出現(xiàn)的情況)。

  • myisamchk -s database/*.MYI 檢查所有的表,用myisamchk -r database/table.MYI修理有錯(cuò)誤的表。

  • 對(duì)該表做第二次備份。

  • 如果需要更多的空間就從MySQL數(shù)據(jù)庫(kù)目錄刪除(或移走)舊日志文件。

  • 帶--log-bin啟動(dòng)Start mysqld 。請(qǐng)參閱5.11.3節(jié),“二進(jìn)制日志”。如果你想找出搞mysqld的查詢,你應(yīng)該使用use --log --log-bin。

  • 當(dāng)你已經(jīng)遭遇一個(gè)被破壞的表時(shí),請(qǐng)停止mysqld server 。

  • 還原備份。

  • 不帶--log-bin重啟動(dòng)mysqld 服務(wù)器。?

  • 重新執(zhí)行mysqlbinlog update-log-file | mysql命令。更新的日志用名字hostname-bin.#保存在MySQL數(shù)據(jù)庫(kù)目錄下。

  • 如果該表再次被破壞,或者你可用上訴命令讓mysqld 死掉,你就已經(jīng)找到可重復(fù)產(chǎn)生的缺陷,它應(yīng)該很容易被修復(fù)!可以ftp上傳表和二進(jìn)制日志到 ftp://ftp.mysql.com/pub/mysql/upload/ 然后把它輸入我們?cè)? http://bugs.mysql.com/上的缺陷系統(tǒng)。(請(qǐng)注意,/pub/mysql/upload/ 在FTP時(shí)是不可以列出(內(nèi)容)的,所以不能在FTP客戶端看見你已經(jīng)上載的東西。)如果你是一個(gè)支持客戶,你可以使用 MySQL客戶支持中心https://support.mysql.com/ 來(lái) 提醒MySQL 技術(shù)人員這個(gè)問(wèn)題,讓這個(gè)問(wèn)題盡快得到解決。

如果你想縮小問(wèn)題的范圍,你也可以使用 mysql_find_rows腳本來(lái)只執(zhí)行一些 更新語(yǔ)句。

E.2.?調(diào)試MySQL客戶端

為能夠用集成的調(diào)試軟件包調(diào)試MySQL客戶端 ,你應(yīng)該用--with-debug或--with-debug=full配置MySQL。請(qǐng)參閱2.8.2節(jié),“典型的配置選項(xiàng)”。

在運(yùn)行客戶端之前,你應(yīng)該設(shè)置 MYSQL_DEBUG環(huán)境變量:

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

這會(huì)導(dǎo)致客戶端在 /tmp/client.trace目錄產(chǎn)生一個(gè)跟蹤文件。

如果你自己的客戶端代碼有問(wèn)題,你應(yīng)該試著連接到服務(wù)器,用已知可用的客戶端運(yùn)行你的查詢。在調(diào)試模式下,按下面命令運(yùn)行(假設(shè)你已經(jīng)帶調(diào)試編譯了MySQL):

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

萬(wàn)一你要發(fā)送一個(gè)缺陷報(bào)告郵件,這會(huì)提供給你有用的信息。請(qǐng)查閱“如何報(bào)告缺陷或問(wèn)題”。

如果你的客戶端在一些看起來(lái)合法的代碼處崩潰了,你應(yīng)該檢查你的mysql.h文件是否包括匹配你的MySQL庫(kù)文件。一個(gè)常見的錯(cuò)誤就是用新的版本的MySQL庫(kù)使用一個(gè)來(lái)自老版本安裝的mysql.h文件。

E.3.?DBUG軟件包

MySQL服務(wù)器和多數(shù)MySQL客戶端都帶著由Fred Fish初創(chuàng)的DBUG 軟件包編譯成的。當(dāng)你為調(diào)試配置MytSQL之時(shí),這個(gè)軟件使你可以得到一個(gè)程序正在調(diào)試什么的跟蹤文件。請(qǐng)參閱E.1.2節(jié),“創(chuàng)建跟蹤文件”。

這一節(jié)總結(jié)了你對(duì)已建立支持調(diào)試的MySQL程序在命令行的調(diào)試選項(xiàng)處可以指定的參量值。要獲取更多使用DBUG軟件包來(lái)編程的信息,請(qǐng)參閱MySQL源發(fā)布包里dbug目錄下的DBUG手冊(cè)。最好使用最近的MySQL 5.1發(fā)布包以獲得最近更新的DBUG手冊(cè)。

你通過(guò)用--debug="..."或the -#... 選項(xiàng)調(diào)用一個(gè)程序來(lái)使用調(diào)試軟件包。

多數(shù)MySQL程序有默認(rèn)的調(diào)試字符串,如果你不給--debug指定一個(gè)選項(xiàng),就使用這個(gè)默認(rèn)的。默認(rèn)的跟蹤文件通常是/tmp/program_name.trace(在Unix上)和program_name.trace (在Windows上)。

調(diào)試字符串是一系列冒號(hào)隔開的區(qū)段,如下:

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

每個(gè)區(qū)段包含一個(gè)強(qiáng)制標(biāo)志字符,后面跟著已和可選的 ‘,’ 以及一列用逗號(hào)隔開的修改量:

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

當(dāng)前被識(shí)別的標(biāo)記符號(hào)是:

標(biāo)記 描述
d 允許對(duì)當(dāng)前狀態(tài)從DBUG_<N>宏輸出??赡芨涣嘘P(guān)鍵詞,這些關(guān)鍵詞僅對(duì)那些帶有關(guān)鍵詞的DBUG宏選擇輸出。一個(gè)空的關(guān)鍵詞列意味著對(duì)所有宏輸出。
D 在每個(gè)調(diào)試起輸出行后延遲。參量一個(gè)十分之一秒為單位來(lái)延遲的數(shù),它受限于機(jī)器的能力。比如 -#D,20 指定一個(gè)2秒的延遲。
f 限制調(diào)試和/或跟蹤,以及簡(jiǎn)單設(shè)定于列出名字的函數(shù)。注意,空列將禁止所用函數(shù)。應(yīng)該給出適當(dāng)?shù)膁 或 t 標(biāo)記,如果它們被允許了,這個(gè)標(biāo)記僅限制它們的動(dòng)作。
F 對(duì)調(diào)試或跟蹤輸出的每一行識(shí)別源文件名。
i 對(duì)調(diào)試或跟蹤輸出的每一行用PID或線程ID識(shí)別進(jìn)程。
g 允許解析,創(chuàng)建名為的dbugmon.out文件,它包含可用來(lái)簡(jiǎn)單設(shè)定程序的信息??赡芨涣嘘P(guān)鍵詞,它們是選擇只對(duì)列中的函數(shù)做簡(jiǎn)單設(shè)定。一個(gè)空列意味著所有函數(shù)都要考慮到。
L 為調(diào)試或跟蹤輸出的每一行識(shí)別源文件行號(hào)。
n 為調(diào)試或跟蹤輸出的每一行打印當(dāng)前函數(shù)嵌套深度。
N 給調(diào)試輸出的每一行編號(hào)。
o 重定向調(diào)試器輸出流到指定文件。默認(rèn)輸出是stderr 文件。
O 類似于 o,但是文件在每次寫操作之間被沖刷。當(dāng)需要之時(shí),文件在每次寫操作之間被關(guān)閉然后重新打開。
p 限制調(diào)試器作用于指定進(jìn)程。為使調(diào)試器動(dòng)作,一個(gè)進(jìn)程必須用DBUG_PROCESS宏來(lái)識(shí)別,且匹配列表中的一個(gè)。
P 為調(diào)試或跟蹤輸出的每一行打印當(dāng)前進(jìn)程名字。
r 當(dāng)推出一個(gè)新狀態(tài)時(shí),不繼承前狀態(tài)的操作嵌套深度級(jí)別。當(dāng)輸出在左邊空白開始時(shí)有用。
S 在每個(gè)調(diào)試過(guò)的函數(shù)做_sanity(_file_,_line_)函數(shù)直到 _sanity() 返回不同于0的結(jié)果。(大多數(shù)的時(shí)候與safemalloc 一起用來(lái)找出內(nèi)存漏洞)。
t 允許函數(shù)調(diào)用/退出跟蹤行??赡芨粋€(gè)給出最大跟蹤級(jí)別的數(shù)字列(只含一個(gè)修改量),超過(guò)這個(gè)數(shù)字,調(diào)試中或跟蹤中的宏不能產(chǎn)生任何輸出。 默認(rèn)為一個(gè)編譯時(shí)間選項(xiàng)。

可能出現(xiàn)在外殼命令行(-# 典型地被用來(lái)引入一個(gè)控制字符串到一個(gè)應(yīng)用程序中) 的調(diào)試控制字符串的一些例子如下:

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

在MySQL中, 打印的一般標(biāo)記是(用 d 選項(xiàng))是 enter, exit, error, warning, info, 和 loop 。

E.4.?關(guān)于RTS線程的注釋

我曾嘗試讓MySQL使用RTS線程軟件包,但是在下面的問(wèn)題上遇到阻礙:

RTS線程軟件包很多老版本的POSIX調(diào)用,對(duì)所有函數(shù)的寫封裝就很枯燥。我傾向于認(rèn)為把線程庫(kù)換成最新的POSIX規(guī)格,會(huì)更容易些。。

一些封裝正在編寫中。更多信息請(qǐng)參閱mysys/my_pthread.c 文件。

至少下面說(shuō)道的應(yīng)該改變一下:

pthread_get_specific該使用一個(gè)參量。 sigwait應(yīng)該使用兩個(gè)參量。很多函數(shù)(至少pthread_cond_wait, pthread_cond_timedwait())應(yīng)該返回錯(cuò)誤的錯(cuò)誤代碼?,F(xiàn)在它們返回 -1 且設(shè)置 errno。

另一個(gè)問(wèn)題是,用戶級(jí)線程使用ALRM信號(hào),這會(huì)終止很多函數(shù)(read, write, open...)。MySQL應(yīng)該重試一下所有這上面的中斷,但是這并非很容易去驗(yàn)證。

最大的未解決問(wèn)題如下:

要獲得線程級(jí)警報(bào),我使用pthread_cond_timedwait()改變 mysys/thr_alarm.c,讓它在警報(bào)之間等待。但是它發(fā)生EINTR錯(cuò)誤,終止了。我試著調(diào)試線程庫(kù)找出為什么會(huì)出這個(gè)錯(cuò)誤,但是找不到一個(gè)簡(jiǎn)便 的解決辦法。

如果人人想要用RTS線程跑一下MySQL,我建議以下幾點(diǎn):

  • 把MySQL使用的函數(shù)從線程庫(kù)變到POSIX。這不會(huì)占據(jù)那么長(zhǎng)時(shí)間。

  • 用-DHAVE_rts_threads編譯所有庫(kù)。

  • 編譯thr_alarm。

  • 若在執(zhí)行中有一些小的差異,可以改變my_pthread.h和my_pthread.c來(lái)修復(fù)它們。

  • 運(yùn)行thr_alarm。如果它沒(méi)有任何警告,錯(cuò)誤或終止信息地運(yùn)行,你就做對(duì)了。這里是一個(gè)在Solaris成功運(yùn)行的例子:

    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非常依賴使用中的線程軟件包。 所以當(dāng)為MySQL選擇一個(gè)好平臺(tái)的時(shí)候,線程軟件包就非常重要。

至少有三種線程軟件包:

  • 用戶線程在單個(gè)進(jìn)程中。線程切換用警報(bào)管理,線程庫(kù)用鎖管理所有非線程安全函數(shù)。讀,寫和選擇操作通常被線程專有的切換器管理, 如果運(yùn)行中的線程要等待數(shù)據(jù),這個(gè)切換器就會(huì)切換操作到另一個(gè)線程。如果用戶線程軟件包集成在標(biāo)準(zhǔn)庫(kù)(FreeBSD 和 BSDI 線程軟件包)里,這樣的 線程軟件包比那些不得不映射所有不安全調(diào)用(MIT-pthreads, FSU Pthreads 和 RTS 線程軟件包)的線程軟件包需要更少的系統(tǒng)開銷。在某些環(huán)境下(如SCO),所有系統(tǒng)調(diào)用都是線程安全的,所以映射非常容易(SCO上的FSU Pthreads包)。不足之處是:所有映射的調(diào)用占用很少的時(shí)間,于是想要能處理所有的情況就相當(dāng)繁雜。有一些系統(tǒng)調(diào)用通常不被線程軟件包(類似MIT-pthreads and sockets包)處理。線程計(jì)劃不總是最優(yōu)化的。

  • 在分離進(jìn)程中的用戶線程。線程切換是由內(nèi)核來(lái)做,且所有的數(shù)據(jù)在線程之間共享。線程軟件包管理標(biāo)準(zhǔn)線程調(diào)用,允許在線程之間共享數(shù)據(jù)。LinuxThreads包就使用這種方法。不足之處:太多進(jìn)程。線程創(chuàng)建得慢,如果一個(gè)線程死掉了,其余得線程通常就掛起來(lái),你必須在重啟之前殺掉這些掛起的線程。線程切換開銷有些大。

  • 內(nèi)核線程。線程切換由線程庫(kù)或內(nèi)核來(lái)做,并且非??臁R粋€(gè)進(jìn)程就可以了。但在一些系統(tǒng)中ps可能顯示不同線程。如果一個(gè)線程終止,整個(gè)進(jìn)程就終止了。多數(shù)系統(tǒng) 調(diào)用是線程安全的,并且只要非常小的系統(tǒng)開銷。Solaris, HP-UX, AIX 和OSF/1 都有內(nèi)核線程。

在一些系統(tǒng)中內(nèi)核線程被系統(tǒng)庫(kù)中整合用戶級(jí)線程管理。在這種情況下,線程切換只能由線程庫(kù)來(lái)做,而內(nèi)核并不是真正的“線程感知”的。


這是MySQL參考手冊(cè)的翻譯版本,關(guān)于MySQL參考手冊(cè),請(qǐng)?jiān)L問(wèn)dev.mysql.com。 原始參考手冊(cè)為英文版,與英文版參考手冊(cè)相比,本翻譯版可能不是最新的。

Previous article: Next article: