MySQL8.0大师之路:第10章:MySQL程序详解-10.4 管理和工具程序
1.ibd2sdi — InnoDB表空间SDI提取实用程序(就是用来查看数据库表 xxx.ibd 的底层(元数据)信息)ibd2sdi是一个用于从InnoDB表空间文件中提取 序列化字典信息(serialized dictionary information,SDI)的实用程序。所有持久性InnoDB表空间文件中都存在SDI数据。
ibd2sdi可以在 file-per-table 表空间文件(* .ibd文件),常规表空间(general tablespace)文件(* .ibd文件),系统表空(system tablespace)间文件(ibdata *文件)和数据字典表空间(data dictionary tablespace)(mysql.ibd)上运行。不支持将其与临时表空间或撤消表空间一起使用。
ibd2sdi可以在运行时或服务器脱机时使用。在与SDI相关的DDL操作,ROLLBACK操作和撤消日志清除操作期间,ibd2sdi无法读取存储在表空间中的SDI数据的时间间隔可能很短。
ibd2sdi从指定的表空间执行未提交的SDI读取。无法访问重做日志和撤消日志。
像这样调用ibd2sdi实用程序:
shell> ibd2sdi file_name1
ibd2sdi支持多文件表空间,例如InnoDB系统表空间,但是不能一次在多个表空间上运行。对于多文件表空间,请指定每个文件:
shell> ibd2sdi ibdata1 ibdata2
多文件表空间的文件必须按照升序页码的顺序指定。如果两个连续的文件具有相同的空间ID,则后一个文件必须以前一个文件的最后页号+ 1开头。
ibd2sdi以JSON格式输出SDI(包含id,type和data字段)。
2.innochecksum —脱机InnoDB文件校验和实用程序 (这个程序必须脱机使用)
innochecksum打印InnoDB文件的校验和。该工具读取InnoDB表空间文件,计算每个页面的校验和,将计算出的校验和与存储的校验和进行比较,并报告不匹配项,以指示损坏的页面。它最初是为加速断电后验证表空间文件的完整性而开发的,但也可以在文件复制后使用。因为校验和不匹配会导致InnoDB故意关闭正在运行的服务器,所以最好使用此工具,而不是等待生产中的服务器遇到损坏的页面。
innochecksum不能用于服务器已打开的表空间文件。对于此类文件,应使用CHECK TABLE来检查表空间中的表。尝试在服务器已打开的表空间上运行innochecksum,将导致“无法锁定文件”错误。
如果发现校验和不匹配,通常可以从备份中还原表空间或启动服务器,然后尝试使用mysqldump对表空间中的表进行备份。
像这样调用innochecksum:
shell> innochecksum file_name
注意:Windows操作系统不支持在同一表空间中的多个文件上运行innochecksum,因为Windows shell(例如cmd.exe)不支持glob模式扩展。在Windows系统上,必须为每个系统表空间文件单独运行innochecksum。
cmd> innochecksum.exe ibdata1
cmd> innochecksum.exe ibdata2
cmd> innochecksum.exe ibdata3
3.myisam_ftdump —显示全文索引信息
myisam_ftdump在MyISAM表中显示有关FULLTEXT索引的信息。它直接读取MyISAM索引文件,因此它必须在表所在的服务器主机上运行。在使用myisam_ftdump之前,如果服务器正在运行,请确保首先发出FLUSH TABLES语句。 myisam_ftdump扫描并转储整个索引,这并不是特别快。另一方面,单词的分布很少变化,因此不必经常运行。
像这样调用myisam_ftdump:
shell> myisam_ftdump tbl_name index_num
tbl_name参数应该是MyISAM表的名称。您还可以通过命名表的索引文件(后缀为.MYI的文件)来指定表。如果您没有在表文件所在的目录中调用myisam_ftdump,则表或索引文件名必须以表数据库目录的路径名开头。索引号以0开头。
示例:假设测试数据库包含一个名为mytexttable的表,该表具有以下定义:
CREATE TABLE mytexttable
(
id INT NOT NULL,
txt TEXT NOT NULL,
PRIMARY KEY (id),
FULLTEXT (txt)
) ENGINE=MyISAM;
id上的索引是索引0,而txt上的FULLTEXT索引是索引1。如果您的工作目录是测试数据库目录,请按如下所示调用myisam_ftdump:
shell> myisam_ftdump mytexttable 1
如果测试数据库目录的路径名是/ usr / local / mysql / data / test,则还可以使用该路径名指定表名参数。如果您不在数据库目录中调用myisam_ftdump,这将很有用:
shell> myisam_ftdump /usr/local/mysql/data/test/mytexttable 1
结果:
# pwd
/usr/local/mysql/data/school
# myisam_ftdump mytexttable 1
Total rows: 0
Total words: 0
Unique words: 0
Longest word: 0 chars ()
Median length: 0
Average global weight: -nan
Most common word: 0 times, weight: 0.000000 (
4.myisamchk — MyISAM表维护实用程序
myisamchk实用程序获取有关您的数据库表或检查,修复或优化它们的信息。 myisamchk使用MyISAM表(具有.MYD和.MYI文件用于存储数据和索引的表)。您还可以使用CHECK TABLE和REPAIR TABLE语句来检查和修复MyISAM表。
不支持将myisamchk与分区表一起使用。
提示:最好在执行表修复操作之前先备份表。在某些情况下,该操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。
像这样调用myisamchk:
shell> myisamchk tbl_name ...
这些选项指定您希望myisamchk要做的事情。以下各节将对它们进行描述。
您还可以通过调用myisamchk --help来获得选项列表。
如果没有选项,myisamchk只会将表作为默认操作进行检查。获得更多信息或告知myisamchk采取纠正措施,请按照以下说明指定选项讨论。
tbl_name是您要检查或修复的数据库表。
如果您在某个地方运行myisamchk除了在数据库目录中,您必须指定数据库目录的路径,因为myisamchk不知道数据库的位置。
实际上,myisamchk实际上并不在乎您正在处理的文件是否位于数据库目录中。
您可以复制将数据库表对应到其他位置并对其执行恢复操作那里。
如果愿意,可以在myisamchk命令行上命名几个表。您还可以指定一个表通过命名其索引文件(后缀为.MYI的文件)命名。这样,您就可以在目录使用* .MYI模式。
例如,如果您在数据库目录中,则可以检查所有该目录中的MyISAM表如下所示:
shell> myisamchk *.MYI
注意这里的MYI,如果报错(myisamchk: error: 140 when opening MyISAM-table 'mytexttable.MYI')可以省略
提示:在运行myisamchk时,必须确保没有其他程序在使用这些表。这样做的最有效方法是在运行myisamchk时关闭MySQL服务器,或锁定正在使用myisamchk的所有表。否则,当您运行myisamchk时,它可能会显示以下错误消息:警告:客户端正在使用或尚未正确关闭该表。这意味着您正在尝试检查已由另一个程序(例如mysqld)更新的表。服务器)尚未关闭文件或在未正确关闭文件的情况下死亡,这有时会导致一个或多个MyISAM表损坏。
如果mysqld正在运行,则必须使用FLUSH TABLES强制其刷新仍在内存中缓冲的所有表修改。然后,您应确保在运行myisamchk时没有人使用表。但是,避免此问题的最简单方法是使用CHECK TABLE而不是myisamchk来检查表
myisamchk支持以下选项,可以在命令行或选项文件的组中指定这些选项。
5.myisamlog-显示MyISAM日志文件的内容
myisamlog处理MyISAM日志文件的内容。要创建这样的文件,请使用--log-isam = log_file选项启动服务器。
像这样调用myisamlog:
shell> myisamlog ...]
默认操作是更新(-u)。如果恢复完成(-r),则所有写操作以及可能的更新和删除操作都将完成,并且仅计算错误。如果未指定log_file参数,则默认日志文件名称为myisam.log。如果在命令行上命名表,则仅更新那些表。
6.myisampack —生成压缩的只读MyISAM表
myisampack实用程序压缩MyISAM表。 myisampack通过分别压缩表中的每一列来工作。通常,myisampack将数据文件打包40%到70%。以后使用该表时,服务器会将解压缩列所需的信息读入内存。当访问单个行时,这将导致更好的性能,因为您只需要精确地解压缩一行即可。 MySQL尽可能使用mmap()对压缩表执行内存映射。如果mmap()不起作用,则MySQL将退回到正常的读/写文件操作。
请注意以下事项:
•如果在禁用外部锁定的情况下调用mysqld服务器,则如果在打包过程中服务器可能更新了表,则最好不要调用myisampack。在服务器停止的情况下压缩表是最安全的。
•打包桌子后,它变成只读的。这通常是有意的(例如,访问CD上的打包表时)。
•myisampack不支持分区表。
像这样调用myisampack:
shell> myisampack file_name ...
每个文件名参数都应该是索引(.MYI)文件的名称。如果您不在数据库目录中,则应指定文件的路径名。可以省略.MYI扩展名。用myisampack压缩表后,使用myisamchk -rq重建其索引。
7.mysql_config_editor — MySQL配置实用程序
mysql_config_editor实用程序使您可以将身份验证凭据存储在名为.mylogin.cnf的模糊登录路径文件中。文件位置在Windows上是%APPDATA%\ MySQL目录,在非Windows系统上是当前用户的主目录。稍后,MySQL客户端程序可以读取该文件,以获得用于连接到MySQL Server的身份验证凭据。
.mylogin.cnf登录路径文件的清晰格式包含选项组,与其他选项文件类似。 .mylogin.cnf中的每个选项组都称为“登录路径”,该组仅允许某些选项:主机,用户,密码,端口和套接字。将登录路径选项组视为一组选项,用于指定要连接到哪个MySQL服务器以及要作为身份验证的帐户。
这是一个清晰的示例:
user = mydefaultname
password = mydefaultpass
host = 127.0.0.1
user = myothername
password = myotherpass
host = localhost
当您调用客户端程序以连接到服务器时,客户端将.mylogin.cnf与其他选项文件结合使用。它的优先级高于其他选项文件,但低于客户端命令行上显式指定的选项。要指定备用登录路径文件名,请设置MYSQL_TEST_LOGIN_FILE环境变量。 mysql_config_editor,标准MySQL客户端(mysql,mysqladmin等)以及mysql-test-run.pl测试实用程序均可识别此变量。
默认情况下,mysql客户端从其他选项文件中读取和组,因此它也从登录路径文件中读取它们。
•使用--login-path选项,客户端程序还从登录路径文件中读取命名的登录路径。从其他选项文件读取的选项组保持不变。
考虑以下命令:
shell> mysql --login-path = mypath
mysql客户端从其他选项文件读取和,并从登录路径文件读取,和。
•即使使用--no-defaults选项,客户端程序也会读取登录路径文件。即使存在--no-defaults,这也允许以比在命令行上更安全的方式指定密码。
mysql_config_editor对.mylogin.cnf文件进行模糊处理,因此无法将其读取为明文,并且在客户端程序未对其进行混淆时,其内容仅在内存中使用。
这样,密码可以以非明文格式存储在文件中,并在以后使用,而无需在命令行或环境变量中公开。
mysql_config_editor提供了一个用于显示登录路径文件内容的打印命令,但是即使在这种情况下,密码值也会被屏蔽,以便永远不会以其他用户可以看到的方式出现。
mysql_config_editor所使用的混淆处理可防止密码以明文形式出现在.mylogin.cnf中,并通过防止无意中暴露密码来提供安全措施。
例如,如果您在屏幕上显示一个普通的,未混淆的my.cnf选项文件,则任何人都可以看到它包含的所有密码,这样使用.mylogin.cnf,那是不正确的。
但是使用的混淆不会阻止坚定的攻击者,因此您不应认为它是坚不可摧的。可以在您的计算机上获得系统管理特权以访问您的文件的用户,可以通过一些努力来使.mylogin.cnf文件变得模糊。登录路径文件对于当前用户必须是可读和可写的,其他用户不可访问。否则,mysql_config_editor会忽略它,并且客户端程序也不会使用它。
像这样调用mysql_config_editor:
shell> mysql_config_editor command
8.mysqlbinlog-处理二进制日志文件的实用程序
服务器的二进制日志由包含“事件”的文件组成,这些事件描述了对数据库内容的修改。服务器以二进制格式写入这些文件。要以文本格式显示其内容,请使用mysqlbinlog实用程序。您还可以使用mysqlbinlog在复制设置中显示由从属服务器写入的中继日志文件的内容,因为中继日志的格式与二进制日志相同。
像这样调用mysqlbinlog:
shell> mysqlbinlog log_file ...
例如,要显示名为binlog.000003的二进制日志文件的内容,请使用以下命令:
shell> mysqlbinlog binlog.0000003
输出包括binlog.000003中包含的事件。对于基于语句的日志记录,事件信息包括SQL语句,在其上执行该语句的服务器的ID,该语句在执行时的时间戳,所花费的时间等等。对于基于行的日志记录,该事件指示行更改,而不是SQL语句。
事件之前有提供附加信息的标题注释。
例如:
# at 141
#100309 9:28:36 server id 123 end_log_pos 245
Query thread_id=3350 exec_time=11 error_code=0
在第一行中,后面的数字表示二进制日志文件中事件的文件偏移量或起始位置。
第二行以日期和时间开头,该日期和时间指示语句在事件起源的服务器上何时开始。为了进行复制,此时间戳会传播到从服务器。服务器ID是事件起源的服务器的server_id值。 end_log_pos指示下一个事件的开始位置(即,当前事件的结束位置+ 1)。 thread_id指示哪个线程执行了该事件。 exec_time是在主服务器上执行事件所花费的时间。在从站上,它是从站上的结束执行时间减去主站上的开始执行时间的差。差异可作为复制落后于母版多少的指标。 error_code指示执行事件的结果。零表示没有错误发生。
注意:使用事件组时,可以将事件的文件偏移量分组在一起,并且可以将事件的注释分组在一起。请勿将这些分组的事件误认为空白文件偏移量。
可以重新执行mysqlbinlog的输出(例如,将其用作mysql的输入),以重做日志中的语句。这对于服务器崩溃后的恢复操作很有用。为了执行mysqlbinlog使用的内部使用的BINLOG语句,用户需要BINLOG_ADMIN或SUPER特权,或者REPLICATION_APPLIER特权加上适当的特权才能执行每个日志事件。
您可以使用mysqlbinlog直接读取二进制日志文件,并将其应用于本地MySQL服务器。您也可以使用--read-from-remote-server选项从远程服务器读取二进制日志。要读取远程二进制日志,可以指定连接参数选项以指示如何连接到服务器。这些选项是--host,--password,--port,--protocol,--socket和--user。
从MySQL 8.0.14起可以对二进制日志文件进行加密后,mysqlbinlog无法直接读取它们,但是可以使用--read-fromremote-server选项从服务器读取它们。当服务器的binlog_encryption系统变量设置为ON时,二进制日志文件将被加密。 SHOW BINARY LOGS语句显示特定的二进制日志文件是加密的还是未加密的。还可以使用加密日志文件(0xFD62696E)的文件头开头的魔术数字来区分加密和未加密的二进制日志文件,该数字不同于未加密日志文件(0xFE62696E)的数字。请注意,从MySQL 8.0.14起,如果您尝试直接读取加密的二进制日志文件,则mysqlbinlog返回一个适当的错误,但是较早版本的mysqlbinlog根本无法将其识别为二进制日志文件。
对大型二进制日志运行mysqlbinlog时,请注意文件系统有足够的空间容纳生成的文件。要配置mysqlbinlog用于临时文件的目录,请使用TMPDIR环境变量。
在执行任何SQL语句之前,mysqlbinlog将pseudo_slave_mode的值设置为true。此系统变量影响XA事务的处理,original_commit_timestamp复制延迟时间戳记和original_server_version系统变量以及不支持的SQL模式。
mysqlbinlog支持以下选项,可以在命令行或选项文件的和组中指定。
9.mysqldumpslow —汇总慢查询日志文件
MySQL慢查询日志包含有关执行时间较长的查询的信息。 mysqldumpslow解析MySQL慢查询日志文件并总结其内容。
通常,mysqldumpslow将类似于数字和字符串数据值的特定值的查询分组。显示摘要输出时,会将这些值“抽象”为N和'S'。要修改值抽象行为,请使用-a和-n选项。
像这样调用mysqldumpslow:
shell> mysqldumpslow
分析慢查询日志,需要开启慢查询日志,查看是否开启慢查询日志:
mysql> show variables like 'slow_query_log';
如果没有开启,可以在配置文件中开启。是否启用慢速查询日志。该值可以为0(或OFF)以禁用日志,或为1(或ON)以启用日志。日志输出的目的地由log_output系统变量控制;如果该值为NONE,则即使启用了日志,也不会写入任何日志条目。
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/logs/slow.log #如果您没有为慢速查询日志文件指定名称,则默认名称为host_name-slow.log。除非给出绝对路径名以指定其他目录,否则服务器将在数据目录中创建文件。
long_query_time = 1 #long_query_time的最小值和默认值分别为0和10
开启后,需要重新启动服务器。
页:
[1]