提供7*24专业Sybase数据库远程及现场技术支持,Sybase ASE及Sybase SQL Anywhere数据库修复服务,
请联系电话: (微信),QQ: 289965371!
We supply technical support for Sybase ASE and Sybase SQL Anywhere, also have many years of experience in recovering data from damanged Sybase devices.
Please contact us:
Phone:
Wechat: 13811580958
QQ: 289965371 联系我们获取数据库技术支持!
Email: 289965371@qq.com
扫描下方微信,联系我们:
扫描雨翰数据恢复官方微信获取专业数据库恢复服务

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从https://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站https://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 联系我们获取数据库技术支持!
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

更新操作如何运行

根据对用于定位行的索引和数据所做更改的不同, Adaptive Server 会采 用不同的方法进行更新。两种主要的更新类型是延迟更新直接更新Adaptive Server 会尽可能执行直接更新。


直接更新


Adaptive Server 在单一的传递中执行直接更新:

定位受影响的索引和数据行。

将更改的日志记录写入事务日志中。

更改数据页和任何受影响的索引页。


有三种执行直接更新的技术:

现场更新

简易直接更新

昂贵的直接更新

和延迟更新相比,直接更新能限制日志扫描的数量、减少日志记录、减 少 B 树索引的浏览 (减少锁争用),所以其所需开销更少,而且通常速 度更快。另外,还因为 Adaptive Server 不必重新读取页以执行基于日志 记录的修改,所以也能节省 I/O


现场更新


Adaptive Server 会在任何可能的时候执行现场更新。

Adaptive Server 执行现场更新时,页上后续的行不会被移动;行 ID 保 持不变并且行偏移表中的指针不会改变。

对于现场更新,必须满足下列要求:

不能改变被更改行的长度。

正在更新列不能是所有页锁定表上聚簇索引的键,或键的一部分。 因为所有页锁定表上聚簇索引中的行按键顺序进行存储,所以键的 改变也就总是意味着行位置的改变。

一个索引必须是唯一的,多个索引必须允许重复。

• update 语句满足 29 页的 “通过连接对更新模式的约束” 中列出 的条件。

受影响的列不用于参照完整性。

在列上不能存在触发器。

表不能 (通过 Replication Server)被复制。

现场更新是最快的更新类型,因为它仅对数据页进行一次更改。它通 过删除旧的索引行并插入新的索引行,来改变所有受影响的索引条目。 现场更新只影响到那些键被更新所改变的索引,因为页和行的位置没 有改变。


简易直接更新


如果 Adaptive Server 不能执行现场更新,它会尝试执行简易直接更新— 更改行并在页上的相同偏移位置重写该行。将页上的后续行上下移动, 以使页上的数据保持连续性,但行 ID 不变。行偏移表中的指针更改以 反映新的位置。

简易直接更新必须满足下列要求:

行中的数据长度发生了变化,但行仍然在同一数据页上,或是行的 长度未改变,但复制了表或表中一个触发器。

正在更新的列不能是聚簇索引的键,或键的一部分。因为 Adaptive Server 将按键顺序存储聚簇索引行,所以键的改变也就总是意味着 行位置的改变。

一个索引必须是唯一的,多个索引必须允许重复。

update 语句满足 29 页的 “通过连接对更新模式的约束” 中列出 的条件。

受影响的列不用于参照完整性。

简易直接更新的速度几乎与现场更新同样快。它们需要相同数量的 I/O, 但简易直接更新所需处理要稍微多一些。它对数据页进行两次更改 (行 和偏移表)。任何被改动的索引键都是通过删除旧值和插入新值而更新。 简易直接更新只影响到那些键被更新所改变的索引,因为页和行的 ID 没有改变。


昂贵的直接更新


如果数据不在同一页上, Adaptive Server 会执行昂贵的直接更新 (如有 可能)。昂贵的直接更新将删除数据行 (包括所有索引条目),然后插 入已修改的行和索引条目。

Adaptive Server 使用表扫描或索引来在其初始位置找到行,然后将其删 除。如果表带有聚簇索引, Adaptive Server 则使用索引来确定行的新位 置;否则, Adaptive Server 将新行插入到堆的末尾。

昂贵的直接更新必须满足下列要求:

行数据长度改变了,所以行不再位于同一数据页上,而是移动到了 不同的页,或是该更新影响到了聚簇索引的键列。

用于查找行的索引未被更新更改。

update 语句满足 29 页的 “通过连接对更新模式的约束” 中列出 的条件。

受影响的列不用于参照完整性。


昂贵的直接更新是最慢的直接更新类型。它在某一数据页上执行 delete, 却在另一数据页上执行 insert。所有的索引条目都必须更新,因为行位 置发生了更改。


延迟更新


当不能满足直接更新条件时, Adaptive Server 使用延迟更新。延迟更新 是最慢的更新类型。

在延迟更新中, Adaptive Server

定位受影响的数据行,并在定位行时将数据页延迟的删除和插入写 入日志记录。

读取事务的日志记录,并对数据页和任何受影响的索引行执行删除 操作。

再次读取日志记录,对数据页上执行所有插入操作,插入所有受影 响的索引行。


何时需要使用延迟更新

下列情况下总是需要使用延迟更新:

使用自连接的更新

对用于自参照完整性的列进行更新

对在相关子查询中被引用的表进行更新 下列情况下也需要使用延迟更新:

某个更新操作将某一行移动到新页上,并通过表扫描或聚簇索引对 表进行访问。

表中不允许出现重复行,并且没有唯一索引来防止这种情况的出现。

用于查找数据行的索引不是唯一的,并且由于更新改变了聚簇索引 键或是新行不在该页上,而导致了行的移动。

和直接更新相比,延迟更新需要更大的开销,因为后者要求 Adaptive Server 重新读取事务日志以对数据和索引进行最终更改。这涉及到了对 索引树额外浏览。

例如,如果 title 上具有聚簇索引,则此查询执行延迟更新:

update titles set title = "Portable C Software" where title = "Designing Portable Software"


延迟索引插入


当更新影响到用于访问表的索引或某个唯一索引中的列时, Adaptive Server 执行延迟索引更新。在此类更新中, Adaptive Server

删除直接模式中的索引条目

更新直接模式中的数据页,写入索引的延迟插入记录。

读取事务日志记录,并将新值插入延迟模式的索引中。

当更新更改了用于查找行的索引或影响到某个唯一索引时,必须使用延 迟索引插入模式。查询只能对一个限定行更新一次 — 延迟索引更新模 式可确保在索引扫描期间一行只找到一次,并且查询不会过早地与唯一 约束发生冲突。

28 页的图 1-3 中的更新只更改姓氏,但索引行从一页移到了下一页。 要执行更新, Adaptive Server

1 读取索引页 1133,从该页删除对应于 “Greene”的索引行,并将延 迟索引扫描的记录记入日志。

2 在直接模式中将数据页上的 “Green”改为 “Hubbard”,并继续索 引扫描,检查是否有更多的行需要更新。

3 在第 1127 页上插入对应 “Hubbard”的新索引行。

1-3 显示了延迟更新操作之前的索引与数据页,以及延迟更新操作更 改数据和索引页的顺序。



update employee

set lname = "Hubbard"

1-3:延迟索引更新

where lname = "Green"


image

image

1242

10

O’Leary

11

Ringer

12

White

13

Jenkins

1242

10

O’Leary

11

Ringer

12

White

13

Jenkins

1132

Bennet

1421,1

Chan

1129,3

Dull

1409,1

Edwards

1018,5

1132

Bennet

1421,1

Chan

1129,3

Dull

1409,1

Edwards

1018,5

1307

14

Hunter

15

Smith

16

Ringer

17

Greane

1307

14

Hunter

15

Smith

16

Ringer

17

Greane

1007

Bennet

1421,1

1132

Greane 1133


1307,4

1007

Bennet

1421,1

1132

Greane 1133


1307,4

1133

Greane

1307,4

Green

1421,2

Greene

1409,2

1133

Greane

1307,4

Green

1421,2

Greene

1409,2

ID

ID

指针

指针

ID

ID

指针

指针

指针

指针

更新前:


1001

Bennet

1421,1

1007

Karsen 1009


1411,3


1009

Karsen

1315

1411,3


1127

Hunter

Jenkins

1307,1

1242,4

1127

Hunter

Jenkins

1307,1

1242,4

根页 Intermediate 叶页

image

1421

18

Bennet

19

Green

20

Yok


omoto

1421

18

Bennet

19

Green

20

Yok


omoto

1409

21

22

23

Dull

Greene White

1409

21

22

23

Dull

Greene White

数据页


更新步骤

1 步:写入日志 记录,然后删除索 引行。

image

Green

Green

1133

Greane 1307,4

Greene 1409,2



2 步:更改数据页。

1421

18 Bennet 19

Hubbard 20


1127

Hubbard

1421,2

Hunter Jenkins

1307,1

1242,4

1127

Hubbard

1421,2

Hunter Jenkins

1307,1

1242,4

3 步:读取日志, 插入索引行。


titles 表进行类似的更新:

update titles

set title = "Computer Phobic’s Manual", advance = advance * 2

where title like "Computer Phob%"

此查询暴露出一个潜在的问题。如果扫描 title 列上的非聚簇索引时找到 “Computer Phobia Manual”,并更改了书名,将 advance 乘以 2 ;然后 又找到新索引行 “Computer Phobic’s Manual”,又将 advance 乘以 2, 这会造成 advance 远远超出实际值。

延迟索引删除操作可能比昂贵的直接更新速度更快,但也可能会更慢, 这取决于需要被扫描的日志记录数以及日志页是否仍在高速缓存中。

数据行延迟更新期间,在删除索引行和插入新索引行之间可能会有非常 长的时间间隔。在此间隔期间,不存在和数据行相对应的索引行。如果 此间隔期间,某个进程在隔离级别 0 上扫描索引,则它不会返回数据行 的旧值或新值。


通过连接对更新模式的约束

当被更新的表是连接顺序中的最外层表,或是在连接顺序中该表仅位于 只有一行符合条件的表之后,则涉及连接运算的更新和删除可使用直接 模式、 deferred_varcol 模式或 deferred_index 模式。


update delete 语句中的连接和子查询

update delete 语句中使用 from 子句来执行连接是一种对 ANSI SQL Transact-SQL 扩展。 ANSI SQL 格式的子查询可替代连接用于某些更 新和删除任务。

下面的示例使用 from 语句执行一个连接:

update t1 set t1.c1 = t1.c1 + 50 from t1, t2

where t1.c1 = t2.c1 and t2.c2 = 1

以下示例显示了使用子查询的等效更新。

update t1 set c1 = c1 + 50 where t1.c1 in (select t2.c1

from t2

where t2.c2 = 1)


用于连接查询的更新模式取决于被更新的表是否是连接顺序中的最外层 查询 — 如果不是最外层表,更新将以延迟模式执行。使用子查询的更新 总是以直接更新、deferred_varcol 更新或 deferred_index 更新的方式执行。

如果查询使用 from 语法并因为连接顺序而执行延迟更新,则可使用 showplan statistics io 确定使用子查询重写查询是否可提高性能。并不 是所有使用 from 的查询都可使用子查询进行重写。


触发器与参照完整性中的删除和更新

使用 deleted 表或 inserted 表连接用户表的触发器以延迟模式运行。如果 使用触发器只是为了实现参照完整性,而不是为了将更新和删除实现级 联,那么假如使用声明的参照完整性代替触发器,就可能会避免在触发 器中因延迟更新而引起的时间浪费。


优化更新


showplan 消息可提供有关更新是以直接模式还是延迟模式执行的信息。 如果不能使用直接更新, Adaptive Server 以延迟模式更新数据行。因为 有时优化程序不能确定将执行直接更新还是延迟更新,所以 showplan 消 息将提供:

deferred_varcol”消息显示更新操作可能更改行的长度,因为某个 可变长度列被更新了。如果被更新的行在页上,更新以直接模式执 行;如果更新不在页上,则更新以延迟模式执行。

Deferred_index”消息表明对数据页的更改操作和对索引页的删除 操作以直接模式执行,但对索引页的插入操作以延迟模式执行。

上述直接更新的类型取决于运行时的可用信息,因为实际上要读取页并 进行检查以确定行是否在页上。


直接更新的设计


在设计和编写应用程序时,应注意可能引起延迟更新的不同之处。要帮 助避免延迟更新,请执行以下操作:

至少创建一个表的唯一索引,以增加执行直接更新的可能性。

在更新其它键时,尽可能在 where 子句中使用非键列。

如果列中不使用空值,应在 create table 语句中将其定义为 not null


更新类型和索引对更新模式的影响

31 页的表 1-4 显示了对于三种不同类型的更新,索引如何影响更新 模式。任何情况下都不允许出现重复行。所有索引均建立在 title_id 上。 这三种更新类型如下:

可变长度键列的更新:

update titles set title_id = value

where title_id = "T1234"

固定长度非键列的更新:

update titles set pub_date = value

where title_id = "T1234"

可变长度非键列的更新:

update titles set notes = value

where title_id = "T1234"

1-4 显示了对于同一键,唯一索引可使用比非唯一索引效率更高的更 新模式。应特别注意表阴影区中直接和延迟的差别。例如,使用唯一聚 簇索引,所有更新都能以直接模式执行;但如果索引是非唯一的,则更 新必须以延迟模式执行。

对于使用非唯一聚簇索引的表,表中任何其它列上的唯一索引都可提高 更新执行性能。在某些情况下,可能需要在表中增加一个 IDENTITY 列, 以便能将列作为键包括在索引中,否则该索引不具有唯一性。

1-4:索引对更新模式的影响

更新为:

索引

可变长度键

固定长度列

可变长度列

无索引

不适用

直接

deferred_varcol

聚簇,唯一

直接

直接

直接

聚簇,非唯一

延迟

延迟

延迟

聚簇,非唯一,其它列上有一个唯一索引

延迟

直接

deferred_varcol

非聚簇,唯一

deferred_varcol

直接

直接

非聚簇,非唯一

deferred_varcol

直接

deferred_varcol


如果索引的键长度是固定的,表中所示各种情况的更新模式唯一不同 之处都在于非聚簇索引。对于非聚簇非唯一索引,键更新的模式是 deferred_index。对于非聚簇唯一索引,键更新的模式是直接更新。

如果 varchar varbinary 的长度接近最大长度,则改用 char binary。 每个可变长度列都会将行加到顶部,增加可使用延迟更新的可能性。


如果使用 max_rows_per_page 减少每页允许的行数,则可增加直接更新 数,因为增加可变长度列长度的更新可能仍在同一页上。

有关使用 max_rows_per_page 的详细信息,请参见 《性能和调优系列: 物理数据库调优》。


调优更新时使用 sp_sysmon

可使用 showplan 确定某个更新是直接更新还是延迟更新,但 showplan 不 能提供有关延迟或直接更新类型的详细信息。 sp_sysmon Adaptive Server Monitor 的输出提供了有关采样间隔期间所执行的更新类型的详 细统计信息。

如在调优更新时运行 sp_sysmon,可显示减少的延迟更新数、锁定数以 及 I/O 数。

请参见 《性能和调优系列:使用 sp_sysmon 监控 Adaptive Server》。



--------------------------------------华丽的分割线-------------------------------------------------------------------------

Sybase SQL Anywhere数据库恢复工具ReadASADB:

之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具: ReadASADB。
此工具支持ASA v5.0, v6.0, v7.0, v8.0, v9.0, v10.0, v11.0, v12.0, v16.0, v17.0等版本。
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具。
恢复Sybase SQL Anywhere的工具在国内处于领先水平。

Sybase SQL Anywhere数据库恢复工具ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具
  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x,17.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集,包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

Sybase SQL Anywhere数据库恢复工具ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

Sybase SQL Anywhere数据库恢复工具ReadASADB的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page
7、*** ERROR *** Assertion failed: 201417 (7.0.4.3541) Invalid count or free space offset detected on a table page
8、Internal database error *** ERROR *** Assertion failed: 201425 (8.0.3.5594) Invalid count or free space offset detected on a free list page -- transaction rolled back.
9、Internal database error *** ERROR *** Assertion failed: 100702 (8.0.1.2600) Unable to modify indexes for a row referenced in rollback log -- transaction rolled back


-------------------------------------------------------------------------------------------

Sybase ASE数据库恢复工具READSYBDEVICE:

一个不依赖数据库管理系统、直接从Sybase数据库设备文件上提取数据的业内领先的恢复工具!
能够从损坏的Sybase ASE设备文件(.dat)上提取数据的非常规恢复工具。

Sybase ASE数据库恢复工具READSYBDEVICE的主要功能:

  1. 被勒索病毒加密数据文件及备份文件情况下的恢复;
  2. 系统崩溃只剩下数据文件的情况下的恢复,甚至数据库文件不存在而只有损坏的备份文件情况下的恢复;
  3. 因断电、硬盘坏道等造成数据库文件损坏情况下的恢复;
  4. delete数据恢复、误update数据恢复、误删除表(drop)恢复、误truncate表恢复 等;
  5. 各种Sybase内部系统表损坏、索引错误的修复;
  6. master数据库损坏而无法正常运行情况下的恢复;
  7. Sybase数据库被标记为可疑,不可用等情况的恢复;
  8. Sybase数据库中数据文件内部出现坏块情况下的恢复;
  9. Sybase数据库无数据文件但有日志文件的情况下的恢复;
  10. Sybase数据库只有数据文件无任何日志文件的情况下的恢复;
  11. Sybase数据文件被误删除情况下的碎片提取恢复;
  12. 磁盘阵列上的Sybase数据库被误格式化情况下的数据库恢复;
  13. 数据库sysobjects等系统表损坏无法正常应用情况下的恢复;
  14. Sybase数据库还原数据库出现失败情况下的恢复;
  15. Sybase数据库只剩下损坏的备份文件情况下的恢复。

Sybase ASE数据库恢复工具READSYBDEVICE支持的版本:

Sybase ASE 11.0.x,11.5.x,11.9.x,12.0.x,12.5.x,15.0.x,15.5.x,15.7.x,16.0.x


-------------------------------------------------------------------------------------------

SQL Server数据库恢复工具SQLRescue:

一个不依赖数据库管理系统、直接从SQL Server数据库文件上提取数据的业内领先的恢复工具!
能够从损坏的SQL Server数据库文件(.mdf)上提取数据的非常规恢复工具。

SQL Server数据库恢复工具SQLRescue的主要功能:

  1. 系统崩溃只剩下数据文件的情况下的恢复,即无日志文件或者日志文件损坏情况下的恢复;
  2. 断电导致数据库文件损坏情况下的恢复;
  3. 硬盘坏道造成数据库损坏情况下的恢复;
  4. 数据文件内部存在坏页情况下的恢复;
  5. 企业管理器误删除数据表记录,管理软件误删除数据表记录的恢复;
  6. 并闩锁错误、格式化、误删除后导致软件不能使用的情况;
  7. 无法读取并闩锁页sysindexes失败情况下的修复;
  8. 数据文件被误删除情况下的碎片提取恢复;
  9. 系统表损坏、索引错误、误删除数据库表、删除记录的数据找回;
  10. master数据库损坏而无法正常运行情况下的恢复;
  11. 数据文件无法附加情况下的数据恢复;
  12. 数据库被标记为可疑,质疑,不可用等情况的恢复;
  13. 数据库sysobjects等系统表损坏情况下的恢复;
  14. 数据被误(drop、delete、truncate)删除表数据的恢复,误update后的数据恢复等;
  15. 还原时报一致性错误,错误823等情况下的数据恢复,各种错误提示的数据库文件修复;
  16. 数据库被误格式化等情况下的数据库恢复;
  17. 日志收缩造成数据库损坏情况下的恢复;
  18. 仅剩损坏的备份文件情况下的恢复。

SQL Server数据库恢复工具SQLRescue技术特点:

只要SQL Server数据库的数据文件存在,我们就有办法帮您从数据文件中找回重要数据。
  1. 从数据文件中直接恢复数据
  2. 不能附加时直接恢复数据并生成新的数据库
  3. 系统表损坏的数据库修复
  4. 快速修复SQL 823错误、连接中断错误

SQL Server数据库恢复工具SQLRescue支持的版本:

Microsoft SQL Server 7.0, 2000, 2005, 2008, 2008R2, 2012, 2014, 2016, 2017,2019。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------