镜像简介

 
重要说明:保持数据库镜像运行。如果您关闭数据库镜像,则必须执行完全备份并还原数据库以重建数据库镜像。
 

一、 简介

SQL SERVER 2005镜像基于日志同步,可良好实现故障转移。每个数据库镜像配置均包含一个主体服务器(包含主体数据库)、一个镜像服务器(包含镜像数据库)和一个见证服务器(可选)。

主体服务器和镜像服务器要求是独立的服务器实例。

主体服务器和镜像服务器的角色是相对的,可以自动或者手动地将主体服务器与镜像服务器的角色互换。

与主体服务器和镜像服务器不同的是,见证服务器并不能用于数据库。见证服务器监视主体服务器和镜像服务器,确保在给定的时间内这两个故障转移服务器中有且只有一个作为主体服务器,从而支持自动故障转移。

如果存在见证服务器,同步会话将以“高可用性模式”运行,如果主体服务器出现故障,可以实现故障自动转移。

如果见证服务器不存在,同步会话将以“高级别保护模式”运行,出现故障需要手动故障转移,并且有可能丢失数据。

什么是数据库镜像? 内容来自dedecms

Robidoux:数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个SQL Server数据库中。镜像的拷贝是一个备用的拷贝,不能直接访问;它只用在错误恢复的情况下。

因 为是在SQL Server 2005中新引入的特性,这个功能只能用在,这个版本的软件中。在某种程度上说,它是复制和日志传输的混合体:你所有的事物都在事物级别(复制)上移动 (日志传输)到你的数据库的一个镜像拷贝上,同时减少了你在实现日志传输或者复制的时候可能会面临的问题。

复制包括大量的移动部分,并且如果你的数据库计划经常改变的话,要保证你的复制运行得流畅也是困难重重。对于日志传输,为了保证同步,同样需要实现很多的处理,例如创建备份、拷贝备份,以及备份重存。如果有一个进程崩溃了,整个处理过程就崩溃了。

数据库镜像的工作方式是什么?

Robidoux :要进行数据库镜像所需的最小需求包括了两个不同的SQL Server运行环境。主服务器被称为“基本的”,第二个服务器被称作“镜像的”。基本数据库就是你实际用着的数据库,镜像数据库就是你的数据库的备用拷 贝。当事务写入你的基本服务器的时候,他们也同样被传送到并写入你的镜像数据库中。 织梦好,好织梦

除了基本和镜像之外,你还可 以引入另一个可选的组件,名为“证人”。证人数据库是第三个SQL Server 2005运行实例,它是在判断什么时候进行错误恢复的时候,用于基本和镜像之间内部交流。只有当你想实现自动错误恢复的时候用到这个选项。它实现了2比1 投票的能力,当我的一个组件不可达,并因此需要进行错误恢复的时候。证人服务器只有在你想实现自动错误恢复的时候才需要用到。

实现的方式是什么?

Robidoux :数据库镜像提供了三种实现的方式。根据你想要用什么方式来进行错误恢复处理来进行选择。dedecms.com

高可用性:这个操作模式选项允许你在两台服务器上同步事务写入,并支持自动错误恢复。要使用这个选项,你必须还要使用一个证人服务器。

高保护:这个选项可以让你在两台服务器上同步事物写入,但是错误恢复是手工的。因为自动的错误恢复不是这个选项的一部分,所以也不会用到证人服务器。

高性能:这个选项不关心两台服务器上的写入是否是同步的,因此在性能上有所提高。当使用这个选项的时候,你只能假设镜像服务器上的所有事情都是成功完成。这个选项只允许手工的错误恢复,因此不会用到证人服务器。

时刻记住将你的数据自动恢复到第二个拷贝才是数据库镜像的真正好处。因此,大多数的实现可能都是使用的高可达性方式。其他的选项仍然提供了内建的错误恢复过程,但是前提是你在发生错误的时候对进行自动的错误恢复怀有极大的兴趣。

数据库镜像可以工作在哪几个版本上?

Robidoux :数据库镜像只能在标准版、开发版和企业版的SQL Server 2005中找到。基本服务器和镜像服务器的SQL Server运行实例都需要是这几个版本。证人服务器可以运行在任何版本的SQL Server上。此外,还有其他的一些特性是SQL Server的开发版和企业版上特有的,但是标准版具有最基本的功能。

总结

现如今,SQL Server 2005的数据库镜像已经关掉了,但是所有的功能仍然存在。数据库镜像可以通过使用检索标志来打开——但是微软现在并不支持这个功能了,所以不要在你的产品环境中运行它。数据库镜像将会在本年年末完全实现并被支持。

二、优点

下表是SQL Server可用性官方解决方案的一个对照表,现时我中心使用的恢复模式是“冷备份”中的“备份/恢复”,通常来说“热备份”比“冷备份”的可用性更高,恢复更快,更适合我中心现时的实际情况。如果不从成本考虑的话,“热备份”中的“故障转移群集”的可用性是最高的,但是故障转移群集需要借助磁盘阵列而且建设本身复杂性较高。数据库镜像的建立并没有太多的硬件要求,最起码没有像“故障转移群集”需要共享存储这么高的要求。

三、 缺点

(1)由于SQL Server是一个实例多个数据库的产品,数据库镜像技术是基于数据库级别的,因此每次主数据库新增数据库都必须为备机增加数据库并且为新增的数据库建立镜像关系。

(2)数据库的登录名和用户是存储在master数据库,master数据库是不能做镜像的,所以每次操作数据库的登录名和用户也是需要多维护一份,

(3)数据库作业不能得到相应的维护。

(4)微软号称镜像可以让客户端对故障透明,但是实际测试中发现只有满足特定的条件才能实现透明化,而且透明化得客户端支持才可行(.net Framework 2.0以上,Microsoft jdbc驱动 1.1以上)。

(5)跨数据库事务和分布式事务均不支持数据库镜像。

纵观其他几种方式,仅有“热备份”的“故障转移群集”没有这些问题。

四、基本模式:

同步:已提交的事务将在伙伴双方上提交

异步:事务不需要等待镜像服务器将日志写入磁盘便可提交

五、镜像运行模式:

高安全性模式

支持同步操作。 在高安全性模式下,当会话开始时,镜像服务器将使镜像数据库尽快与主体数据库同步。 在同步数据库之后,已提交的事务将在伙伴双方上提交,但会延长事务滞后时间。 具有自动故障转移功能的高安全性模式要求使用第三个服务器实例,称为“见证服务器”。 与这两个伙伴不同的是,见证服务器并不能用于数据库。 见证服务器通过验证主体服务器是否已启用并运行来仅支持自动故障转移。 只有在镜像服务器和见证服务器与主体服务器断开连接之后而保持相互连接时,镜像服务器才启动自动故障转移。

高性能模式

异步运行。 将事务安全设置为 OFF 时,数据库镜像会话便会异步运行。镜像服务器尝试与主体服务器发送的日志记录保持同步。 虽然镜像数据库可能稍微滞后于主体数据库,但这两个数据库之间的时间间隔通常很小。 但是,如果主体服务器的工作负荷过高或镜像服务器系统的负荷过高,则时间间隔会增大。

六、方法

1、单机多实例

适用于单台机器的多个实例间做数据同步测试

2、同网段(域环境)

适用于域环境中,相对证书方式,配置相对简单,省去了建立密钥、证书及多次为用户授权的过程

3、同网段(非域):证书方式

配置相对较繁琐,基本步骤:

1.各服务器生成主密钥(MASTER KEY)

2.各服务器生成服务证书(CERTIFICATE)

3.使用服务证书生成端点(ENDPOINT)

4.将证书备份为文件,并复制到其他服务器

5.各服务器对其他服务器生成访问授权

1) 生成登陆

2) 生成用户

3) 绑定证书到用户

4) 授予相关用户对ENDPOINT 的连接访问权

6.主机上备份数据库(最好加上日志备份)

7.镜像机上还原数据库(norecovery)

8.为镜像机配置镜像伙伴

9.为主机配置镜像伙伴和见证服务器

配置步骤(证书认证方式)

注意:下文SQL语句中的红字部分请根据自己的的实际情况做出修改!

一、配置主备机及见证服务器

1、 服务器基本信息

主机名称为:HOST_A,IP地址为:192.168.100.100

备机名称为:HOST_B,IP地址为:192.168.100.101

见证名称为:HOST_C,IP地址为:192.168.100.102

2、 检查SQL Server 2005数据库

只有SQL Server 2005 标准版、企业版和开发版才可以建立数据镜像。其他版本即Express只能作为见证服务器。如果实在不清楚什么版本,执行如下语句查看:

  1. select @@version;

若要对此数据库进行数据库镜像,必须将它更改为使用完整恢复模式。若要用 Transact-SQL 实现此目的,请使用 ALTER DATABASE 语句:

  1. USE master;
  2. ALTER DATABASE <DatabaeName>   //<DatabaeName>既为需要配置镜像的数据库名
  3. SET RECOVERY FULL;

二、主备实例互通

实现互通可以使用域或证书来实现,考虑实现的简单,以下选取证书的方式实现。注意:实现“主备数据库实例互通”的操作只需要做一次,例如为了将两个SQL Server 2005的实例中的5个数据库建成镜像关系,则只需要做一次以下操作就可以了;或者这样理解:每一对主备实例(不是数据库)做一次互通。

1、创建证书(主备可并行执行)

--主机执行:

  1. USE master;
  2. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'www.asymt.com';
  3. CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
  4. START_DATE = '2012-08-02',
  5. EXPIRY_DATE = '2099-08-02';
 

--备机执行:

  1. USE master;
  2. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'www.asymt.com';
  3. CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
  4. START_DATE = '2012-08-02',
  5. EXPIRY_DATE = '2099-08-02';

--见证执行:

  1. USE master;
  2. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'www.asymt.com';
  3. CREATE CERTIFICATE HOST_C_cert WITH SUBJECT = 'HOST_C certificate',
  4. START_DATE = '2012-08-02',
  5. EXPIRY_DATE = '2099-08-02';

2、创建连接的端点(主备可并行执行)

--主机执行:

  1. CREATE ENDPOINT Endpoint_Mirroring
  2. STATE = STARTED
  3. AS
  4. TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
  5. FOR
  6. DATABASE_MIRRORING
  7. ( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );

--备机执行:

  1. CREATE ENDPOINT Endpoint_Mirroring
  2. STATE = STARTED
  3. AS
  4. TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
  5. FOR
  6. DATABASE_MIRRORING
  7. ( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );

--见证执行:

  1. CREATE ENDPOINT Endpoint_Mirroring
  2. STATE = STARTED
  3. AS
  4. TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
  5. FOR
  6. DATABASE_MIRRORING
  7. ( AUTHENTICATION = CERTIFICATE HOST_C_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = WITNESS );

3、备份证书以备建立互联(主备可并行执行)

--主机执行:

  1. BACKUP CERTIFICATE HOST_A_cert TO FILE = 'D:\SQLBackup\HOST_A_cert.cer';

--备机执行:

  1. BACKUP CERTIFICATE HOST_B_cert TO FILE = 'D:\SQLBackup\HOST_B_cert.cer';

--见证执行

  1. BACKUP CERTIFICATE HOST_C_cert TO FILE = 'D:\SQLBackup\HOST_C_cert.cer';

4、互换证书

将备份到D:\SQLBackup\的证书进行互换,即HOST_A_cert.cer复制到备机的D:\SQLBackup\和见证机的D:\SQLBackup\。HOST_B_cert.cer复制到主机的D:\SQLBackup\和见证机的D:\SQLBackup\。HOST_C_cert.cer复制到主机的D:\SQLBackup\和备机的D:\SQLBackup\。

5、添加登陆名、用户(主备可并行执行)

以下操作只能通过命令行运行,通过图形界面无法完成。(截至SQL Server2005的补丁号为SP2)

--主机执行:

  1. CREATE LOGIN HOST_B_login WITH PASSWORD = 'www.asymt.com';
  2. CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
  3. CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\SQLBackup\HOST_B_cert.cer';
  4. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
  5. CREATE LOGIN HOST_C_login WITH PASSWORD = 'www.asymt.com';
  6. CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
  7. CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE = 'D:\SQLBackup\HOST_C_cert.cer';
  8. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];

--备机执行:

  1. CREATE LOGIN HOST_A_login WITH PASSWORD = 'www.asymt.com';
  2. CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
  3. CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:\SQLBackup\HOST_A_cert.cer';
  4. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
  5. CREATE LOGIN HOST_C_login WITH PASSWORD = 'www.asymt.com';
  6. CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
  7. CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE = 'D:\SQLBackup\HOST_C_cert.cer';
  8. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];

--见证执行

  1. CREATE LOGIN HOST_A_login WITH PASSWORD = 'www.asymt.com';
  2. CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
  3. CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:\SQLBackup\HOST_A_cert.cer';
  4. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
  5. CREATE LOGIN HOST_B_login WITH PASSWORD = 'www.asymt.com';
  6. CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
  7. CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\SQLBackup\HOST_B_cert.cer';
  8. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];

三、建立镜像关系

以下步骤是针对每个数据库进行的,例如:现有主机中有5个数据库以下过程就要执行5次。

1、 手工同步登录名和密码

在上文中提到数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录。

通常来说数据库都将会有若干个用户作为访问数据库的用户,并且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,例如某业务系统使用’myuser’作为登录名访问数据库,但是在备机中没有’myuser’这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为"孤立用户"

在主数据库中执行如下语句:

  1. USE master;
  2. select sid,name from syslogins;

查找出相应的用户名和sid,例如:上述的’myuser’

在备数据库中执行如下语句:

  1. USE master;
  2. exec sp_addlogin
  3. @loginame = '<LoginName>',
  4. @passwd = '<Password>',
  5. @sid = <sid> ;

这里的’LoginName’即主数据库中的登录名,sid即是上述通过SQL语句查找出的sid。

例如,查询得到的sid和name如下所示。

  1. sid name
  2. ---------------------------------- -----------------
  3. 0x074477739DCA0E499C29394FFFC4ADE4 cz_account

则建立登录名的SQL语句:

  1. USE master;
  2. exec sp_addlogin
  3. @loginame = 'cz_account',
  4. @passwd = 'password',
  5. @sid = 0x074477739DCA0E499C29394FFFC4ADE4;

到此为止可以认为备机数据库的环境已经与主机同步了,还差数据库内的数据未同步。

2、 准备备机数据库

使用主机的全备文件进行还原,在还原数据的时候需要使用选上“with non recover”。数据库文件和事务日志都要选上,如图所示:


如果执行成功数据库将会变成这个样子:

3、 建立镜像

--主机执行:

  1. ALTER DATABASE shishan SET PARTNER = 'TCP://192.168.100.101:5022';
  2. ALTER DATABASE shishan SET WITNESS = 'TCP://192.168.100.102:5022';

--如果主体执行不成功,尝试在备机中执行如下语句:

  1. ALTER DATABASE shishan SET PARTNER = 'TCP://192.168.100.100:5022';

如果执行成功,则主备数据库将会呈现如上图所示的图标。

如果建立失败,提示类似数据库事务日志未同步,则说主备数据库的数据(日志)未同步,为保证主备数据库内的数据一致,应在主数据库中实施一次“事务日志”备份,并还原到备数据库上。备份“事务日志”如图所示:

还原事务日志时需在选项中选择“restore with norecovery”,如图所示:

成功还原以后再执行建立镜像的SQL语句。

4、配置完所有后,需要重启见证服务器才能生效。

如果不需要故障自动转移可以不设置见证服务器,既和见证服务器相关的操作可以不做,手动转移操作如下

四、测试操作

1、主备互换

--主机执行:

  1. USE master;
  2. ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER;

2、主服务器Down掉,备机紧急启动并且开始服务

--备机执行:

  1. USE master;
  2. ALTER DATABASE <DatabaseName> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;

3、原来的主服务器恢复,可以继续工作,需要重新设定镜像

--备机执行:

  1. USE master;
  2. ALTER DATABASE <DatabaseName> SET PARTNER RESUME; --恢复镜像
  3. ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --切换主备

4、原来的主服务器恢复,可以继续工作

--默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。

--关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。

  1. USE master;
  2. ALTER DATABASE <DatabaseName> SET PARTNER SAFETY FULL; --事务安全,同步模式
  3. ALTER DATABASE <DatabaseName> SET PARTNER SAFETY OFF; --事务不安全,异步模式

总结

要进行以上sql server 2005的镜像设置一定要使用sql server 的配置管理器开启TCP/IP协议,如下图

如果没有启用TCP/IP协议则只能在同一个网段内的机器配置镜像,前面的配置步骤里面所用到的IP地址要换成对应的实例名。同一个网段配置并使用镜像的时实性、传输速率更高,适用于大数据量的同步,跨网段或者跨公网的sql server 2005镜像一般适用于数据量小,时实性要求不高的数据同步,而且数据库在公网上同步也不安全。

SQL SERVER镜像配置(包含见证服务器)的更多相关文章

  1. SQL SERVER镜像配置,无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法

    环境:非域环境 因为是自动故障转移,需要加入见证,事务安全模式是,强安全FULL模式 做到最后一步的时候,可能会遇到 执行( ALTER DATABASE [mirrortest] SET WITNE ...

  2. 第三篇——第二部分——第三文 配置SQL Server镜像——域环境

    原文:第三篇--第二部分--第三文 配置SQL Server镜像--域环境 原文出处:http://blog.csdn.net/dba_huangzj/article/details/28904503 ...

  3. 第三篇——第二部分——第四文 配置SQL Server镜像——非域环境

    原文:第三篇--第二部分--第四文 配置SQL Server镜像--非域环境 本文为非域环境搭建镜像演示,对于域环境搭建,可参照上文:http://blog.csdn.net/dba_huangzj/ ...

  4. 第三篇——第二部分——第五文 配置SQL Server镜像——域环境SQL Server镜像日常维护

    本文接上面两篇搭建镜像的文章: 第三篇--第二部分--第三文 配置SQL Server镜像--域环境:http://blog.csdn.net/dba_huangzj/article/details/ ...

  5. 第三篇——第二部分——第一文 SQL Server镜像简介

    原文:第三篇--第二部分--第一文 SQL Server镜像简介 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26951563 镜像是什 ...

  6. 【转】SQL Server 2012 配置AlwaysOn(三)

    转载自:http://www.cnblogs.com/lyhabc/p/4682986.html 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http:/ ...

  7. 三——第二部分——第二篇论文 计划建设SQL Server镜像

    本文接着前面的章节:SQL Server镜像简单介绍 本文出处:http://blog.csdn.net/dba_huangzj/article/details/27203053 俗话说:工欲善其事必 ...

  8. 第三篇——第二部分——第二文 计划搭建SQL Server镜像

    原文:第三篇--第二部分--第二文 计划搭建SQL Server镜像 本文紧跟上一章:SQL Server镜像简介 本文出处:http://blog.csdn.net/dba_huangzj/arti ...

  9. SQL Server镜像自动生成脚本

    SQL Server镜像自动生成脚本 镜像的搭建非常繁琐,花了一点时间写了这个脚本,方便大家搭建镜像 执行完这个镜像脚本之后,最好在每台机器都绑定一下hosts文件,不然的话,镜像可能会不work 1 ...

随机推荐

  1. 008-Centos 7.x安装 Ambari 2.2.2 + HDP 2.4.2 搭建Hadoop集群

    1.安装环境说明 安装前先安装好 Centos 7.2, jdk-8u91, mysql5.7.13 一共有3台机器,一个是主节点192.168.111.10,两个是从:192.168.111.11, ...

  2. 002-linux使用SecureCRT

    一.ssh 登录linux系统 1.确定网络连通性:ping www.jd.com 2.rpm -qa | grep ssh 可以看到系统中ssh安装包 查找当前系统是否已经安装 注:如果没有安装SS ...

  3. 八种排序算法--java实现(转)

    (转:http://blog.csdn.net/without0815/article/details/7697916) 8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中, ...

  4. Linux更改IP地址

    1.进入到root用户 2.执行命令:ifconfig 查看本机的名称 3.执行命令:ifconfig eth0 192.168.25.128 netmask 255.255.255.0  //eth ...

  5. SpringMVC的Model ModeMap ModelAndView @ModelAttribute @SessionAttribute区分

    Spring MVC整理系列(05)————Spring MVC配置解析及整合SpriSpring MVC之@ModelAttribute.@SessionAttributes以及Model的使用介绍 ...

  6. [LeetCode] 154. Find Minimum in Rotated Sorted Array II_Hard

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  7. python while for else

    python的循环挺有意思 while和for体中可以带上else项 while中的else表示循环条件不成立时,去执行一次,也就是退出循环前去做一次 for中的else表示固定循环正常完成后,去执行 ...

  8. vue中实现浏览器的复制功能

    点击复制,就可以实现copy <p class="inline-block"> <span >{{fenxiao.appSecret}}</span& ...

  9. 微信公众号支付(JSAPI)对接备忘

    0 说明 本文里说的微信公众号支付对接指的是对接第三方支付平台的微信公众号支付接口. 非微信支付官方文档里的公众号支付开发者文档那样的对接.不过,毕竟腾讯会把一部分渠道放给银行或有支付牌照的支付机构, ...

  10. node.js初识06

    node中的fs文件系统 var http = require("http"); var fs = require("fs"); var server = ht ...