日志管理+二进制日志文件(gtid)

1. 错误日志

1.1 作用

MySQL 启动及工作过程中,状态\报错\警告.

1.2 如何配置

select @@log_error;
>>默认是在datadir=/data/3306/data/hostname.err
>修改方式:
vim /etc/my.cnf    
log_error=/data/3306/data/mysql.log           添加一行此数据

1.3 如何查看错误日志?

关注日志文件中"[error]"的内容

2. 二进制日志

2.1 作用

数据恢复必备的日志
主从复制依赖的日志

2.2 怎么配置

>>① 修改配置文件
vim /etc/my.cnf
server_id=6
log_bin=/data/binlog/mysql-bin         
注释:/data/binlog是文件路径,mysql-bin是文件前缀
--- 这个最好不要和数据放在一个盘,和数据一样重要
>>② 创建目录并授权
[root@db01 data]# mkdir -p /data/binlog
[root@db01 data]# chown -R mysql.mysql /data/binlog
>>③ 重启数据库

2.3 二进制日志记录了什么?

2.3.1 引入

除了查询类的语句,都会被记录。
所有数据路变更类的语句。

2.3.2 记录语句的种类

DDL:数据定义语言
DCL:数据控制语言
DML:数据操作语言

2.3.3 不同语句记录格式说明

DDL,DCL:直接以语句(statement)方式记录
DML语句:insert,update,delete

mysql[world]>select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| ROW             |
+-----------------+
1 row in set (0.00 sec)
--- 一共有三种类型
SBR(statement):做什么记录什么
RBR(row):记录了数据行的变化,默认模式(推荐)
MBR(mixed):混合模式,自动判断记录模式

面试题:说明SBR和RBR的区别
SBR(statement):做什么记录什么,记录的SQL语句,可读性强,日志量相对较少,日志记录可能不准确
RBR(row):记录了数据行的变化,默认模式(推荐),可读性差,日志量大,日志记录准确

2.3.4 binlog events(二进制日志事件)

(1) 简介
二进制日志内容以事件为最小记录单元。
对于DDL和DCL,一个语句就是一个事件
对于DML(标准的事务语句):只记录已提交的事务DML语句

begin;      事件1
a;          事件2
b;          事件3
commit;     事件4

(2) 事件的构成

>>查看二进制命令
[root@db01 binlog]# mysqlbinlog mysql-bin.000001 
#at 219                    事件开始的位置(position)
#190814 18:46:58           事件发生的时间
create database xinixn     事件内容
# End of log file          事件结束的位置
>>中间的set可以省略
2.3.5 二进制日志的基本查看

(1) 查看二进制日志的配置信息

mysql[world]>show variables like '%log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/binlog/mysql-bin       |
| log_bin_index                   | /data/binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF                          |
| log_bin_use_v1_row_events       | OFF                          |
| sql_log_bin                     | ON                           |
+---------------------------------+------------------------------+
6 rows in set (0.00 sec)

(2) 查看二进制日志基本信息

>>查看二进制文件
mysql[world]>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       319 |
+------------------+-----------+
1 row in set (0.00 sec)

>>查看当前正在使用的二进制文件
mysql[world]>show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      319 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

(3) 查看二进制日志的事件信息

>>先查看正在使用的二进制日志
mysql[world]>show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      319 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
>>在查看内容信息
mysql[world]>show binlog events in 'mysql-bin.000001';
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         6 |         123 | Server ver: 5.7.26-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids |         6 |         154 |                                       |
| mysql-bin.000001 | 154 | Anonymous_Gtid |         6 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000001 | 219 | Query          |         6 |         319 | create database xinixn                |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
4 rows in set (0.00 sec)
--- set 信息可以忽略不计 ---

2.4 对二进制日志内容查看和截取

2.4.1 内容查看命令
[root@db01 binlog]$ mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001
2.4.2 日志的截取
--start-position                      开始日志
--stop-postion                        结束日志

>>测试:
---   测试建一个表,随便写入数据  ---
mysql[(none)]>create database binlog charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql[binlog]>create table t1(id int)engine=innodb charset=utf8mb4;
Query OK, 0 rows affected (0.35 sec)
mysql[binlog]>insert into t1 values(1),(2),(3),(11),(12),(13);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0
mysql[binlog]>update t1 set id=10 where id>10;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

---  删除库  ---
mysql[binlog]>drop database binlog;
Query OK, 1 row affected (0.37 sec)

--- 查看二进制日志恢复数据库 ---
--- 确认起点和终点,查看二进制日志,从建库开始
mysql[(none)]>show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1423 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql[(none)]>show binlog events in 'mysql-bin.000001';
+------------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                               |
+------------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| mysql-bin.000001 |    4 | Format_desc    |         6 |         123 | Server ver: 5.7.26-log, Binlog ver: 4                              |
| mysql-bin.000001 |  123 | Previous_gtids |         6 |         154 |                                                                    |
| mysql-bin.000001 |  154 | Anonymous_Gtid |         6 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                               |
| mysql-bin.000001 |  219 | Query          |         6 |         319 | create database xinixn                                             |
| mysql-bin.000001 |  319 | Anonymous_Gtid |         6 |         384 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                               |
| mysql-bin.000001 |  384 | Query          |         6 |         500 | create database binlog charset utf8mb4                             |
| mysql-bin.000001 |  500 | Anonymous_Gtid |         6 |         565 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                               |
| mysql-bin.000001 |  565 | Query          |         6 |         695 | use `binlog`; create table t1(id int)engine=innodb charset=utf8mb4 |
| mysql-bin.000001 |  695 | Anonymous_Gtid |         6 |         760 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                               |
| mysql-bin.000001 |  760 | Query          |         6 |         834 | BEGIN                                                              |
| mysql-bin.000001 |  834 | Table_map      |         6 |         881 | table_id: 112 (binlog.t1)                                          |
| mysql-bin.000001 |  881 | Write_rows     |         6 |         946 | table_id: 112 flags: STMT_END_F                                    |
| mysql-bin.000001 |  946 | Xid            |         6 |         977 | COMMIT /* xid=42 */                                                |
| mysql-bin.000001 |  977 | Anonymous_Gtid |         6 |        1042 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                               |
| mysql-bin.000001 | 1042 | Query          |         6 |        1116 | BEGIN                                                              |
| mysql-bin.000001 | 1116 | Table_map      |         6 |        1163 | table_id: 112 (binlog.t1)                                          |
| mysql-bin.000001 | 1163 | Update_rows    |         6 |        1229 | table_id: 112 flags: STMT_END_F                                    |
| mysql-bin.000001 | 1229 | Xid            |         6 |        1260 | COMMIT /* xid=44 */                                                |
| mysql-bin.000001 | 1260 | Anonymous_Gtid |         6 |        1325 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                               |
| mysql-bin.000001 | 1325 | Query          |         6 |        1423 | drop database binlog                                               |
+------------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
20 rows in set (0.00 sec)
--- 起点为384-1325
--- 截取日志
[root@db01 binlog]$ mysqlbinlog --start-position=384 --stop-position=1325 /data/binlog/mysql-bin.000001 >/data/bin.sql

--- 恢复日志 ---
mysql[(none)]>set sql_log_bin=0;           临时关闭当前会话的binlog记录
Query OK, 0 rows affected (0.00 sec)
mysql[(none)]>source /data/bin.sql         使用source命令恢复
Query OK, 0 rows affected (0.00 sec)

>>扩展:如何过滤日志中某个单一的库或者表
mysqlbinlog -d binlog --start-position=384 --stop-position=1325 /data/binlog/mysql-bin.000001 >/data/bin.sql          >>-d 指定某一个库
--- 可以借中间库恢复所有表,导出单一的表
--- 生产中恢复代价太大。可以配合其他备份手段恢复。

2.5 基于gtid的binlog管理(扩展)

2.5.0 引入

5.6版本以后,binlog加入了新的日志记录方式,GTID

主要作用:

  • 简化binlog截取
  • 提供在主从复制中的高级功能

5.7版本之后,进行了GTID增强

  • 主从性能,高可用环境,集群
2.5.1 什么是gtid(Global Transaction ID)

全局唯一的事务编号

幂等性:

  • GTID:Server_uuid:Tx_id
2.5.2 配置
mysql[(none)]>show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | OFF       |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | OFF       |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
8 rows in set (0.01 sec)

mysql[(none)]>show variables like '%log_slave_updates%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| log_slave_updates | OFF   |
+-------------------+-------+
1 row in set (0.00 sec)

vim /etc/my.cnf
gtid_mode=on                                gtid开关
enforce_gtid_consistency=true               强制GTID一致性
log_slave_updates=1                         主从复制从库记录binlog,并同意GTID信息
2.5.3 查看gtid日志信息

DDL,DCL一个操作就是一个DTID
DML,一个完整的事务就是一个GTID

mysql[(none)]>show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000004 |      615 |              |                  | c4e0cd26-b75c-11e9-b4d8-000c2992bac2:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
mysql[binlog]>show binlog events in 'mysql-bin.000004';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                              |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000004 |   4 | Format_desc    |         6 |         123 | Server ver: 5.7.26-log, Binlog ver: 4                             |
| mysql-bin.000004 | 123 | Previous_gtids |         6 |         154 |                                                                   |
| mysql-bin.000004 | 154 | Gtid           |         6 |         219 | SET @@SESSION.GTID_NEXT= 'c4e0cd26-b75c-11e9-b4d8-000c2992bac2:1' |
| mysql-bin.000004 | 219 | Query          |         6 |         300 | drop database db                                                  |
| mysql-bin.000004 | 300 | Gtid           |         6 |         365 | SET @@SESSION.GTID_NEXT= 'c4e0cd26-b75c-11e9-b4d8-000c2992bac2:2' |
| mysql-bin.000004 | 365 | Query          |         6 |         469 | create database db charset utf8mb4                                |
| mysql-bin.000004 | 469 | Gtid           |         6 |         534 | SET @@SESSION.GTID_NEXT= 'c4e0cd26-b75c-11e9-b4d8-000c2992bac2:3' |
| mysql-bin.000004 | 534 | Query          |         6 |         615 | drop database db                                                  |
| mysql-bin.000004 | 615 | Gtid           |         6 |         680 | SET @@SESSION.GTID_NEXT= 'c4e0cd26-b75c-11e9-b4d8-000c2992bac2:4' |
| mysql-bin.000004 | 680 | Query          |         6 |         774 | create database dbdb                                              |
| mysql-bin.000004 | 774 | Gtid           |         6 |         839 | SET @@SESSION.GTID_NEXT= 'c4e0cd26-b75c-11e9-b4d8-000c2992bac2:5' |
| mysql-bin.000004 | 839 | Query          |         6 |         924 | drop database dbdb                                                |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
12 rows in set (0.00 sec)

1 row in set (0.00 sec)

2.5.4 基于gtid截取日志
--skip-gtids                跳过检查gtid已记录信息
--include-gtids=            导入gtid记录id
--exclude-gtids=            跳过gtid记录id
>> 截取1-3号事务:
[root@db01 ~]$ mysqlbinlog --include-gtids='545fd699-be48-11e9-8f0a-000c2980e248:1-3' /data/binlog/mysql-bin.000009>/data/gtid.sql
>> 截取 1-10 gtid事务,跳过6号和8号事务.
[root@db01 ~]$ mysqlbinlog --include-gtids='545fd699-be48-11e9-8f0a-000c2980e248:1-10 --exclude-gtids='545fd699-be48-11e9-8f0a-000c2980e248:6,545fd699-be48-11e9-8f0a-000c2980e248:8'    /data/binlog/mysql-bin.000009>/data/gtid.sql
2.5.5 演练
>>准备环境
mysql[binlog]>create database gtid charset utf8mb4;
Query OK, 1 row affected (0.00 sec)

mysql[binlog]>use gtid
Database changed
mysql[gtid]>create table t1 (id int) engine=innodb charset=utf8mb4;
Query OK, 0 rows affected (0.18 sec)

mysql[gtid]>insert into t1 values(1),(2),(3),(11),(22),(33);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql[gtid]>select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   11 |
|   22 |
|   33 |
+------+
6 rows in set (0.00 sec)

mysql[gtid]>comint;
mysql[gtid]>show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000004 |     1570 |              |                  | c4e0cd26-b75c-11e9-b4d8-000c2992bac2:1-8 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

>> 截取日志
mysql[(none)]>set sql_log_bin=0;      临时关闭当前日志记录
Query OK, 0 rows affected (0.00 sec)
--- 导出二进制日志文件
[root@db01 data]$ mysqlbinlog --skip-gtids --include-gtids='c4e0cd26-b75c-11e9-b4d8-000c2992bac2:12-14' /data/binlog/mysql-bin.000004 >/data/gtid.sql 
--- 恢复日志
mysql[(none)]>source /data/gtid.sql;
Query OK, 0 rows affected (0.00 sec)

2.6 二进制日志其他操作

2.6.1 自动清理日志
show variables like '%exprie%';
mysql[xinxin]>select @@expire_logs_days;      查看自动清理时间
+--------------------+
| @@expire_logs_days |
+--------------------+
|                  0 |
+--------------------+
1 row in set (0.00 sec)

>>自动清理(15天的自动删除)
vim /etc/my.cnf
expire_logs_days=15
--- 企业建议,至少保留两个全备周期+1的binlog

>>手动清理
PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
PURGE BINARY LOGS TO 'mysql-bin.000009';
2.6.2 清理mysql-bin日志文件,从头开始记录
>>清理mysql-bin日志文件,从1开始记录(不建议,主从必崩)。
reset master;
2.6.3 binlog的滚动日志
>>binlog的滚动(重启自动滚动,日志大小1G会自动滚动)
mysql[xinxin]>flush logs;
Query OK, 0 rows affected (0.06 sec)

mysql[xinxin]>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1446 |
| mysql-bin.000002 |       346 |
| mysql-bin.000003 |       177 |
| mysql-bin.000004 |      2856 |
| mysql-bin.000005 |       194 |
+------------------+-----------+
5 rows in set (0.00 sec)

>>查看滚动日志大小
mysql[xinxin]>select @@max_binlog_size;
+-------------------+
| @@max_binlog_size |
+-------------------+
|        1073741824 |
+-------------------+
1 row in set (0.00 sec)
--- 备份时,某些参数会触发.

3. 慢日志(slow-log)

3.1 简介

记录运行较慢的语句,记录到slowlog中。
功能是辅助优化的工具日志
应急性的慢 ----> show processlist;
一段时间慢 ----> slow记录,统计。

3.2 配置

show variables like '%slow%';
vim /etc/my.cnf
slow_query_log=1                                     $开启记录            
slow_query_log_file=/data/3306/data/db01-slow.log    $指定记录位置
long_query_time=0.1                                  $指定执行多久属于慢
log_queries_not_using_indexes                        $记录不使用索引的语句


>>查看是多长时间属于慢(默认单位秒)
mysql[xinxin]>select @@long_query_time;
+-------------------+
| @@long_query_time |
+-------------------+
|         10.000000 |
+-------------------+
1 row in set (0.00 sec)

mysql[xinxin]>show variables like '%not_using_indexes%';
+----------------------------------------+-------+
| Variable_name                          | Value |
+----------------------------------------+-------+
| log_queries_not_using_indexes          | OFF   |
| log_throttle_queries_not_using_indexes | 0     |
+----------------------------------------+-------+
2 rows in set (0.00 sec)

3.3 慢语句模拟

t100w.sql文件放在/tmp下(点击下载)

mysql[test]>set sql_log_bin=0;
mysql[test]>source /tmp/t100w.sql
mysql[test]>set sql_log_bin=1;

3.4 分析处理慢语句

[root@db01 data]$ mysqldumpslow -s c -t 5 /data/3306/data/db01-slow.log

3.5 自己扩展一下

pt-query-digest  /data/3306/data/db01-slow.log 

集成: pt-query-digest+Anemometer=WEB方式:(分析慢日志,二进制日志,错误日志...)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容