mysql+binlog浅析

freemark 贡献于2010-09-12

作者 QQ  创建于2007-06-18 06:28:00   修改者hawkliu  修改于2008-03-26 01:59:00字数12269

文档摘要:这是一份腾讯内部的技术文档,详细讲述了 MySQL 数据库启用二进制日志 binlog 的细节,非常有参考价值。前言:日志是把数据库的每一个变化都记载到一个专用的文件里,这种文件就叫做日志文件。Mysql默认只打开出错日志,因为过多的日志将会影响系统的处理性能。在5.0前支持文本格式和二进制格式,5.0后只支持二进制格式,因为二进制日志在性能、信息处理方面有更多的优点。本文将对mysql的二进制日志机制进行分析,希望通过这篇文档,能够让初学者对二进制日志有一个初步的了解。
关键词:

文档编号 文档负责人 hawkliu 文档名称 Mysql binlog浅析 Mysql binlog浅析 深圳市腾讯计算机系统有限公司 目 录 目 录 1 文档历史 3 第1章 概述 4 1.1 前言 4 1.2 基础知识 4 1.3 内容纲要 5 第2章 查看日志 6 2.1 功能简介 6 2.2 用法简介 6 2.3 选项简介 6 2.4 注意事项 7 2.5 输出格式 8 第3章 备份原理 11 3.1 备份简介 11 3.2 实现概述 11 3.3 行级备份 11 3.4 备份过程 11 3.5 中继日志 13 3.6 自定义备份 14 3.7 注意事项 14 第4章 格式分析 15 4.1 功能简介 15 4.2 文件格式 15 4.3 事件内容 15 第5章 附录 18 5.1 Mysql源码路径 18 文档历史 修订日期 修订内容 修订版本 修订人 2008-3-5 创建 1.00 hawkliu 第1章 概述 1.1 前言 日志是把数据库的每一个变化都记载到一个专用的文件里,这种文件就叫做日志文件。Mysql默认只打开出错日志,因为过多的日志将会影响系统的处理性能。 在5.0前支持文本格式和二进制格式,5.0后只支持二进制格式,因为二进制日志在性能、信息处理方面有更多的优点。 下边将对mysql的二进制日志机制进行分析,希望通过这篇文档,能够让初学者对二进制日志有一个初步的了解。 1.2 基础知识 l 二进制日志的启用 二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根目录创建两个新文件XXX-bin.001和xxx-bin.index,若配置选项没有给出文件名,Mysql将使用主机名称命名这两个文件,其中.index文件包含一份全体日志文件的清单。 Mysql会把用户对所有数据库的内容和结构的修改情况记入XXX-bin.n文件,而不会记录SELECT和没有实际更新的UPDATE语句。 l 日志文件的扩展 当停止或重启时,服务器会把日志文件记入下一个日志文件,Mysql会在重启时生成一个新的日志文件,文件序号递增,此外,如果日志文件超过max_binlog_size系统变量配置的上限时,也会生成新的日志文件。 l 日志文件的查看 Mysql提供了mysqlbinlog命令来查看日志文件,如mysqlbinlog xxx-bin.001 | more。在记录每条变更日志的时候,日志文件都会把当前时间给记录下来,以便进行数据库恢复。 l 日志文件的停用 可以使用SET SQL_LOG_BIN=0命令停止使用日志文件,然后可以通过SET SQL_LOG_BIN=1命令来启用。 l 使用日志进行数据库恢复 如果遇到灾难事件,应该用最近一次制作的完整备份恢复数据库,然后使用备份之后的日志文件把数据库恢复到最接近现在的可用状态。 使用日志进行恢复时需要依次进行,即最早生成的日志文件要最先恢复: mysqlbinlog xxx-bin.00001 | mysql –u root –p mysqlbinlog xxx-bin.00002 | mysql –u root –p 1.3 内容纲要 本文档分为4个部分: 1、如何查看二进制日志; 2、二进制日志的备份原理; 3、二进制日志的格式分析; 4、二进制日志的深入应用。 第2章 查看日志 2.1 功能简介 mysqlbinlog可以将mysql服务器生成的二进制日志文件转换成可读的文本格式。此外,还可以使用该工具分析备机上的relay日志(可以理解为从服务器下载的二进制日志子集,其格式与主机的日志文件相同)。 由于文档参考了mysql5.0版本,若使用其他版本的工具,部分内容可能略有差异,需在实际操作过程中进行区分。 2.2 用法简介 mysqlbinlog的调用方式如下:mysqlbinlog [options] log_file ...,例如,要显示名字为binlog.000003的日志文件,按如下方式调用即可:mysqlbinlog binlog.000003。其输出信息包括了该日志文件中所有事件信息。 所谓的事件,其实就是对数据库的一次操作记录,其中包括mysql服务器执行的语句、语句的执行时间点、发起执行的客户线程ID、语句执行花费的时间开销等信息。 mysqlbinlog的输出是可重复执行的,可以直接作为mysql程序的输入,若服务器崩溃后,可以利用mysqlbinlog的这个功能对二进制日志进行恢复,如mysqlbinlog binlog.000001 | mysql。此外,也可以将mysqlbinlog的输出重定向到一个文件中,删除不需要的SQL后再交给mysql去执行。需要注意的是,在恢复过程中,不要将多个日志文件同时交给不同的mysql客户端执行,因为恢复时需要保持二进制日志中的SQL语句的执行顺序。下边是一种可选的方式:mysqlbinlog binlog.000001 binlog.000002 | mysql,或者将多个二进制文件拷贝到单个文件再执行。 此外,mysqlbinlog还提供了读取远程机器的二进制日志的功能,其用法比较简单,只需要指定--read-from-remote-server选项即可,当然,远程主机的连接信息也是必要的,包括:--host, --password, --port, --protocol, --socket, 以及 –user等。 2.3 选项简介 下边对mysqlbinlog的选项进行简单介绍: 选项 功能描述 --help 打印帮助信息并退出 --character-sets-dir 指定字符集的安装目录 --database 只列出该数据库的日志项(该选项只用于本地日志) --debug 打印调试级别的日志。典型的选项是'd:t:o,file_name' --disable-log-bin 关闭二进制日志(例如从日志中恢复时或者指定了--to-last-log选项时)。使用该选项时,mysqlbinlog会调用mysql的SET SQL_LOG_BIN=0语句关闭二进制日志。 --force-read 当碰到不能识别的事件时,打印警告信息并忽略 --hexdump 以16进制格式打印日志到输出 --host 指定日志文件所在的主机地址 --local-load 为LOAD DATA INFILE指定一个本地临时目录 --offset=N 指定读取的事件偏移量(忽略前N个事件) --password 连接到服务器时使用的密码 --port 连接到服务器时使用的TCP/IP端口 --position 该选项已经废除,使用--start-position替换 --protocol 指定使用的连接协议={TCP|SOCKET|PIPE|MEMORY} --read-from-remote-server 指定从远程服务器读取日志,不指定该选项时,--host, --password, --port, --protocol, --socket, 以及--user等选项都被忽略。 --result-file 将输入结果定向到该选项指定的文件中 --short-form 只显式执行的SQL语句,不显式其他附加信息 --socket 本机连接时使用,指定使用的unix的socket文件或windows的命名管道 --start-datetime 指定开始读取的起始日志时间,如--start-datetime="2005-12-25 11:25:56" --stop-datetime 指定读取结束的日志时间,碰到第一个大于等于该时间的事件为止 --start-position=N 从第一个等于该序号的事件开始读取 --stop-position=N 到第一个等于该序号的事件时结束 --to-last-log 不要在请求的日志文件结束后结束,而要到最后一个日志文件的结束处为止,若mysqlbinlog和mysql服务器在同一台机器,由于mysqlbinlog也会生成二进制文件,所以可能导致死循环,所以通常用于远程主机。 --user 连接远程主机时使用的用户名 --version 打印程序版本并退出 2.4 注意事项 l 关于LOAD DATA INFILE mysqlbinlog会将LOAD DATA INFILE指定的导入文件拷贝到一个临时文件,并重新产生一个LOAD DATA LOCAL INFILE语句来引入该临时文件,存放该文件的路径是系统配置,可以通过--local-load选项进行指定。 由于mysqlbinlog会将LODA DATA INFILE命令转换为LOAD DATA LOCAL INFILE,所以,处理这些SQL的服务器和客户端都必须配置为允许本地兼容。 需注意的是,为LOAD DATA LOCAL语句创建的临时文件不会被自动删除,因为,在实际执行这些语句之前,还需要这些临时文件。这些文件可以从临时文件路径中找到,其名字格式为:original_file_name-#-#。 2.5 输出格式 下边是一个二进制文件的打印示例: # at 4 #070813 14:16:36 server id 1 log_pos 4 Query thread_id=2 exec_time=0 error_code=0 use config_center3; SET TIMESTAMP=1186985796; UPDATE t_client_info SET f_sync = 1, f_version=13, f WHERE f_ip_addr = '192.168.64.49'; 上述输出包括如下要素: l Position 位于文件中的位置,即第一行的(#at 4)和第二行的(log_pos 4),说明该事件记录从文件第4字节开始。 l Timestamp 事件发生的时间戳,即第二行的(#070813 14:16:36) l Exec_time 事件的执行花费时间 l Error_code 错误码 l Type 事件类型: 类型 名称 描述 00 UNKNOWN_EVENT This event should never be present in the log. 01 START_EVENT_V3 This indicates the start of a log file written by MySQL 4 or earlier. 02 QUERY_EVENT The most common type of events. These contain statements executed on the master. 03 STOP_EVENT Indicates that master has stopped. 04 ROTATE_EVENT Written when the master switches to a new log file. 05 INTVAR_EVENT Used mainly for AUTO_INCREMENT values and when the LAST_INSERT_ID() function is used in the statement. 06 LOAD_EVENT Used for LOAD DATA INFILE in MySQL 3.23. 07 SLAVE_EVENT Reserved for future use. 08 CREATE_FILE_EVENT Used for LOAD DATA INFILE statements. This indicates the start of execution of such a statement. A temporary file is created on the slave. Used in MySQL 4 only. 09 APPEND_BLOCK_EVENT Contains data for use in a LOAD DATA INFILE statement. The data is stored in the temporary file on the slave. 0a EXEC_LOAD_EVENT Used for LOAD DATA INFILE statements. The contents of the temporary file is stored in the table on the slave. Used in MySQL 4 only. 0b DELETE_FILE_EVENT Rollback of a LOAD DATA INFILE statement. The temporary file should be deleted on slave. 0c NEW_LOAD_EVENT Used for LOAD DATA INFILE in MySQL 4 and earlier. 0d RAND_EVENT Used to send information about random values if the RAND() function is used in the statement. 0e USER_VAR_EVENT Used to replicate user variables. 0f FORMAT_DESCRIPTION_EVENT This indicates the start of a log file written by MySQL 5 or later. 10 XID_EVENT Event indicating commit of an XA transaction. 11 BEGIN_LOAD_QUERY_EVENT Used for LOAD DATA INFILE statements in MySQL 5 and later. 12 EXECUTE_LOAD_QUERY_EVENT Used for LOAD DATA INFILE statements in MySQL 5 and later. 13 TABLE_MAP_EVENT Reserved for future use. 14 WRITE_ROWS_EVENT Reserved for future use. 15 UPDATE_ROWS_EVENT Reserved for future use. 16 DELETE_ROWS_EVENT Reserved for future use. l Master ID 创建二进制事件的主机服务器ID l Master Pos 事件在原始二进制文件中的位置 l Flags 目前,有如下标志被使用,其余的保留以便将来使用: 类型 名称 描述 01 LOG_EVENT_BINLOG_IN_USE_F Log file correctly closed. (Used only in FORMAT_DESCRIPTION_EVENT.) If this flag is set (if the flags are, for example, '01 00') in a FORMAT_DESCRIPTION_EVENT, the log file has not been properly closed. Most probably this is because of a master crash (for example, due to power failure). 02   Reserved for future use. 04 LOG_EVENT_THREAD_SPECIFIC_F Set if the event is dependent on the connection it was executed in (for example, '04 00'), for example, if the event uses temporary tables. 08 LOG_EVENT_SUPPRESS_USE_F Set in some circumstances when the event is not dependent on the default database. 第3章 备份原理 3.1 备份简介 Mysql支持单向的异步备份机制,也就是将其中一台服务器作为主机、另外一台或多台作为备机。在单主机复制时,主机将更新记录到它的二进制日志文件中,并且维护一个索引文件以便进行日志文件编号的循环。 Mysql备份由备机主动发起,当一个备机连接到主机时,它通知主机最后一次读取并成功进行了备份的日志的位置,然后等待主机发送后续的更新。 此外,备机同时也可以作为别的机器的主机而形成一个备份链,甚至,多主机的备份也是可行的,不过这将引起许多在单主机备份中不会出现的问题,在使用这种功能之前,需详细了解相关的文档。 3.2 实现概述 Mysql的备份是基于主服务器将所有对数据库的更新保存到了它的二进制文件中的原理,因此,在使用备份机制时,必须想打开主机的二进制文件选项。 尤其需要注意的是二进制文件只是打开二进制文件选项后的某个时间点的更新记录,此时安装的任何备机都需要一个一个该时间点的数据库完整拷贝,否则,复制极有可能会失败。 另外一种将主机数据拷贝到备机的备份机制是使用LOAD DATA FROM MASTER语句,但是,该语句只适用于主机只使用MyISAM存储引擎的情况。而且该语句执行时需要获取主机上全局的读锁,此时,主机不能进行任何的更新操作。 备机进行复制时,它连接到主机并等待执行更新操作,如果这个过程中出现失败,备机将会周期性的进行重试,可以通过--master-connect-retry选项控制重试的周期,默认为60秒。每台备机都记录了最后一次从主机读取数据的位置,主机不关心备机的当前状态以及有多少个备机连接到了主机。 3.3 行级备份 Mysql最初只支持语句级备份,也就是将实际的SQL语句发送到备机执行。在5.15版本后,Mysql支持行级备份,也就是将主机实际影响的行数据进行记录。在5.18版本后,Mysql还支持第三种方式:混合备份机制,这种备份缺省使用语句级别备份,在某些特殊的情况下会切换到行级备份。 3.4 备份过程 下边对Mysql的备份过程进行简单描述: 1、首先备机启动备份,备机创建一个I/O线程,用于连接到主机并请求主机的更新语句。 2、主机为每个备机创建一个线程用于发送二进制日志内容,该线程可以通过SHOW PROCESSLIST语句来查看,名称为Binlog Dump。 3、备机I/O线程读取主机发送的更新并将其拷贝到本地文件,称为中继日志(relay logs)。 4、备机创建一个SQL线程用于读取中继日志并执行其中的更新语句。 这些线程的执行状态可以通过SHOW PROCESSLIST命令进行查看: 状态 描述 Sending binlog event to slave 正在发送二进制事件到备机 Finished reading one binlog; switching to next binlog 已经读完一个文件,正在切换到下个文件 Waiting to finalize termination 等待结束(线程终止) 其中备机的IO线程状态可以通过SHOW SLAVE STATUS进行查看: 状态 描述 Connecting to master 尝试连接到主机 Checking master version 检查主机的版本 Registering slave on master 往主机注册备机 Requesting binlog dump 请求日志文件 Waiting to reconnect after a failed request 在请求失败后等待重新连接 Reconnecting after a failed binlog dump request 正在重连 Waiting for master to send event 等待主机发送数据 Queueing master event to the relay log 正在将数据拷贝到中继日志 Waiting to reconnect after a failed master event read 读取主机失败后等待重连 Reconnecting after a failed master event read 正在重连 Waiting for the slave SQL thread to free enough relay log space IO 正在等待sql线程执行后以便删除一些中继文件 Waiting for slave mutex on exit 等待进程退出 查看备机的SQL线程状态: 状态 描述 Reading event from the relay log 从relay log中读取日志 Has read all relay log; waiting for the slave I/O thread to update it 已读完中继日志,等待备机IO线程更新 Waiting for slave mutex on exit sql线程已经停止。 3.5 中继日志 中继日志文件缺省使用host_name-relay-bin.nnnnnn格式的文件名,n为序列号,从000001开始,备机使用索引文件来跟踪当前哪个文件正在使用,索引文件名称为host_name-relay-bin.index,此外,文件名称可以通过--relay-log 和--relay-log-index服务器选项进行设置。中继日志文件的格式和二进制日志的格式是一样的,可以使用mysqlbinlog进行查看。SQL线程在读取完全部的更新语句后自动删除relay日志文件。 在如下情况下,备机会创建一个relay日志文件: 1、每次IO线程启动时 2、使用FLULSH LOGS或者mysqladmin flush-logs命令 3、日志文件过大A:max_relay_log_size 大于0且达到了该值。B:max_relay_log_size为0且达到了max_binlog_size的值。 此外,备机还会创建如下两个状态文件:master.info和relay-log.info ,其文件名称可以通过 --master-info-file和 --relay-log-info-file选项进行修改。 状态文件中包含了SHOW SLAVE STATUS显示的内容,当备机下次启动时,会从状态文件中获取从主机读取到文件位置信息以及出来他自己的relay log的进度情况。 IO线程负责更新master.info文件。下边是各行内容和SHOW SLAVE STATUS的对应关系: 1 Number of lines in the file 2 Master_Log_File 3 Read_Master_Log_Pos 4 Master_Host 5 Master_User 6 Password (not shown by SHOW SLAVE STATUS) 7 Master_Port 8 Connect_Retry 9 Master_SSL_Allowed 10 Master_SSL_CA_File 11 Master_SSL_CA_Path 12 Master_SSL_Cert 13 Master_SSL_Cipher 14 Master_SSL_Key SQL线程复责更新relay-log.info文件,下边是各行内容和SHOW SLAVE STATUS的对应关系: 1 Relay_Log_File 2 Relay_Log_Pos 3 Relay_Master_Log_File 4 Exec_Master_Log_Pos 需要注意的是:备份备机的时候,除了中继文件之外,还需要备份这两个状态文件。若中继文件丢失了,可以使用CHANGE MASTER TO和MASTER_LOG_FILE、MASTER_LOG_POS选项来告诉备机从主机的哪个日志文件哪个位置进行读取。 若备机受LOAD DATA INFILE语句支配,则还需要备份目录中的SQL_LOAD-*文件,备机用该目录存储LOAD DATA INFILE语句使用的文件,以便能顺利执行该语句。其目录位置可以通过--slave-load-tmpdir来指定,若不指定,则使用tmpdir 系统变量的值。 3.6 自定义备份 主机可以控制哪些SQL写入日志、哪些不写入日志:--binlog-do-db和--binlog-ignore-db。备机根据--replicate-* 选项控制哪些语句不进行复制。 3.7 注意事项 在备份过程中需要尤其注意如下问题: 1、存储过程 2、临时表操作(语句级复制可以支持) 3、建表、改表语句(语句级复制可以支持) 4、AUTO_INCREMENT, LAST_INSERT_ID(), 以及TIMESTAMP的取值问题 5、USER(), UUID(), 以及 LOAD_FILE() 等函数在不同宿主机器上的取值问题 6、NOW(),SYSDATE()等语句在不同宿主机器上的时间差问题 7、若不想复制影响权限的更新,可以使用--replicate-wild-ignore-table=mysql.%选项忽略mysql数据库的操作。 第4章 格式分析 4.1 功能简介 本章只对mysql二进制日志的格式进行分析,格式的分析结果来源于mysql4.1.16版本的源码,对于其他版本,可能会略有差异,具体可以参考mysql的源码进行分析。 4.2 文件格式 以下部分的第N个字节均指从0开始的升序。 文件格式 长度 描述 文件头部 4字节 内容固定为:"\xfe\x62\x69\x6e" 事件信息 19字节 1、第0-3字节为执行事件的主机时间 2、第4个字节为事件类型 3、第5-8字节为主机服务进程ID 4、第9-12字节为长度部分(包含事件头部本身) 5、第13-16字节为事件在主机二进制文件中的物理文件位置 6、第17-18字节为16位的标志字段(参考输出格式部分) 长度由头部内容决定 剩余部分为事件内容部分 4.3 事件内容 事件类型 值 描述 START_EVENT 01 1、前19个字节为事件头部(参考文件格式部分) 2、第19-20字节为版本信息 3、第21-70字节为服务器版本信息 4、第71-74字节为创建时间 QUERY_EVENT 02 前边30个字节为辅助字段,其余为事件内容 1、前19个字节为事件头部(参考文件格式部分) 2、第19-22个字节为代理线程ID 3、第23-26字节为事件执行时间 4、第27个字节保存数据库名称的长度 5、第28-29字节为错误码 6、第30个字节开始为数据库名,具体长度由第27个字节决定 7、剩余部分:第一个字节为’\0’,剩余部分为具体的查询语句 ROTATE_EVENT 04 当切换到一个新的日志文件时记录(使用顺序文件序号时该事件被废除): 1、前19个字节为事件头部(参考文件格式部分) 2、20-27为位置信息(int64) 3、剩余部分为新日志文件的标识(文件名) INTVAR_EVENT 05 该事件用于记录特殊变量值,如自动增量值(auto_increment)和LAST_INSERT_ID 1、前19个字节为事件头部(参考文件格式部分) 2、第20个字节是类型字段 3、第21-28个字节是值 CREATE_FILE_EVENT 08 1、前19个字节为事件头部(参考文件格式部分) 2、第19-22个字节为代理线程ID 3、第23-26字节为事件执行时间 4、第27-30字节为略过前边的行数 5、第31个字节为表名称的长度(不含\0) 6、第32个字节为数据库名称的长度(不含\0) 7、第33-36个字节为字段数目 8、第37-40个字节文件ID 9、从第41个字节开始为LOAD选项的变长结构内容: A、头字节是字段分隔符长度,接下来是字段分隔符,长度由首字节指定 B、头字节是字符串引用符长度,接下来是字符串引用符号,长度由首字节指定 C、头字节是行分隔符长度,接下来是行分隔符号,长度由首字节指定 D、头字节是行起始符长度,接下来是行起始符号,长度由首字节指定 E、头字节是转义符长度,接下来是转义符号,长度由首字节指定 F、头字节为选项标记 G、头N个字节每个字节表示对应列名的长度(含\0),N为实际字段数目,接下来的内容为各个字段的名称,偏移由N个字节的长度决定; H、然后是表名称,到\0截止,长度和5中的表名称长度一致; I、然后是数据库名称,到\0截止,长度和6中的表名称长度一致; J、然后是文件名称,到\0截止 10、剩余部分为实际导入的文件内容 APPEND_BLOCK_EVENT 09 包含了用于LOAD DATA INFILE语句的数据,数据存储在备机的临时文件中。 1、前19个字节为事件头部(参考文件格式部分) 2、若事件长度不大于19,后续无数据,否则: A、接下来为4个字节的文件ID B、接下来的数据为数据块内容 EXEC_LOAD_EVENT 10 1、前19个字节为事件头部(参考文件格式部分) 2、若事件长度不大于19,后续无数据,否则: A、接下来为4个字节的文件ID DELETE_FILE_EVEN 11 当回滚一个LOAD DATA INFILE语句时会记录该事件,用于删除备机上的临时文件 1、前19个字节为事件头部(参考文件格式部分) 2、若事件长度不大于19,后续无数据,否则为4个字节的文件ID RAND_EVENT 13 1、前19个字节为事件头部(参考文件格式部分) 2、第20-27个字节为随机数种子1 3、第28-35个字节为随机数种子2 USER_VAR_EVENT 14 当执行查询时使用了用户变量时,在写查询日志之前,会先记录一个该事件: 1、前19个字节为事件头部(参考文件格式部分) 2、第20-23个字节为名称长度LEN 3、接下来是长度由LEN指定的名称字段。 A、若首字节为\0,表示名称为空,则类型为字符串结果,值的长度和值都为0 B、否则,接下来的字节为类型,然后是4个字节的字符集编号,然后是4字节的值长度,最后部分是实际的值。 第5章 附录 5.1 Mysql源码路径 bdb : bdb 系統 client : 命令行工具:mysql, mysqladmin, mysqlimport, mysqlbinlog, mysqlcheck, mysqldump dbug: 调试 Docs extra : heap : heap table 支持系統 include : 系统头文件 innobase : innodb 系統 isam : isam数据库文件格式支持 libmysql : libmysqlclient 库 libmysql_r : thread_safe版本的 libmysqlclient库 man : man page merge : isam数据库文件格式的 merge table支持 myisam : myisam数据库文件格式支持 myisammrg : myisam数据库文件格式的merge table支持 mysql-test : mysys : mysql 核心算法:文件打开,数据读写,內存分配,OS/2系统特别优化,线程控制,权限控制 ,Raid Table,动态字符串处理,队列算法,网络传输协议,初始化函数,错误处理,平衡二叉树算法,符号连接出来,唯一临时文件名生成,hash函数,排序算法,压缩传输协议。 os2 : readline : Gnu Readline library, version 4.0 regex : regex alpha3.4 release for mysql special edition scripts : sql : sql statements 的解析/實現 sql-bench : strings : mysql 重写的一些str函数,增加了一些判断等,还有一部分扩展函数 support-files : tests :

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档