linux
mysql主从日志格式?
一、mysql主从日志格式?
statement:历史比较悠久。会记录完整的sql语句。binlog空间比较小,跨库操作丢失数据。针对一些函数uuid,rand() 不安全性 (SBR,statement based replication)
row:安全性很高,不会出现丢失数据的情况。binlog空间占用比较大,会记录每行操作的语句。mysql5.6 binlog_rows_query_log_events 开启也可以看到完整sql语句了。在生产中建议使用row这种binlog记录格式 (RBR,row based replication)
二、怎么查看mysql日志?
1、首先确认你日志是否启用了mysql>show variables like 'log_bin'。
2、如果启用了,即ON,那日志文件就在mysql的安装目录的data目录下。
3、怎样知道当前的日志mysql> show master status。
4、看二进制日志文件用mysqlbinlog,shell>mysqlbinlog mail-bin.000001或者shell>mysqlbinlog mail-bin.000001 | tail,Windows 下用类似的。
MySQL的日志操作:
1、首先,登陆mysql后,执行sql语句:show variables like 'log_bin'。
2、#错误日志log-errol开启方式:在my.ini的[mysqld]选项下:添加代码:log-error=E:\log-error.txt。
记录内容:主要是记录启动、运行或停止mysqld时出现的致命性问题,都是系统级的错误记录。
3、#查询日志:log,开启方式:在my.ini的[mysqld]选项下:添加代码:log=E:/mysql_log.txt。
4、#二进制日志:log-bin,开启方式:在my.ini的[mysqld]选项下:添加代码:log-bin=E:/mysql_log_bin,记录内容:主要是记录所有的更改数据的语句,可使用mysqlbinlog命令恢复数据。
三、MySQL怎么清除日志?
mysql如果开启binlog日志,长时间就会积累很多占用磁盘空间的binlog日志。
一般清理这些日志就可以达到节省磁盘空间的要求。
首先登录mysql
mysql> show binary logs;
mysql> purge binary logs to 'mysql-bin.000098';
mysql> show binary logs;
这样你就发现mysql-bin.000098之前的mysql-binlog日志都已经删除了。
如果平时用不到mysql-bin log日志,可以在
my.cnf
里面注销关闭,然后重启mysql就不产生binlog日志了。但是平时我们如果遇到数据需要回复,还是最好能开启binlog日志,这样数据回复的时候就有一个保障。四、MySQL日志管理详解?
MySQL 8.0 重新定义了错误日志输出和过滤,改善了原来臃肿并且可读性很差的错误日志。比如增加了 JSON 输出,在原来的日志后面以序号以及 JSON 后缀的方式展示。比如我机器上的 MySQL 以 JSON 保存的错误日志 mysqld.log.00.json:[root@centos-ytt80 mysql80]# jq . mysqld.log.00.json{ "log_type": 1, "prio": 1, "err_code": 12592, "subsystem": "InnoDB", "msg": "Operating system error number 2 in a file operation.", "time": "2019-09-03T08:16:12.111808Z", "thread": 8, "err_symbol": "ER_IB_MSG_767", "SQL_state": "HY000", "label": "Error"}{ "log_type": 1, "prio": 1, "err_code": 12593, "subsystem": "InnoDB", "msg": "The error means the system cannot find the path specified.", "time": "2019-09-03T08:16:12.111915Z", "thread": 8, "err_symbol": "ER_IB_MSG_768", "SQL_state": "HY000", "label": "Error"}{ "log_type": 1, "prio": 1, "err_code": 12216, "subsystem": "InnoDB", "msg": "Cannot open datafile for read-only: './ytt2/a.ibd' OS error: 71", "time": "2019-09-03T08:16:12.111933Z", "thread": 8, "err_symbol": "ER_IB_MSG_391", "SQL_state": "HY000", "label": "Error"}以 JSON 输出错误日志后可读性和可操作性增强了许多。这里可以用 Linux 命令 jq 或者把这个字串 COPY 到其他解析 JSON 的工具方便处理。只想非常快速的拿出错误信息,忽略其他信息。[root@centos-ytt80 mysql80]# jq '.msg' mysqld.log.00.json"Operating system error number 2 in a file operation.""The error means the system cannot find the path specified.""Cannot open datafile for read-only: './ytt2/a.ibd' OS error: 71""Cannot calculate statistics for table `ytt2`.`a` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.""Cannot calculate statistics for table `ytt2`.`a` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue."使用 JSON 输出的前提是安装 JSON 输出部件。
INSTALL COMPONENT 'file://component_log_sink_json';
完了在设置变量 SET GLOBAL log_error_services = 'log_filter_internal; log_sink_json';
格式为:过滤规则;日志输出;[过滤规则]日志输出;查看安装好的部件mysql> select * from mysql.component;+--------------+--------------------+---------------------------------------+| component_id | component_group_id | component_urn |+--------------+--------------------+---------------------------------------+| 2 | 1 | file://component_log_sink_json |+--------------+--------------------+---------------------------------------+3 rows in set (0.00 sec)
现在设置 JSON 输出,输出到系统日志的同时输出到 JSON 格式日志。mysql> SET persist log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';Query OK, 0 rows affected (0.00 sec)
来测试一把。我之前已经把表 a 物理文件删掉了。mysql> select * from a;ERROR 1812 (HY000): Tablespace is missing for table `ytt2`.`a`.
现在错误日志里有 5 条记录。
[root@centos-ytt80 mysql80]# tailf mysqld.log
2019-09-03T08:16:12.111808Z 8 [ERROR] [MY-012592] [InnoDB] Operating system error number 2 in a file operation.
2019-09-03T08:16:12.111915Z 8 [ERROR] [MY-012593] [InnoDB] The error means the system cannot find the path specified.
2019-09-03T08:16:12.111933Z 8 [ERROR] [MY-012216] [InnoDB] Cannot open datafile for read-only: './ytt2/a.ibd' OS error: 71
2019-09-03T08:16:12.112227Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `ytt2`.`a` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
2019-09-03T08:16:14.902617Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `ytt2`.`a` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
JSON 日志里也有 5 条记录。
[root@centos-ytt80 mysql80]# tailf mysqld.log.00.json
{ "log_type" : 1, "prio" : 1, "err_code" : 12592, "subsystem" : "InnoDB", "msg" : "Operating system error number 2 in a file operation.", "time" : "2019-09-03T08:16:12.111808Z", "thread" : 8, "err_symbol" : "ER_IB_MSG_767", "SQL_state" : "HY000", "label" : "Error" }
{ "log_type" : 1, "prio" : 1, "err_code" : 12593, "subsystem" : "InnoDB", "msg" : "The error means the system cannot find the path specified.", "time" : "2019-09-03T08:16:12.111915Z", "thread" : 8, "err_symbol" : "ER_IB_MSG_768", "SQL_state" : "HY000", "label" : "Error" }
{ "log_type" : 1, "prio" : 1, "err_code" : 12216, "subsystem" : "InnoDB", "msg" : "Cannot open datafile for read-only: './ytt2/a.ibd' OS error: 71", "time" : "2019-09-03T08:16:12.111933Z", "thread" : 8, "err_symbol" : "ER_IB_MSG_391", "SQL_state" : "HY000", "label" : "Error" }
{ "log_type" : 1, "prio" : 2, "err_code" : 12049, "subsystem" : "InnoDB", "msg" : "Cannot calculate statistics for table `ytt2`.`a` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.", "time" : "2019-09-03T08:16:12.112227Z", "thread" : 8, "err_symbol" : "ER_IB_MSG_224", "SQL_state" : "HY000", "label" : "Warning" }
{ "log_type" : 1, "prio" : 2, "err_code" : 12049, "subsystem" : "InnoDB", "msg" : "Cannot calculate statistics for table `ytt2`.`a` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.", "time" : "2019-09-03T08:16:14.902617Z", "thread" : 8, "err_symbol" : "ER_IB_MSG_224", "SQL_state" : "HY000", "label" : "Warning" }
那可能有人就问了,这有啥意义呢?只是把格式变了,过滤的规则我看还是没变。那我们现在给第二条日志输出加过滤规则先把过滤日志的部件安装起来
INSTALL COMPONENT 'file://component_log_filter_dragnet';
mysql> SET persist log_error_services = 'log_filter_internal; log_sink_internal; log_filter_dragnet;log_sink_json';
Query OK, 0 rows affected (0.00 sec)
只保留 error,其余的一律过滤掉。SET GLOBAL dragnet.log_error_filter_rules = 'IF prio>=WARNING THEN drop.';
检索一张误删的表mysql> select * from a;ERROR 1812 (HY000): Tablespace is missing for table `ytt2`.`a`.
查看错误日志和 JSON 错误日志发现错误日志里有一条 Warning,JSON 错误日志里的被过滤掉了。2019-09-03T08:22:32.978728Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `ytt2`.`a` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
再举个例子,每 60 秒只允许记录一个 Warning 事件mysql> SET GLOBAL dragnet.log_error_filter_rules = 'IF prio==WARNING THEN throttle 1/60.';Query OK, 0 rows affected (0.00 sec)
多次执行mysql> select * from b;ERROR 1812 (HY000): Tablespace is missing for table `ytt2`.`b`.mysql> select * from b;ERROR 1812 (HY000): Tablespace is missing for table `ytt2`.`b`.mysql> select * from b;ERROR 1812 (HY000): Tablespace is missing for table `ytt2`.`b`.
现在错误日志里有三条 warning 信息
2019-09-03T08:49:06.820635Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `ytt2`.`b` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
2019-09-03T08:49:31.455907Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `ytt2`.`b` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
2019-09-03T08:50:00.430867Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `ytt2`.`b` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
mysqld.log.00.json 只有一条{ "log_type" : 1, "prio" : 2, "err_code" : 12049, "subsystem" : "InnoDB", "msg" : "Cannot calculate statistics for table `ytt2`.`b` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.", "time" : "2019-09-03T08:49:06.820635Z", "thread" : 8, "err_symbol" : "ER_IB_MSG_224", "SQL_state" : "HY000", "and_n_more" : 3, "label" : "Warning" }
总结,我这里简单介绍了下 MySQL 8.0 的错误日志过滤以及 JSON 输出。MySQL 8.0 的component_log_filter_dragnet 部件过滤规则非常灵活,可以参考手册,根据它提供的语法写出自己的过滤掉的日志输出。
五、mysql日志
MySQL日志:保障数据库安全的重要措施
随着互联网的快速发展和数据规模的不断扩大,数据库的安全性变得尤为重要。MySQL作为广泛使用的关系型数据库管理系统,具备了很好的稳定性和可靠性。而MySQL日志系统,则是保障数据库安全的重要措施之一。下面,我们将详细了解MySQL日志系统以及它对数据库安全的重要作用。
什么是MySQL日志?
MySQL日志是MySQL数据库管理系统用来记录数据库活动的机制。它记录了对数据库进行的各种操作,包括数据更改、事务操作、错误发生等。MySQL日志有五种类型:
- 错误日志 (error log):记录了MySQL服务启动和运行过程中出现的错误。
- 查询日志 (query log):记录对数据库执行的查询语句。
- 慢查询日志 (slow query log):记录执行时间超过阈值的查询语句。
- 二进制日志 (binary log):记录了对数据库进行的所有更改操作,用于数据恢复、主从复制等。
- 事务日志 (transaction log):记录了数据库的事务操作,用于崩溃恢复和回滚。
MySQL日志对数据库安全的重要作用
MySQL日志对数据库安全具有以下重要作用:
1. 数据完整性保护
通过MySQL日志,可以追踪数据库的变更记录,包括数据的插入、更新和删除。当出现数据异常或错误时,可以通过分析日志找到问题的根源,保证数据的完整性。此外,MySQL的事务日志还可以用于回滚操作,确保在事务执行失败或中断时,数据库的一致性得到保障。
2. 故障恢复和数据复原
MySQL的二进制日志是一种高效的恢复机制。当数据库发生故障或系统崩溃时,可以通过二进制日志进行数据恢复。同时,二进制日志还支持数据库的主从复制,通过在主库上生成二进制日志并传递给从库,实现数据的备份和复制,增加数据库的容灾能力。
3. 安全审计与追责
MySQL的查询日志和慢查询日志记录了所有对数据库执行的查询语句,可以用于安全审计和追责。通过分析查询日志,可以发现并定位潜在的安全威胁,尽早采取相应的安全措施。同时,慢查询日志还可以帮助优化数据库性能,提高查询效率。
4. 异常和错误排查
MySQL的错误日志记录了服务启动和运行过程中出现的错误信息,有助于排查异常和错误。当数据库出现问题时,通过分析错误日志可以快速定位和解决问题,减少系统停机时间。
配置MySQL日志
为了充分利用MySQL日志系统,我们需要对其进行适当配置。以下是一些常见的配置技巧:
1. 错误日志配置
通过在MySQL的配置文件中设置log_error
选项,可以指定错误日志的路径和文件名。例如:log_error=/var/log/mysql/error.log
,将错误日志记录在/var/log/mysql/
目录下的error.log
文件中。
2. 查询日志配置
查询日志会记录所有执行的查询语句,包括敏感信息。因此,默认情况下是不开启的。可以通过设置general_log
和general_log_file
选项开启查询日志,并指定日志文件的路径。例如:general_log=1
和general_log_file=/var/log/mysql/query.log
。
3. 慢查询日志配置
慢查询日志记录执行时间超过阈值的查询语句。可以通过设置slow_query_log
和slow_query_log_file
选项开启慢查询日志,并指定日志文件路径。同时,还可以设置long_query_time
选项来定义阈值,默认为10秒。
4. 二进制日志配置
二进制日志记录了所有对数据库的更改操作。可以通过设置log_bin
选项开启二进制日志。同时,还可以设置expire_logs_days
选项来定义日志保留的天数。
5. 事务日志配置
事务日志是InnoDB存储引擎特有的日志文件。可以通过设置innodb_log_file_size
和innodb_log_files_in_group
选项来配置事务日志的大小和数量。
总结
MySQL日志系统是保障数据库安全的重要措施。通过记录数据库的各种操作和活动,MySQL日志能够保障数据的完整性和一致性,支持故障恢复和数据复原,帮助安全审计和追责,以及异常和错误排查。为了发挥MySQL日志的作用,我们需要适当配置各类日志,并定期对日志进行分析和审查,确保数据库的安全性和稳定性。
六、mysql 日志
MySQL 日志:优化数据库性能、故障排查和数据恢复的关键工具
MySQL是一种常用的关系型数据库管理系统,可用于存储和管理大量结构化数据。无论是开发Web应用程序,还是运营庞大的企业数据库,深入了解和有效地利用MySQL日志是提高数据库性能、故障排查和数据恢复的关键工具。
什么是MySQL日志?
MySQL日志是MySQL数据库引擎记录数据库操作的一种机制。日志可以用于回滚数据更改、恢复数据库、分析性能问题以及跟踪错误等。MySQL包括多个类型的日志,各具不同的作用:
- 二进制日志(Binary Log):记录所有对数据库的更改操作,以二进制格式存储,可用于数据恢复和复制。
- 错误日志(Error Log):记录MySQL服务器产生的错误信息和异常情况,帮助诊断和解决问题。
- 查询日志(Query Log):记录所有MySQL服务器接收到的查询语句,用于分析查询性能和访问模式。
- 慢查询日志(Slow Query Log):记录执行时间超过阈值的查询语句,帮助优化慢查询。
- 事务日志(Transaction Log):记录数据库的事务操作,包括启动事务、提交和回滚等。
为什么MySQL日志对性能优化至关重要?
MySQL日志对于性能优化非常重要,因为它能够提供关键的信息来分析和理解数据库的行为以及查询的性能。通过仔细分析日志,我们可以发现潜在的性能瓶颈,并采取相应的措施来提高数据库的响应速度。以下是MySQL日志对性能优化的重要性:
- 识别慢查询:通过慢查询日志,我们可以找到执行时间超过预定阈值的查询语句。这些慢查询可能是由于索引缺失、查询语句写法不佳或者数据库配置不当等原因导致的。通过优化这些查询,可以显著提高数据库的性能。
- 监控数据库性能:通过查询日志和二进制日志,我们可以监控数据库的性能表现和访问模式。通过分析日志,我们可以了解哪些查询频繁访问数据库,哪些查询消耗最多的时间和资源,并做出相应的优化和调整。
- 数据库故障排查:错误日志记录了数据库服务的异常情况和错误信息。通过仔细查看错误日志,我们可以及时发现和解决数据库故障,保障数据库的可靠性和稳定性。
- 数据恢复和复制:二进制日志记录了所有对数据库的更改操作。当数据库出现故障或数据丢失时,通过分析二进制日志可以进行数据恢复和复制,确保数据的完整性。
如何配置和管理MySQL日志?
配置和管理MySQL日志是数据库管理人员必备的技能。以下是一些常见的配置和管理MySQL日志的方法和技巧:
1. 配置参数文件
MySQL的配置参数文件(my.cnf或my.ini)包含了各种配置选项,包括日志相关的设置。通过编辑参数文件,可以指定日志的位置、开启或关闭特定类型的日志,并调整其他与日志相关的参数。
2. 开启二进制日志
在参数文件中,可以设置log_bin
参数来开启二进制日志。开启二进制日志后,MySQL会将所有对数据库的更改操作记录到二进制日志中。通过二进制日志,可以进行数据恢复和复制。
3. 配置错误日志
错误日志记录了MySQL服务器产生的错误信息和异常情况。可以通过log_error
参数指定错误日志的位置。建议将错误日志配置为写入独立的文件,并定期查看错误日志以及及时解决出现的问题。
4. 开启查询日志和慢查询日志
查询日志记录了MySQL服务器接收到的所有查询语句,慢查询日志则记录了执行时间超过阈值的查询语句。可以通过配置general_log
和slow_query_log
参数来开启查询日志和慢查询日志。需要注意的是,开启查询日志和慢查询日志会影响性能,因此在生产环境中应谨慎使用。
5. 查看和分析日志文件
通过命令行工具或者图形化界面,可以查看和分析MySQL日志文件。可以使用mysqlbinlog
命令查看二进制日志内容,使用mysqldumpslow
命令分析慢查询日志,使用tail
命令实时监控错误日志等。
总结
MySQL日志是优化数据库性能、故障排查和数据恢复的关键工具。通过仔细分析日志,我们可以识别慢查询、监控数据库性能、排查故障并进行数据恢复和复制。配置和管理MySQL日志需要一定的技巧和经验,但通过合理配置和灵活使用日志,可以提高数据库的性能和可靠性。
七、如何删除mysql日志文件?
如果没有主从复制,可以通过resetmaster的方式,重置数据库日志,清除之前的日志文件: ?代码如下 mysql>resetmaster; 还有一各就是在my.cnf里配置。 ?代码如下 expire_logs_days=3 二进制日志自动删除的天数。这里设置了自动清除3天前的logs。 默认值为0,表示“没有自动删除”。
八、如何分析Linux日志?
一般两种类型日志: 永久日志rsyslog 临时日志system.journald
临时日志 查看 journalctl -f 参数可追踪实时日志
永久日志保存在/etc/log 目录下,通过修改 /etc/rsyslog.conf参数可定义不同日志的输出路径
配置路径格式: 设备名 . 优先级 ; 例外 路径
例如 *.info;mail.none;authpriv.none;cron.none /var/log/messages
表示的是 :所有日志 优先级在info以上包含info 除去mail authpriv cron的日志保存在/var/log/messages中
常用日志
message 系统信息日志
sercue 安全审计日志
Boot.log 系统启动日志
dmesg 硬件检测日志 (此日志只能用dmesg命令查看)
yum.log 所有通过yum安装的软件的安装日志
wtmp 用户登录登出记录 (用last查看)
查看日志可用cat 或者 more 命令
九、centos 日志清理
Centos 日志清理指南
在维护服务器时,日志管理是至关重要的一环。Centos 作为一款广泛应用的操作系统,其日志文件可能会逐渐占据大量磁盘空间,影响系统运行。因此,定期对 Centos 服务器中的日志进行清理是必不可少的工作。
本文将指导您如何在 Centos 系统上进行日志清理,以确保服务器持续高效稳定地运行。
为什么清理日志是必要的?
日志文件记录了系统的运行状态、错误信息以及用户行为等重要信息。随着时间的推移,日志文件会不断增长,占据大量磁盘空间。当磁盘空间不足时,可能会导致系统运行缓慢甚至崩溃。因此,定期清理日志是维护服务器的基本操作之一。
如何清理日志文件?
下面是在 Centos 系统上清理日志文件的常用步骤:
- 查看日志文件大小:使用du命令查看日志文件所占磁盘空间,确定是否需要清理。
- 备份重要日志:在清理之前,务必备份重要的日志文件,以防误删造成损失。
- 清理日志文件:可以使用rm命令删除不再需要的日志文件。注意,删除日志文件可能会影响系统的运行,建议谨慎操作。
- 定时清理:建议设置定时任务,定期清理日志文件,保持系统整洁有序。
清理日志的注意事项:
在清理日志文件时,需要注意以下几个问题:
- 不要轻易删除系统关键日志,以免造成系统故障。
- 谨慎操作,避免误删重要文件。
- 建议在清理前做好备份工作,以备不时之需。
日志清理的好处:
定期清理日志文件有以下几个好处:
- 释放磁盘空间,提升系统性能。
- 减少不必要的日志信息,便于后期查找和分析。
- 降低系统崩溃的风险,提高系统稳定性。
结语
日志清理是服务器维护中的重要一环,通过定期清理日志文件,可以有效提升服务器性能,降低系统风险。希望本文能帮助您更好地管理 Centos 系统中的日志文件,保证服务器的稳定运行。
十、mysql支持linux吗?
MySQL支持linux操作系统的。MySQL是一个开源免费的关系型数据库管理系统,它可以运行在多种操作系统上。它有WINDOWS版本,有linux版本,还有其他unix版本。
你可以在linux操作系统上安装MySQL,然后从Linux系统访问或者其他系统访问都是没有问题的。也可以用Linux系统作为客户端访问在任何操作系统上安装的MySQL数据库。
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...