ITPub博客

首页 > 数据库 > > 4.6 Mysql 管理工具程序

4.6 Mysql 管理工具程序

作者:飘絮絮絮丶 时间:2020-05-14 13:35:14 0 删除 编辑

4.6.1 innochecksum --理想 InnoDB 文件checksum 工具


innochecksum输出InnoDB文件的校验和。 该工具读取InnoDB表空间文件,计算每个页面的校验和,将计算的校验和与存储的校验和进行比较,并报告指示损坏页面的不匹配。 它最初是为了加速验证停电后表空间文件的完整性而开发的,但也可以在文件复制后使用。 由于校验不匹配会导致InnoDB故意关闭正在运行的服务器,因此最好使用此工具而不是等待生产服务器遇到损坏的页面。 从MySQL 5.7.2开始,innochecksum支持大于2GB的文件。 以前,innochecksum只支持最大2GB的文件。


从MySQL 5.7.2开始,innochecksum支持包含压缩页面的表空间。


innochecksum不能用于服务器已经打开的表空间文件。 对于这样的文件,您应该使用CHECK TABLE来检查表空间内的表。 试图在服务器已打开的表空间上运行innochecksum将导致“无法锁定文件”错误。


如果发现校验和不匹配,您通常会从备份中恢复表空间或启动服务器,并尝试使用mysqldump对表空间内的表进行备份。


调用 innochecksum 例如:

innochecksum [options] file_name



选项参考:

dev.mysql.com/doc/refma



4.6.2 myisam_ftdump --显示全文索引信息


myisam_ftdump显示有关MyISAM表中FULLTEXT索引的信息。 它直接读取MyISAM索引文件,因此它必须在表所在的服务器主机上运行。 在使用myisam_ftdump之前,如果服务器正在运行,请务必首先发出FLUSH TABLES语句。


myisam_ftdump扫描并转储整个索引,这并不是特别快。 另一方面,词的分配很少变化,所以它不需要经常运行。


如下调用 myisam_ftdump :

myisam_ftdump [options] 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:

myisam_ftdump mytexttable 1


如果测试数据库目录的路径名称是/ usr / local / mysql / data / test,那么也可以使用该路径名称指定表名称参数。 如果您不在数据库目录中调用myisam_ftdump,这非常有用:

shell> myisam_ftdump /usr/local/mysql/data/test/mytexttable 1


您可以使用myisam_ftdump在类Unix系统上按照出现频率的顺序生成索引条目列表:

shell> myisam_ftdump -c mytexttable 1 | sort -r


在 Windows 上,使用:

myisam_ftdump -c mytexttable 1 | sort /R



4.6.3 myisamchk --MyISAM Table-维护工具



myisamchk实用程序获取有关数据库表的信息或检查,修复或优化它们。 myisamchk与MyISAM表(适用于存储数据和索引的.MYD和.MYI文件的表)一起工作。



您还可以使用CHECK TABLE和REPAIR TABLE语句来检查和修复MyISAM表。


不支持myisamchk与分区表的使用。


导致:

在执行表修复操作之前,最好先备份表格; 在某些情况下,操作可能会导致数据丢失。 可能的原因包括但不限于文件系统错误。



调用myisamchk 如下:


shell> myisamchk [options] tbl_name ...


这些选项指定您希望myisamchk执行的操作。 它们在以下各节中进行介绍。 您也可以通过调用myisamchk --help来获得选项列表。


如果没有选项,myisamchk只会将您的表格视为默认操作。 要获得更多信息或告诉myisamchk采取纠正措施,请按照以下讨论中的说明指定选项。



tbl_name是要检查或修复的数据库表。 如果您在数据库目录以外的地方运行myisamchk,则必须指定数据库目录的路径,因为myisamchk不知道数据库位于何处。 事实上,myisamchk实际上并不关心你正在处理的文件是否位于数据库目录中。 您可以将对应于数据库表的文件复制到其他位置,并在其中执行恢复操作。



如果你愿意,你可以在myisamchk命令行上命名几个表。 您也可以通过命名其索引文件(具有.MYI后缀的文件)来指定一个表。 这使您可以使用* .MYI模式指定目录中的所有表。 例如,如果您位于数据库目录中,则可以像这样检查该目录中的所有MyISAM表:


myisamchk *.MYI



如果您不在数据库目录中,可以通过指定目录的路径来检查那里的所有表:

myisamchk /path/to/database_dir/*.MYI

你甚至可以通过指定一个通配符和MySQL数据目录的路径来检查所有数据库中的所有表:

shell> myisamchk /path/to/datadir/*/*.MYI

建议快速检查所有MyISAM表的方法是:

shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI


如果您想检查所有MyISAM表并修复任何已损坏的表,可以使用以下命令:

shell> myisamchk --silent --force --fast --update-state \ --key_buffer_size=64M --myisam_sort_buffer_size=64M \ --read_buffer_size=1M --write_buffer_size=1M \ /path/to/datadir/*/*.MYI


此命令假定您有超过64MB的空闲空间。


重要:

在运行myisamchk时,您必须确保没有其他程序正在使用这些表。 这样做的最有效方法是在运行myisamchk时关闭MySQL服务器,或者锁定myisamchk正在使用的所有表。


否则,当您运行myisamchk时,它可能会显示以下错误消息:

warning: clients are using or haven't closed the table properly



这意味着您正在尝试检查已被另一程序(如mysqld服务器)更新的表,该表尚未关闭文件,或者在没有正确关闭文件的情况下死亡,这有时会导致损坏 一个或多个MyISAM表。


如果mysqld正在运行,则必须使用FLUSH TABLES强制刷新仍在内存中缓存的所有表修改。 然后,您应确保在运行myisamchk时没有人使用这些表格


但是,避免此问题的最简单方法是使用CHECK TABLE而不是myisamchk来检查表。


--详细参数参考:

dev.mysql.com/doc/refma



4.6.4 myisamlog -- Display MyISAM Log File Contents



myisamlog处理MyISAM日志文件的内容。 要创建这样的文件,请使用--log-isam = log_file选项启动服务器。


使用 myisamlog 如下:

shell> myisamlog [options] [file_name [tbl_name] ...]


缺省操作是update(-u)。 如果恢复已完成(-r),则所有写入操作以及可能的更新和删除操作都已完成,并且只计算错误。 如果未给出log_file参数,则缺省日志文件名称为myisam.log。 如果在命令行上命名表,则只更新那些表。


myisamlog支持以下选项:


参考 dev.mysql.com/doc/refma



4.6.5 myisampack --生成压缩的只读MyISAM表



myisampack实用程序压缩MyISAM表。 myisampack通过分别压缩表中的每列来工作。 通常,myisampack将数据文件打包40%到70%。



稍后使用该表时,服务器会读取解压缩列所需的信息。 这在访问单个行时性能更好,因为您只需解压缩一行。


MySQL尽可能使用mmap()在压缩表上执行内存映射。 如果mmap()不起作用,MySQL将回退到正常的读/写文件操作。


请注意以下事项:


  • 如果在禁用外部锁定的情况下调用mysqld服务器,则在打包过程中如果表可能由服务器更新,则调用myisampack不是一个好主意。 在服务器停止的情况下压缩表是最安全的。
  • 打包表后,它变成只读。 这通常用于(例如,访问CD上的打包表格时)。
  • myisampack不支持分区表。




调用 myisampack 如下:

myisampack [options] file_name


每个文件名参数应该是索引(.MYI)文件的名称。 如果您不在数据库目录中,则应指定文件的路径名称。 允许省略.MYI扩展名。


在使用myisampack压缩表后,使用myisamchk -rq重建其索引。



详细的选项,可以参考:

dev.mysql.com/doc/refma





4.6.6 mysql_config_editor --Mysql 配置工具



mysql_config_editor程序使您能够将身份验证凭证存储在名为.mylogin.cnf的加密登录路径文件中。 文件位置是Windows上的%APPDATA%\ MySQL目录以及非Windows系统上当前用户的主目录。 MySQL客户端程序可以稍后阅读该文件,以获取用于连接到MySQL服务器的认证凭证。



.mylogin.cnf登录路径文件的未加密格式由选项组组成,与其他选项文件类似。 .mylogin.cnf中的每个选项组都称为“登录路径”,该组只允许某些选项:主机,用户,密码,端口和套接字。 将登录路径选项组想象为一组选项,指定要连接哪个MySQL服务器以及要认证哪个帐户。 这是一个未加密的例子:


[client]

user = mydefaultname

password = mydefaultpass

host = 127.0.0.1

[mypath]

user = myothername

password = myotherpass

host = localhost



当您调用客户端程序连接到服务器时,客户端将.mylogin.cnf与其他选项文件结合使用。 其优先级高于其他选项文件,但低于在客户机命令行上明确指定的选项。


要指定备用登录路径文件名,请设置MYSQL_TEST_LOGIN_FILE环境变量。 这个变量被mysql_config_editor,标准MySQL客户端(mysql,mysqladmin等等)和mysql-test-run.pl测试工具所识别。



程序使用登录路径文件中的组,如下所示:



  • 默认情况下,mysql_config_editor在客户端登录路径上运行,如果您指定了no --login-path = name选项来明确指明要使用的登录路径。




  • 如果没有--login-path选项,客户端程序将从其他选项文件读取的登录路径文件中读取相同的选项组。 考虑这个命令:



shell>mysql


默认情况下,mysql客户端从其他选项文件中读取[client]和[mysql]组,也从登录路径文件中读取它们。


  • 使用--login-path选项,客户端程序还会从登录路径文件中读取指定的登录路径。 从其他选项文件读取的选项组保持不变。 考虑这个命令:

shell> mysql --login-path=mypath


mysql客户端从其他选项文件读取[client]和[mysql],并从登录路径文件中读取[client],[mysql]和[mypath]。



  • 即使在使用--no-defaults选项时,客户端程序也会读取登录路径文件。 这允许以比命令行更安全的方式指定密码,即使--no-defaults存在。




mysql_config_editor对.mylogin.cnf文件进行加密,使其不能明文读取,并且客户端程序解密时的内容仅在内存中使用。 通过这种方式,密码可以以非明文格式存储在文件中,可以不必在命令行或环境变量中公开。 mysql_config_editor提供了用于显示登录路径文件内容的print命令,但即使在这种情况下,密码值也会被屏蔽,以免其他用户看到它们。



mysql_config_editor使用的加密可以防止密码作为明文出现在.mylogin.cnf中,并通过防止无意中泄漏密码来提供安全措施。 例如,如果您在屏幕上显示常规未加密的my.cnf选项文件,则其中包含的任何密码都可供任何人查看。 但使用的加密技术不会阻止确定的攻击者,您不应该认为它是不可破解的。 可以在您的计算机上获得系统管理权限以访问您的文件的用户可以通过一些努力来解密.mylogin.cnf文件。



登录路径文件必须对当前用户可读可写,并且其他用户无法访问。 否则,mysql_config_editor会忽略它,客户端程序也不会使用它。



调用 mysql_config_editor 如下:

shell> mysql_config_editor [program_options] command [command_options]



如果登录路径文件不存在,mysql_config_editor会创建它。


命令参数被给定如下:


  • program_options包含一般的mysql_config_editor选项。
  • command 指示对.mylogin.cnf登录路径文件执行什么操作。 例如,set将写入文件的登录路径,remove移除登录路径,print显示登录路径内容。
  • command_options指示特定于该命令的任何附加选项,例如登录路径名和在登录路径中使用的值。



命令名称在程序参数集中的位置很重要。 例如,这些命令行具有相同的参数,但会产生不同的结果:


shell> mysql_config_editor --help set

shell> mysql_config_editor set --help



第一行命令会显示一般 mysql_config_editor 帮助信息,并忽略 set命令。第二行显示指定set命令的帮助信息


假设您想要建立一个定义您的默认连接参数的客户端登录路径和一个名为remote的额外登录路径,以连接到主机http://remote.example.com的MySQL服务器。 您想要如下登录:


  • 默认情况下,使用localuser和localpass的用户名和密码到本地服务器
  • 使用 remoteuser 和 remotepass的用户名和密码到远程服务器



要在.mylogin.cnf文件中设置登录路径,请使用以下set命令。 在一行中输入每个命令,并在提示时输入适当的密码:

shell> mysql_config_editor set --login-path=client --host=localhost --user=localuser --password

Enter password: enter password "localpass" here

shell> mysql_config_editor set --login-path=remote --host=http://remote.example.com --user=remoteuser --password

Enter password: enter password "remotepass" here


要查看mysql_config_editor写入.mylogin.cnf文件的内容,请使用print命令:


shell> mysql_config_editor print --all

[client]

user = localuser

password = *****

host = localhost

[remote]

user = remoteuser

password = *****

host = http://remote.example.com



print命令将每个登录路径显示为一组以行方式括起来的表示登录路径名的组标题,后面跟随登录路径的选项值。 密码值被屏蔽.



如果未指定 - all以显示所有登录路径或--login-path = name以显示指定的登录路径,则print命令默认显示client登录路径(如果有)。


如上例所示,登录路径文件可以包含多个登录路径。 通过这种方式,mysql_config_editor可以很容易地设置多个“个性”来连接到不同的MySQL服务器,或者使用不同的帐户连接到给定的服务器。 在调用客户端程序时,可以使用--login-path选项通过名称选择其中的任何一种。 例如,要连接到远程服务器,请使用以下命令:



shell> mysql --login-path=remote

在这里,mysql从其他选项文件中读取[client]和[mysql]选项组,并从登录路径文件中读取[client],[mysql]和[remote]组。



要连接到本地服务器,使用这个命令:


shell> mysql --login-path=client



因为默认情况下mysql读取client和mysql登录路径,所以在这种情况下,--login-path选项不添加任何内容。 该命令与此相同:


shell> mysql



从登录路径文件读取的选项优先于从其他选项文件读取的选项。 从稍后出现在登录路径文件中的登录路径组中读取的选项优先于从文件中先前出现的组读取的选项。


mysql_config_editor按照创建它们的顺序将登录路径添加到登录路径文件中,因此您应该稍后创建更多通用登录路径的第一个和更具体的路径。 如果您需要在文件中移动登录路径,则可以将其删除,然后重新创建它以将其添加到最后。 例如,client登录路径更通用,因为它可以被所有客户端程序读取,而mysqldump登录路径只能被mysqldump读取。 稍后指定的选项会覆盖之前指定的选项,因此放入登录路径client,mysqldump的顺序可以让mysqldump特定的选项来覆盖client选项。



当您使用set命令与mysql_config_editor创建登录路径时,不需要指定所有可能的选项值( host name, user name, password, port, socket)。 只有给定的值才写入路径。 在调用连接到MySQL服务器的客户端路径时,可以在其他选项文件或命令行中指定稍后需要的任何缺失值。 在命令行中指定的任何选项将覆盖登录路径文件或其他选项文件中指定的选项。 例如,如果远程登录路径中的凭证也适用于主机http://remote2.example.com,请连接到该主机上的服务器,如下所示:


shell> mysql --login-path=remote --host=http://remote2.example.com



--详细选项参数:


dev.mysql.com/doc/refma



4.6.7 mysqlbinlog --用来处理 Binary Log 文件的工具




服务器的二进制日志由包含描述数据库内容修改的“事件”的文件组成。 服务器以二进制格式写入这些文件。 要以文本格式显示其内容,请使用mysqlbinlog程序。 您也可以使用mysqlbinlog在复制设置中显示从属服务器写入的中继日志文件的内容,因为中继日志具有与二进制日志相同的格式。


调用mysqlbinlog 如下:

shell> mysqlbinlog [options] 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


在第一行中,后面的数字表示二进制日志文件中事件的文件偏移量或起始位置。



第二行以日期和时间开始,指示语句何时在发生事件的服务器上启动。 对于复制,此时间戳会传播到从属服务器。 服务器标识是发生事件的服务器的server_id值。 end_log_pos指示下一个事件开始的位置(即,它是当前事件的结束位置+1)。 thread_id指示哪个线程执行了事件。 exec_time是在主服务器上执行事件所用的时间。 在从站上,从站的最终执行时间减去主站的开始执行时间。 差异可以作为主复制滞后的指标。 error_code指示执行事件的结果。 0意味着没有错误发生。



注意:

当使用事件组时,事件的文件偏移量可以被分组在一起,并且事件的注释可以被分组在一起。 不要将这些分组事件误认为空白文件偏移量。



mysqlbinlog的输出可以重新执行(例如,通过将它用作mysql的输入)来重做日志中的语句。 这对服务器崩溃后的恢复操作很有用。



通常,您使用mysqlbinlog直接读取二进制日志文件并将它们应用到本地MySQL服务器。 也可以使用--read-from-remote-server选项从远程服务器读取二进制日志。 要读取远程二进制日志,可以给出连接参数选项以指示如何连接到服务器。 这些选项是--host,--password,--port,--protocol,--socket和--user; 除非您还使用--read-from-remote-server选项,否则它们将被忽略。



当针对大型二进制日志运行mysqlbinlog时,请注意文件系统有足够的空间存放结果文件。 要配置mysqlbinlog用于临时文件的目录,请使用TMPDIR环境变量。


mysqlbinlog支持以下选项,可以在命令行或选项文件的[mysqlbinlog]和[client]组中指定。


--详细选项可以参考:

dev.mysql.com/doc/refma




您可以将mysqlbinlog的输出传递到mysql客户端以执行包含在二进制日志中的事件。 这种技术用于在有旧备份时从崩溃中恢复


shell> mysqlbinlog binlog.000001 | mysql -u root -p

或

shell> mysqlbinlog binlog.[0-9]* | mysql -u root -p



如果mysqlbinlog生成的语句可能包含BLOB值,那么当mysql处理它们时可能会导致问题。 在这种情况下,使用--binary-mode选项调用mysql。


如果您需要首先修改语句日志(例如,删除您不希望执行的语句),那么也可以将mysqlbinlog的输出重定向到文本文件。 编辑完文件后,使用它作为mysql程序的输入来执行它包含的语句:



shell> mysqlbinlog binlog.000001 > tmpfile

shell> ... edit tmpfile ...

shell> mysql -u root -p < tmpfile



当使用--start-position选项调用mysqlbinlog时,它只会显示二进制日志中偏移量大于或等于给定位置(给定位置必须与一个事件的开始匹配)的事件。 当它看到具有给定日期和时间的事件时,它也有停止和开始的选项。 这使您可以使用--stop-datetime选项执行时间点恢复(例如,可以说,“在今天上午10:30,将我的数据库滚动到今天的状态”)。


如果您在MySQL服务器上有多个二进制日志要执行,那么安全的方法是使用到服务器的单一连接来处理它们。 下面是一个演示可能不安全的例子:

shell> mysqlbinlog binlog.000001 | mysql -u root -p #DANGER!!

shell> mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!

--自己来控制前滚的sql 操作


如果第一个日志文件包含CREATE TEMPORARY TABLE语句,而第二个日志包含使用临时表的语句,则使用与服务器的多个连接以这种方式处理二进制日志会导致问题。 当第一个mysql进程终止时,服务器删除临时表。 当第二个mysql进程尝试使用该表时,服务器会报告“未知表”。



为了避免这样的问题,可以使用一个mysql进程来执行您想要处理的所有二进制日志的内容。 这是一种方法:

shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p


--一次性处理所有的binlog文件


另一种方法是将所有日志写入单个文件,然后处理该文件:


shell> mysqlbinlog binlog.000001 > /tmp/statements.sql shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql shell> mysql -u root -p -e "source /tmp/statements.sql"


--先重定向到单一文件,在一次性执行


mysqlbinlog可以产生重现LOAD DATA INFILE操作的输出,而不需要原始数据文件。 mysqlbinlog将数据复制到临时文件并写入引用该文件的LOAD DATA LOCAL INFILE语句。 这些文件写入目录的默认位置是系统特定的。 要明确指定目录,请使用--local-load选项。



因为mysqlbinlog将LOAD DATA INFILE语句转换为LOAD DATA LOCAL INFILE语句(即它添加了LOCAL),所以用于处理语句的客户端和服务器必须配置为启用LOCAL功能。



警告:

为LOAD DATA LOCAL语句创建的临时文件不会自动删除,因为在您真正执行这些语句之前需要它们。 在不再需要语句日志后,您应该自己删除临时文件。 这些文件可以在临时文件目录中找到,并具有像original_file_name - # - #这样的名称。




例子:mysqldump+mysqlbinlog 来备份和重建


以下示例描述了一个简单的场景,演示了如何将mysqldump和mysqlbinlog一起用于备份服务器的数据和二进制日志,以及如何在发生数据丢失时使用备份来还原服务器。 该示例假定服务器在主机host_name上运行,并且其第一个二进制日志文件名为binlog.000999。 在一行中输入每个命令。


使用mysqlbinlog对二进制日志进行连续备份:


mysqlbinlog --read-from-remote-server --host=host_name --raw --stop-never binlog.000999


使用mysqldump创建一个转储文件作为服务器数据的快照。 使用--all-databases,--events和 --routines备份所有数据,使用--master-data = 2将当前二进制日志坐标包含在转储文件中。


mysqldump --host=host_name --all-databases --events --routines --master-data=2> dump_file


定期执行mysqldump命令以根据需要创建较新的快照。


如果发生数据丢失(例如,如果服务器崩溃),请使用最近的转储文件来恢复数据:


mysql --host=host_name -u root -p < dump_file


然后使用二进制日志备份重新执行在转储文件中列出的坐标之后写入的事件。 假设文件中的坐标如下所示:


-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.001002', MASTER_LOG_POS=27284;


如果最新的备份日志文件名为binlog.001004,请重新执行日志事件,如下所示:


mysqlbinlog --start-position=27284 binlog.001002 binlog.001003 binlog.001004 | mysql --host=host_name -u root -p


您可能会发现将备份文件(转储文件和二进制日志文件)复制到服务器主机更容易,以便执行还原操作




4.6.8 mysqldumpslow --总结慢速查询日志文件


MySQL慢速查询日志包含有关需要很长时间才能执行的查询的信息。 mysqldumpslow解析MySQL慢查询日志文件并打印其内容摘要。



通常,mysqldumpslow 组查询非常相似,除了数字和字符串数据值。 它在显示汇总输出时将这些值“抽象”为N和“S”。 -a和-n选项可用于修改值抽象行为。



调用mysqldumpslow 如下:


shell> mysqldumpslow [options] [log_file ...]


--详细选项参考如下:

dev.mysql.com/doc/refma

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3119119/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42248