Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9904049
  • 博文数量: 299
  • 博客积分: 9955
  • 博客等级: 中将
  • 技术积分: 4177
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 20:59
文章分类
文章存档

2015年(1)

2012年(2)

2011年(9)

2010年(47)

2009年(108)

2008年(132)

我的朋友

分类: Mysql/postgreSQL

2009-10-02 13:40:49

第10学时实施备份
到现在为止,你应该感觉到存储在SQL Server中的数据有多重要了。备份你的数据库最
重要的理由是为了灾难后的恢复。任何人都不希望在没有最近备份的情况下遭遇数据库被破
坏。备份能减少你在失败后的工作量。如果没有经常备份你的数据库,应该注意的最好建议
是使你的备份保持更新。
本学时的要点包括:
• 何时以及为什么需要备份
• SQL Server备份是如何工作的
• 其他的备份考虑事项
• 备份设备的种类
• 备份用户数据库
• 备份系统数据库
10.1 何时以及为什么需要备份
如果你对备份数据库的必要性没有足够的重视程度,返回去重读本学时的第一段。这是
非常重要的话题,不能轻掠而过。正如我讲的,灾难恢复是你应当定期备份数据库的最重要
的理由。当服务器数据被冲掉后,备份能使你快速有效且在线式地恢复原先的数据库。不过,
除了灾难恢复外,下面还有几条理由可以说明为什么备份是有必要的:
• 无意或恶意地修改或删除数据。
• 自然灾害,如火、洪水或龙卷风。
• 偷窃或破坏设备。
• 硬件故障。
• 从一台机器到另一台机器的传输数据。
• 数据的永久归档。
你将会经常听到“备份”( b a c k u p )这个词和“转储”( d u m p )这个词被一些
资深DBA混着说。这是因为在SQL Server以前的版本以及许多其他RDBMS中,
备份一个数据库被叫作“转储”一个数据库。随着SQL Server 7.0的发行,
M i c r o s o t决定用更具描述力(也更准确)的词—“备份”来代替“转储”这个
词。
现在,你已经意识到备份数据库中的数据是多么重要,下一步是决定何时和多长时间实
施一次备份。SQL Server提供了许多高效、可靠的备份数据的方法,它们中的大部分对用户
没有什么影响。
决定什么时候备份,部分取决于你能接受的损失是多大。能接受的损失是在没有对业务
造成极大危害的前提下能丢失的数据量。这是一个很难讲透的概念,你需要花费大量的时间
来对你的经理解释什么是能接受的数据损失,在他们的帮助下,决定它到底是多少。对于大
多数经理,当你第一次问他们时,他们会马上告诉你他们在任何时候都想要零数据损失。尽
管这在概念上是可能的,它将耗费一大笔钱而且很难做到,但是有时值得人们去努力。例如,
在在线事务处理( O LT P )环境中,一小时的数据损失可能导致数百万美元的商业损失。你需要
在这些预算要求和现实需要中取得平衡,寻求一个可以接受的解决方案。
决定备份频率的另一个因素是数据变动的程度。如果数据库上的数据不经常修改,只要
修改就做备份,那就会很安全。如果数据库中的数据每天都更新,你应该每天都做备份。用
一句话说,决定因素直接取决于能承受的损失。如果不经常备份,修改的数据越多将导致丢
失的数据也越多。
10.2 SQL Server备份是如何工作的
SQL Server 7.0在备份方面与以前的版本相比取得了不少改进。SQL Server现在有三种方
法备份你数据库中的数据。当几种方法联合使用时,能达到一种完美的境界,在数据库被冲
掉后,你没有数据损失。这三种方法是全数据库备份、事务日志备份和增量备份。
10.2.1 全数据库备份
全数据库备份因为容易实施,被许多系统优先采用。在一天或一周中预定的时间进行全
数据库备份使你不用动什么脑筋。使用这种类型的备份带来的问题是非常缺乏灵活性,而且
当数据库被冲掉后,你面临丢失大量数据的潜在威胁。例如,假设你每天在午夜备份数据库。
如果服务器在晚上11点崩溃了,你将丢失前面2 3个小时对数据所做的全部修改。对大多数系
统来说,这是无法接受的。对此规则,为数不多的例外如下:
• 系统中所存数据的重要性很低。一个很好的例子是开发用服务器。在这些类型的服务器
上,开发者通常装载一些旧的或假定的数据来测试应用程序。这类数据库每天的备份是
可接受的。
• 系统中所存的数据可以很容易地再创建。这类服务器中一个很好的例子是报表服务器,
其中所存的所有数据都由一个批处理过程装载的。如果这个数据库被冲掉了,你只需要
再运行一次这个批处理过程,所有数据就可以恢复了。
• 一个遥远的站点,那里很少或没有数据库管理员支持。这种类型的站点常常依靠没受过
足够培训的人来维持备份计划,并且他还从事其他工作。通常最好保证实施的备份计划
非常简单,不必让那些用户监视和维护它。
• 不经常修改的数据库。一个例子是被收集存储在数据中心或数据仓库的历史数据。通常,
查询这些数据以判断趋势,但是这些数据极少被修改。
10.2.2 事务日志备份
一个事务日志备份只备份事务日志中的信息。事务日志备份必须与至少一次全数据库备
份联用,这是因为如果恢复数据,必须要有一个开始点。事务日志备份比全数据库备份少花
费许多资源,经常执行也容易多了。这实际上有两个目的。首先是缩短了最后一次备份与服
务器失败之间的时间间隔,因而减少了数据损失。事务日志备份还允许你实施一种特殊类型
的恢复,即时间点恢复。这种类型的恢复允许你恢复数据到一个特定的时间点,比如到一次
第1 0学时实施备份8 7
下载
实际失败发生前5分钟时。当某人所做的大量的数据修改或删除要取消时,它显得特别有用。
你只需简单地恢复数据库到这次动作发生的时间点前。事务日志恢复在下列情况时非常有用:
• 不能接受丢失大量数据的情况。在这种情况下,你可以每天做一个全数据库备份,再每
小时或更频繁地做事务日志备份。这将减少数据丢失量。
• 数据库的大小使得经常做全数据库备份很困难。例如,非常大的数据仓库很容易达到上
万亿字节。这种情况下,你可以做一次全数据库备份,然后当数据修改时,再做一次事
务日志备份。
• 你想采取时间点恢复。像我前面提到的,时间点恢复是非常重要和有用的,你可以通过
事务日志备份来实现。
• 数据库被高频率地修改。在发生大量的数据库修改时,数据库备份可能很快就过时了,
如果把事务日志备份和全数据库备份联系起来使用,这些修改你都能记录下来。
10.2.3 增量备份
增量备份是能用来帮助你实施备份计划的最新技术。这种备份,像事务日志备份一样,
只备份你上次全数据库备份后所做的修改。与事务日志备份不一样的是这种备份不允许时间
点恢复。它只允许你在实际所做的备份点上恢复。所以,这种备份通常要有事务日志备份作
为补充。在下列情况下,增量备份非常有用:
• 系统中所存数据不是非常重要,所以所做的一些修改丢失后,不会导致灾难性的后果。
对于这种类型的系统,手工重建数据比建立一个事务日志备份计划更容易。
• 一个遥远的站点,那里很少或没有数据库管理员支持。这种类型的站点常常依靠没受过
足够培训的人来维持备份计划,而且他还经常从事其他工作。通常最好保证实施的备份
计划非常简单,不必让那些用户监视和维护它。
• 数据库的大小使经常做全数据库备份很困难的情况。
• 你想通过联合使用全数据库备份、增量备份和事务日志备份最大程度地减少花费的时
间。
10.3 其他的备份考虑事项
现在,你已经学了备份的不同类型和适用于什么时候。当决定怎样备份SQL Server时,
还有几点别的因素要考虑。这些因素单个看起来不是很重要,但当你综合考虑时,它们也很
重要的。
10.3.1 将备份到何种介质上—磁盘还是磁带
这个问题很有意思,有三点原因。第一点,在决定这个问题的答案时,你要考虑到性能。
如果备份大量的数据,你不得不考虑备份到磁带和备份到磁盘之间的速度差异。很显然,备
份到磁带要比备份到磁盘上慢得多。你要考虑的第二点是可恢复性。磁盘驱动器通常是计算
机硬件中最容易出问题的部件。如果只备份到磁盘上,你就把自己置于数据丢失的危险之中。
通常,大多数人决定合起来用,把数据库备份到磁盘,然后再把磁盘上的这些文件备份到磁
带。尽管在做SQL Server备份并将其备份到磁带这段时间里,你还是有丢失数据的危险,但
这还是比简单地备份到磁盘上要安全得多。
8 8 SQL Server 7 24学时教程
下载
10.3.2 一天中何时运行备份
当你处理大量更新的数据库时,任何对计算机性能的耗费都会使数据库用户难以忍受。
尽管备份数据库不会导致巨大的性能耗费,但是它会导致速度减慢。在大型O LT P中,即使最
小的速度降低都不能接受。那么答案在哪里?通常,你要在用户数据吞吐最少的时候备份。
这段时间通常称为维护窗口。尽管很多D B A都有方法找到一个很大的维护窗口,如下午5 : 0 0
到第二天早晨7 : 0 0;但还是有一些D B A只有很小的维护窗口,或者找不到。在决定何时备份
你的数据库时,一定要考虑到即使你的用户会感到速度有些减慢,也比在没有一点备份的情
况下数据库被冲掉好得多。
SQL Server的最大好处是,你不用守在那里,手工完成备份。通过SQL Server Agent,可
以按你的设想在任一天的任何时候执行你的备份计划。这样解决前面的问题会更容易些,因
为你不必派一个人到那里去负责备份。
10.3.3 备份存储在何处
这个问题要分两部分来回答。第一部分,最好你的备份不要存储在数据所在的同一台机
器上。出于性能考虑,经常转储数据到本地机器的驱动器上,因为它比转储到磁带上要快得
多。最后,势必要把数据通过网络拷贝到另一台服务器上或拷贝到磁带上。
第二部分,你应该为备份磁带找一个存放地点。你可以在晚上把磁带带回家,这很简单。
但也可以复杂一些,让一个别处的存储部门每天来取走磁带。
10.3.4 备份将保存多久
帮助解决这个问题的一个常用备份策略是祖父—父亲—儿子备份计划。按照这种策略,
祖父那一代在每月的第一天或最后一天做月备份,并将永远保存备份。第二代(即父亲这一代)
每周做一次备份。这种备份将在别处保存一段固定的时期,如一年。儿子这一代每天做一次
备份,只保存一个月。备份的磁带应该保存在一个安全的地方,如有防火措施的地方。
10.3.5 备份将如何被验证
这对维护数据库常用备份来说确实是重要的一个部分。我曾经帮助一些公司去恢复数据
库,他们做了严格的备份,但是在数据库被冲掉后,却发现他们的磁带驱动器不能正常工作。
怎样做才能知道是否每个部分都运行良好?第一点也是最重要的一点:在数据库被冲掉之前
就检查并保证每个设备工作正常。当你第一次安装服务器时,在实际使用之前,运行备份,
并把备份恢复到同一台服务器上,保证硬件都能正常运行。你可以另外选择在开发用的或有
质保的服务器上备份和恢复以保证能正常运行,或找一家公司为你校验备份磁带。你只需把
它们送到公司,他们会送回来,并附有一封信告诉你磁带是否完好。
10.3.6 谁负责备份
正如前面我在有关能在SQL Server中使用的不同备份类型那部分所讨论的,这个问题在
怎样建立你的备份中扮演了重要的角色。如果你的所有服务器都放在一个有专业维护人员的
数据中心,他们将负责保证你的备份磁带经常更换以及所有东西能正常运行,那么你即使有
第1 0学时实施备份8 9
下载
一个相当复杂的备份计划也将不成问题。如果你的服务器在各地非常分散,而每处只有很有
限的支持人员,你可能要考虑建一个不太复杂的备份计划。
10.4 备份设备的种类
备份设备是SQL Server能存储数据库或事务日志备份拷贝的地方。备份设备可以是本地
机器上的磁盘文件、远端服务器上的磁盘文件、磁带以及命名管道。当创建一个备份设备时,
你要给它一个逻辑名称和一个物理名称。逻辑名称可以长达1 2 0个字符,而且必须符合S Q L
S e r v e r关于命名标识符的规定。通常最好使用尽可能具有描述力而又不太长的名称。这样,当
你看到逻辑名就可以清楚地知道设备里所备份的内容了。
物理名是一个包括路径或关于网络设备通用命名标准( U N C )的文件系统名。物理名可以
长达2 6 0个字符。例如如果一个共享位于服务器B a c k u p S e r v上,它的U N C将是\ \ B a c k u p S e r v \
B a c k u p S h a r e。表1 0 - 1列举了所有备份设备类型的逻辑名称和物理名称。
表10-1 备份设备的类型
设备类型逻辑名称物理名称
本地磁盘D B B A C K U P D I S K D : \ B A C K U P S \ D B B A C K U P 0 1 . D AT
网络磁盘T L B A C K U P S Q L B A C K \ \ S Q L B A C K \ B A C K U P S \ T L B A C K U P. D AT
磁带TA P E B A C K U P \ \ . \ TA P E 0
命名管道N P B A C K U P \ \ S Q L B A C K \ P I P E \ S Q L \ B A C K U P
10.4.1 磁盘备份设备
磁盘备份设备可以位于本地机器上或一个网络服务器上。使用磁盘备份设备备份你的数
据库的优点是备份过程极快。当使用一个本地机器上的磁盘设备时,很重要的一点是要拷贝
备份设备到磁带上或到一个网络服务器上以防磁盘被清掉。当使用一个网络上共享的磁盘设
备时,你必须首先检查SQL Server运行下的设备帐号是否拥有正确的许可来写到机器上。
10.4.2 磁带备份设备
SQL Server现在只支持本地磁带设备。这个版本的SQL Server不支持网络磁带驱动器。在
SQL Server能识别磁带驱动器前,你必须先在Windows NT中安装它。在SQL Server中创建一
个磁带设备时,你指定的必须是Windows NT所分配的物理名称。第一个安装在计算机中的磁
带驱动器将命名为\ \ . \ TA P E 0。其后安装的驱动器按递增数命名。
10.4.3 命名管道备份设备
微软以第三方软件销售商的方式提供命名管道备份设备来备份和恢复SQL Server。命名
管道备份设备不能通过SQL Enterprise Manager创建和管理。要备份到命名管道,在调用备份
命令时,你必须提供一个管道名。
10.4.4 创建备份设备
在我讲解备份数据库前,你需要了解如何创建备份设备。在下面的步骤里,我将介绍怎
9 0 SQL Server 7 24学时教程
下载
样创建三个磁盘备份设备,你在本学时后面备份数据库时会用到它:
1) 点击“S t a r t”按钮,到“P r o g r a m m s”,到“Microsoft SQL Server 7.0”,然后选择S Q L
Server Enterprise Manager。
2) 当Enterprise Manager启动后,双击你要工作的服务器名字。在连接上服务器后,点击
“M a n a g e m e n t”文件夹旁的加号( + ),并选择“B a c k u p”项。在右边的方框内,按鼠标右键并
选择“New Backup Device. . .”选项,如图1 0 - 1所示。
3) 在选择“New Backup Device...”选项后,“Backup Device Properties-New Device”对
话框将出现。如图1 0 - 2所示。
4) 对于第一个备份设备,向“ N a m e”框中键入“ N o r t h w i n d _ F u l l _ D a t a b a s e”。注意在
“N a m e”框中所输入的内容会立即填入“ File Name”框。如果需要,你可以修改文件名,但
是在本例操作中不要管它。
5) 在填完这些后,点击“ O K”按钮,创建这个备份设备。
6) 重复步骤2 ~ 5,使用“N o r t h w i n d Tr a n s a c t i o n L o g”作为名字。
7) 重复步骤2 ~ 5,使用“N o r t h w i n d D i ff e r e n t i a l”作为名字。
8) 完成上面这些步骤后,你的“ B a c k u p”文件夹应该如图1 0 - 3所示。
第1 0学时实施备份9 1
下载
图10-1 从SQL Enterprise
M a n a g e r的“B a c k u p”
项中选择“New Backup
Device. . . ”
图10-2 “Backup Device
P r o p e r t i e s - N e w
D e v i c e”对话框
10.5 备份用户数据库
现在,你已经学过了所有理论并做好了准备,可以为Northwind Tr a d e r s公司创建备份计
划了。如我在前面课程中所提到的, Northwind Tr a d e r s公司是一个虚构的公司,它在全世界
做土特产进出口贸易。他们现在做了许多生意,但是正在担心,因为他们还没有做任何备份。
在讨论了他们的可恢复性需求后,你决定制定以下备份计划:
• 全数据库备份—Northwind Tr a d e r s认为他们在午夜1 2 : 0 0到凌晨2 : 3 0之间定单量最少。
这是他们的维护窗口。作为要做的所有其他备份的起始点,你应该在这段时间内做一个
全数据库备份。
• 增量备份—因为Northwind Tr a d e r s需要尽可能快的恢复,你决定应该每6个小时做一次
增量备份。这样先从全数据库备份中恢复,然后再从上一次增量备份中恢复,最后是事
务日志备份。这样将大大加快恢复的过程。
• 事务日志备份—Northwind Tr a d e r s公司在不断地收到客户的定单,他们要求发货给他
们。如果公司丢失了任何数据,至少会使客户烦躁不安,因为他们将收不到他们的定货。
公司认为所能容许的最大丢失数据量是1 5分钟内的交易量。因此,在两次增量备份之间,
每1 5分钟需要做一次事务日志备份。
现在,你已经知道何时为Northwind 数据库备份什么了,下面的部分将创建全数据库备份。
在本学时的最后,你将在练习里做另外两个备份。为了做这些工作,必须首先打开SQL Sever
Query Analyzer,并运行程序清单1 0 - 1中的代码。它将关闭在检查点上截短日志选项。
程序清单10-1 关闭在检查点上截短日志的数据库选项
1) 点击“ S t a r t”按钮,到“ P r o g r a m m s”,到“ Microsoft SQL Server 7.0”,然后选择
“SQL Enterprise Manager”。
9 2 SQL Server 7 24学时教程
下载
图10-3 备份设备创建后的
“B a c k u p”文件夹
2) 当Enterprise Manager启动后,双击要工作的服务器的名字。在连接上服务器后,点击
“M a n a g e m e n t”文件夹旁的加号( + ),并选择“B a c k u p”项。在右边的方框内,按鼠标右键并
选择“Backup a Database”选项,如图1 0 - 4所示。
3) 在选择该选项后,“SQL Server Backup”对话框会打开,如图1 0 - 5所示。
4) 要创建的第一个备份是Northwind 数据库的全数据库备份。在“ D a t a b a s e” 下拉框内,
选择“N o r t h w i n d”。
5) 在“ N a m e” 框中, 输入一个最能描述要创建的备份的名字。为此考虑, 输入
“Northwind Database-Full Backup”。
6) 在描述框内,可以输入任何帮助你记住这次备份工作是做什么的信息。
7) 在“B a c k u p”部分,保证选择正确的备份类型,在本例中选择“D a t a b a s e - C o m p l e t e”。
8) 在“D e s t i n a t i o n”部分,点击“ A d d”按钮,这将打开“ Choose Destination Device”
对话框。点击“ Backup Device”选项按钮,在下拉列表中,选择正确的备份设备,然后点击
“O K”钮。
第1 0学时实施备份9 3
下载
图10-4 从SQL Enterprise
M a n a g e r的“B a c k -
u p”项中选择“B a -
ckup a Database”
图10-5 “SQL Server Backu
p”对话框
9) 在“O v e r w r i t e”部分,选择“Overwrite existing media”选项。
10) 选中“S c h e d u l e”复选框。然后点击含有省略号( . . . )的按钮。这将打开“Edit Schedule ”
对话框,如图1 0 - 6所示。
11) 在“ N a m e”框内,输入一个对你具有描述力的名字。这里输入“ Northwind Full
Database Backup”。
12) 在“Schedule Ty p e”部分,选择“R e c u r r i n g”然后点击“C h a n g e”按钮。这将打开
“Edit Recurring Job Schedule”对话框,如图1 0 - 7所示。
13) 选择希望备份按其运行的任务调度表,然后点击“ O K”按钮。这里,在“ O c c u r s”
部分内选择“D a i l y”,在“Daily frequency”框内选择“Occurs at 12:00AM”。
14) 在“Edit Schedule”框内,点击“O K”按钮。
15. 在“SQL Server Backup”对话框内,点击“ O K”按钮。
16) 当返回到“B a c k u p”项后,通过点击“ SQL Server Agent”项并选择“ J o b s”,你可
以确保备份任务已被列入任务计划表中。你刚创建的备份工作将列在右边方框内。
10.6 备份系统数据库
与用户数据库一样,你应该对某些系统数据库也做定期的备份,尤其是m a s t e r数据库和
m s d b数据库。不管什么时候在m o d e l数据库中做了修改,你都应该做一个备份。这些数据库
很少修改。如果服务器了参与复制,你应该也备份分发数据库。
10.6.1 备份master数据库
m a s t e r数据库包含SQL Server设置信息和服务器上所有其他数据库的信息。你应该经常备
份这个数据库,尤其是在对SQL Server做了任何配置上的修改或对其中包含的数据库做了变
动之后。这些修改包括增加或修改一个数据库、创建登录或增加备份设备。
9 4 SQL Server 7 24学时教程
下载
图10-6 “Edit Schedule”
对话框
图10-7 “Edit Recurring
Job Schedule”对
话框
10.6.2 备份msdb数据库
SQL Server Agent使用m s d b数据库。这个数据库存储了所有计划调度表中的任务和这些
任务的所有历史。只要你增加或修改任务、增加或修改自动备份任务或更改别名,这个数据
库都会被修改。当安装了SQL Server,在检查点上截短日志数据库选项缺省地被打开。为了
实施事务日志备份,必须关闭这个选项。你可以像备份任何用户数据库一样备份这个数据库。
10.6.3 备份model数据库
不管何时SQL Server创建一个新的数据库,都要使用m o d e l数据库。这里包括所有数据库
中的缺省对象。如果已增加了什么东西到m o d e l数据库当中,你需要备份这个数据库。
10.6.4 备份分发数据库
如果SQL Server在复制过程中被配置成远程分布服务器或是出版/分发服务器,你要有一
个数据库用作分发处理。此数据库的名字缺省为“ d i s t r i b u t i o n”,但在设置复制时名字可以修
改。分发数据库中有等待复制、然后送往订阅服务器的所有事务。你可以备份分发数据库,
如同备份任何一个用户数据库一样,而且你应该经常做备份。
10.7 课时小结
在本学时中,我讲解了SQL Server备份。在决定怎样备份你的数据库时,需要考虑几件
事情,包括数据库中存储的数据量、有多少数据被修改、多少数据可以被丢失。在确定了这
些信息后,你就能创建备份计划表了。
10.8 专家答疑
问题:事务日志为我提供了很大的可恢复性。既然这样,为什么我还要为经常备份我的
数据库而担心呢?
解答:事务日志只是为你提供了恢复被部分修改的数据的可能性。硬件出故障后,它并
不能为你提供恢复。
问题:我正在试着为一个数据库做事务日志备份,但它却一直告诉我不能,为什么不能
呢?
解答:你不能为一个用户数据库做事务日志备份的原因,很可能是因为在检查点上截短
日志数据库选项打开着。你要运行以下命令关闭这个选项:
10.9 课外作业
这些思考题和练习题是供你加深理解用的。答案可以在附录“答案”中找到。
10.9.1 思考题
1) 为什么要备份数据库?
2) 什么是可接受的损失?
第1 0学时实施备份9 5
下载
3) 在哪两种情况下,只做全数据库备份是一个好主意?
4) 什么是事务日志备份?
5) 什么是时间点恢复?
6) 什么是增量备份?
7) 为什么校验你的备份是一个好主意?
8) 什么是备份设备?
9) 为什么要备份m a s t e r数据库?
10) 除了m a s t e r数据库,还应该备份哪些系统数据库?
10.9.2 练习题
1) 为N o r t h w i n d数据库创建一个备份,要求在上午6 : 0 0、中午和下午6 : 0 0做增量备份,备
份设备叫N o r t h w i n d D i ff e r e n t i a l。
2) 在N o r t h w i n d数据库上创建一个备份,要求从上午1 2 : 1 5到第二天上午5 : 5 9之间每隔1 5分
钟做一次事务日志备份,备份设备叫N o r t h w i n d Tr a n s a c t i o n L o g。不必担心在其他时间进行
其他备份工作,我会在第1 6学时“任务调度和报警”中讲解计划表运行的另一种方式。
阅读(1968) | 评论(0) | 转发(0) |
0

上一篇:第11学时恢复数据

下一篇:第9学时许可

给主人留下些什么吧!~~