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

本文为非域环境搭建镜像演示,对于域环境搭建,可参照上文:http://blog.csdn.net/dba_huangzj/article/details/28904503
原文出处:http://blog.csdn.net/dba_huangzj/article/details/27652857

前面已经演示了域环境下的镜像搭建,本文将使用非域环境来搭建镜像,同样,先按照不带见证服务器的高安全模式(同步)的方式搭建,然后 演示异步模式,最后会演示带有见证服务器的高安全模式。

准备条件

服务器

服务器角色 机器名/实例名 版本 IP
主体服务器 RepA Windows Server 2008R2 英文x64 192.168.1.2
镜像服务器 RepB Windows Server 2008R2 英文x64 192.168.1.3
见证服务器 Win7 Win7 企业版 192.168.1.4

注:Rep是Replication(复制)的缩写,RepA和RepB一开始是搭建来做复制演示,本文借用这3台服务器。

SQL Server

均使用SQL Server 2008 R2 企业版 英文 X64

演示数据库

AdventureWorks2008R2

第一步:检查环境

由于在非域环境内,所以需要做的检查相对来说多很多,下面按照演示环境,逐个测试下面的条件:

  1. Windows 账号。
  2. 网络是否能联通,并且端口可用。
  3. 主体服务器和镜像服务器的磁盘配置是否正确。
  4. SQL Server版本、补丁是否满足镜像要求。
  5. SQL Server数据库的恢复模式、兼容级别。
  6. SQL Server上是否有常规的备份作业,特别是日志备份。
  7. 主体服务器和镜像服务器的SQL Server能否互通。
  8. 主体服务器和镜像服务器中是否有共享文件夹。

Windows账号:

搭建镜像中,涉及Windows账号的主要是在共享文件夹中,非域环境下需要证书来搭建镜像,另外对于小库,一般使用备份还原的方式,也就是说,需要把主体数据库上的备份文件传输到镜像服务器上,这些都需要用到Windows账号操作共享文件夹。本文为了演示方便,使用了Administrator作为Windows的账号,作为最佳实践,建议真正搭建时使用专用的Windows账号,并且保证有足够的权限。

网络是否联通,并且端口可用:

非单机下的高可用都严重依赖网络,网络不通,一切都白搭。所以首先要确保网络是能互访的。下面测试一下本例中使用的主体服务器和镜像服务器是否能互访:

在RepA上ping RepB(本例IP地址192.168.1.3)

在RepB上ping RepA(本例IP地址192.168.1.2)

可见是能ping通的,为了方便,本例已关闭防火墙,所以端口问题不需要检查,如果在生产环境,就需要和网络管理员确认端口是否已经开启。检查端口可以用Telnet命令。如果输入Telnet后出现下面的错误:
英文:‘telnet’ is not recognized as an internal or external command, operable program or batch file.

中文:'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件。

可以在“开始”→“控制面板”→“程序”,“在程序和功能”找到并点击“打开或关闭Windows功能”进入Windows 功能设置对话框。找到并勾选“Telnet客户端”和“Telnet服务器”,最后“确定”。依据版本不同,开启方式也会不同,具体版本请自行查找搜索引擎的方案。

主体服务器和镜像服务器的磁盘配置是否正确:

在正式环境中,往往不会只有一个磁盘,本例由于实体机的资源限制,所以只保留系统盘,即C盘做演示。下面先检查主体服务器(RepA)上演示库(AdventureWorks2008R2)的数据文件和日志文件所在的盘符和目录:

USE master
go
SELECT physical_name--物理文件路径
FROM sys.master_files
WHERE database_id = DB_ID('AdventureWorks2008R2')

本例结果如下:

接下来到镜像服务器,也就是RepB上检查是否存在这个盘符和目录,如果不存在,要手动创建。下面是手动创建后的文件夹:

要注意,后续还原的时候,要检查还原时文件路径是否也指向相同的目录。文件名也要一致。

SQL Server版本、补丁是否满足镜像要求:


本例使用相同的安装文件,且均为2008R2(OS和SQL),并且没有联网更新,所以基本上可以确保版本和补丁一致。如果是正式环境,需要考虑,虽然从2005 SP1开始就支持镜像,但是真正完整支持镜像功能的还是从2005 SP2开始,另外除了SQL Server版本之外,Windows 的版本、补丁也要检查,虽然没有很确切指定OS也必须完全一致,但是一致的版本会比较少异常。

SQL Server数据库的恢复模式、兼容级别:

检查恢复模式和兼容级别,可以使用下面的语句实现:

USE master
go
SELECT name [数据库名] ,
recovery_model_desc [恢复模式] ,
CASE WHEN [compatibility_level] = 90 THEN '2005'
WHEN [compatibility_level] = 100 THEN '2008'
WHEN [compatibility_level] > 100 THEN '2008+'
ELSE '2000 or lower version'
END [兼容级别]
FROM sys.databases
WHERE name = 'AdventureWorks2008R2'


在本例中,演示库为简单模式,所以用SSMS或者命令修改:

SSMS修改:



T-SQL修改:

USE [master]
GO
ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY FULL WITH NO_WAIT
GO

本人建议使用T-SQL修改,因为在服务器比较繁忙的时候,使用图形化界面操作会很慢甚至超时。并且一个DBA应该会使用这些T-SQL命令。否则就太不专业了。

再次执行检查脚本,可见恢复模式已经变回了Full:

SQL Server上是否有常规的备份作业,特别是日志备份:

这一步就不做演示了,打开SQL Server Agent即可检查,另外搭建镜像的人应该具有会看是否有常规备份的能力。

主体服务器和镜像服务器的SQL Server能否互通:

在前面的第二步中,主要是检查OS的网络,但是OS能连通不代表SQL Server能连通,所以有必要检查SQL Server是否能互联。方法很简单,分别打开SSMS,并且输入伙伴服务器的SQL Server IP/实例名。本例先使用SA来检查:

在RepA上连接RepB:


在RepB上连接RepA:

主体服务器和镜像服务器中是否有共享文件夹:

前面说过,对非域环境下,需要使用证书来搭建镜像,另外需要对备份文件进行传输,这些都会使用到共享文件夹,当然可以用别的方式实现,不过共享文件夹可能是最为简单的方式。本例中,我将在主体服务器(RepA)上建立一个共享文件夹,以便RepB能访问。不过如果条件允许,我更建议在有容错能力的磁盘上(比如RAID、SAN等)创建共享文件夹,这样即使主体服务器崩溃,也不至于影响镜像服务器对共享文件夹的操作。

现在来简单操作一下:

创建文件夹:

授予Everyone读写权限:

再次提醒,针对正式环境,强烈建议使用专用账号,并且适当控制权限,比如对文件夹在搭建过程中允许完全控制,但是在正式运行时只允许“读”操作等。

搭建成功:

检查是否能访问:

这一步可以在RepB中,输入UNC路径,如本例的:\\RepA\ShareFolders

到目前为止,准备工作已经完毕。下面开始第二步。

第二步:使用证书配置镜像,并备份还原数据库

在这一步中,我们将做两件事,第一件是使用证书来配置镜像,第二件是备份还原数据库。在非域环境下,必须使用证书来搭建镜像,所以我把搭建证书放在第一步。有些资料上会把备份还原操作放在证书搭建之前,但是根据个人经验,当磁盘IO、网络性能不佳的时候,备份、传输、还原都会浪费大量的时间(个人操作过2个小时),并且期间服务器几乎不能操作。这种时候,我会选择先搭建好,再还原,然后马上进行同步。

创建证书:

如果服务器使用Local System作为SQL Server服务账号,就需要使用证书授权。证书授权同时也可以在你的服务器不能通过其他服务器的账号访问对方服务器或者你不想授权给Windows登录时使用。

使用证书搭建镜像的步骤如下:

  1. 创建数据库主密钥(如果主密钥不存在)。
  2. 在Master数据库中创建证书并用主密钥加密。
  3. 使用证书授权创建端点(endpoint)。
  4. 备份证书成为证书文件。
  5. 在服务器上创建登录账号,用于提供其他实例访问。
  6. 在master库中创建用户,并映射到上一步的登录账号中。
  7. 把证书授权给这些用户。
  8. 在端点上授权。
  9. 设置主体服务器的镜像伙伴。
  10. 设置镜像服务器的主体伙伴。
  11. 配置见证服务器。

Step 1:创建数据库主密钥

主密钥的用处在这里是用于加密证书,当然主密钥不仅仅只有这个作用。对数据库主密钥的密码及存储保护要小心,这是实力级别的对象,影响面非常广。可以使用下面语句来创建:

USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd'; /*
--删除主密钥
USE master;
DROP MASTER KEY
*/

使用相同方式在镜像服务器创建数据库主密钥。

Step 2:创建证书,并用主密钥加密

创建证书时,默认在创建日期开始一年后过期,所以针对证书的创建,要注意其过期时间。下面是在“主体服务器”上创建HOST_A_cert证书的创建

USE master
GO
CREATE CERTIFICATE Host_A_Cert
WITH Subject = 'Host_A Certificate',
Expiry_Date = '2015-1-1'; --过期日期 /*
--删除证书
USE master;
DROP CERTIFICATE HOST_A_cert
*/

使用相同的方法在镜像服务器上实现对HOST_B_cert证书的创建

Step 3:创建端点

可以使用下面的代码在主体服务器中创建端点,并且指定使用5022,端口,端口在镜像配置过程中不强制使用特定端口(被占用或者特定端口如1433除外)。

--使用Host_A_Cert证书创建端点
IF NOT EXISTS ( SELECT 1
FROM sys.database_mirroring_endpoints )
BEGIN
CREATE ENDPOINT [DatabaseMirroring] STATE = STARTED AS TCP ( LISTENER_PORT = 5022,
LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION =
CERTIFICATE Host_A_Cert, ENCRYPTION = REQUIRED Algorithm AES, ROLE =
ALL );
END

在镜像服务器对证书名稍作修改,创建镜像服务器的端点。

Step 4:备份证书

备份证书的目的是发送到别的服务器并导入证书,以便别的服务器能通过证书访问这台服务器(主体服务器)。

BACKUP CERTIFICATE Host_A_Cert
TO FILE = 'C:\ShareFolders\Host_A_Cert.cer';

同理,在镜像服务器上重复一次,注意证书名和路径。备份之后可以在目标文件夹上看到有一个cer文件:


这里有个建议,分别在RepA和RepB本地创建一个单独的文件夹Certifications,然后用来存储本服务器和伙伴服务器的证书,证书一直存放在共享文件夹并不合理。本例分别在本机的C盘上创建一个Certifications的文件夹并存放所有的证书,如图:

Step 5:创建登录账号

针对每个服务器单独创建一个服务器登录账号,这里只需要创建一个登录给镜像服务器即可:

CREATE LOGIN Host_B_Login WITH PASSWORD = 'Pa$$w0rd';

同理,在镜像服务器上创建Host_A_Login给主体服务器。

Step 6:创建用户,并映射到Step 5中创建的登录账号中

在主体服务器上运行:

CREATE USER Host_B_User For Login Host_B_Login;

同理在镜像服务器也创建。

Step 7:使用证书授权用户

创建一个新的证书,并使用从伙伴服务器中复制过来的证书导入,然后映射step 6中的账号到这个新证书上。

CREATE CERTIFICATE Host_B_Cert
AUTHORIZATION Host_B_User
FROM FILE = 'C:\Certifications\Host_B_Cert.cer';

注意镜像服务器上也同样。

Step 8:把Step 5中的登录账号授权访问端口

GRANT CONNECT ON ENDPOINT::[DatabaseMirroring] TO [Host_B_Login];

镜像服务器也一样。

到此为止,配置镜像的步骤已经完毕,后续会给出尽可能自动化的配置脚本。

备份还原数据库:

这一步,把主体服务器(RepA)上的演示数据库备份并还原到RepB上进行初始化操作:

  1. 完整备份AdventureWork2008R2到共享文件夹C:\ShareFolders
  2. 复制备份文件到镜像服务器(如果权限足够,直接使用共享路径来还原即可)
  3. 以Nonrecovery选项还原AdventureWork2008R2到镜像服务器(RepB)
  4. 日志备份AdventureWork2008R2,并同样方式还原到RepB

Step 1:完整备份:

Step 2:在镜像服务器(RepB)上还原数据库,并使用Nonrecovery方式:

注意路径和还原的文件名:

Step 3:备份及还原日志:

同样以Nonrecovery方式还原:

第三步:启动镜像

前面两步主要是对镜像的配置准备,下面开始正式启动镜像:

Step 1:右键主体服务器的主体数据库,选择【镜像】


Step 2:选择【配置镜像】:这一步我们主要是获取主体服务器的网络地址,看下图的红框部分

Step 3:在镜像服务器(RepB)上执行下面脚本:

注意顺序,先要在RepB上执行

ALTER DATABASE AdventureWorks2008R2
SET PARTNER = 'TCP://RepA:5022';
GO

Step 4:在主体服务器(RepA)执行下面脚本,把RepB添加成RepA的伙伴

ALTER DATABASE AdventureWorks2008R2
SET PARTNER = 'TCP://RepB:5022';
GO

	执行后,可以看到RepA上的镜像配置:
 

Step 5:切换模式

Step 3~4中的搭建是使用高安全模式搭建,如果希望使用高性能模式(再次提醒,本例没有使用见证服务器,所以不能使用自动故障转移的高安全模式),可以使用下面脚本在RepA上实现:

ALTER DATABASE AdventureWorks2008R2
SET PARTNER SAFETY OFF
GO

再次打开,可见运行模式已经是高性能模式:



Step 6:验证故障转移

下面再用语句来试一下是否能故障转移,先检查两个库的状态,这里用个小技巧,使用 【注册服务器】,如图:


然后新建注册:



 

同理把RepB也加进去:

 

然后打开一个查询窗口,用于一次性查询两个服务器,前提是要有足够的权限,本例用sa来连接:

 

注意下图的粉红色的部分,如果出现(1/2)这种情况,表示有一台服务器不能连接成功:

 

结果如下:我们只关注一小部分内容:

 

现在切换回RepA的查询窗口,然后输入:

ALTER DATABASE AdventureWorks2008R2 SET PARTNER FAILOVER;--在主体服务器上执行

然后到【注册管理器】中再查询,可以看到现在RepB已经是Principal,也就是主体服务器了:

 

读者可以用GUI界面操作,这里就不做过多演示。

带有见证服务器的非域环境镜像配置


下面演示如何把见证服务器加进镜像环境中,首先,我们保持前面的配置,即搭建好主体和镜像服务器,然后我们使用一个Win7的系统来做见证服务器,上面装有SQL Server 2008 R2企业版,可以使用Express或者工作组版来做见证服务器。

Step 1:验证三台服务器的网络互通,这里就不做累赘,读者可以参考前面的方法检查。

Step 2:根据前面的步骤,在见证服务器上创建主密钥、证书等:

--创建主密钥
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd'; --演示所需,否则不要设置这么简单的密码
GO
/*
--删除主密钥
USE master;
DROP MASTER KEY
*/
USE master;
CREATE CERTIFICATE HOST_C_cert
WITH SUBJECT = 'HOST_C certificate'--在Winess实例上创建证书,命名为HOST_C_cert,这个选项是描述证书
,EXPIRY_DATE ='2015-6-5' ;--证书过期时间,可以适当设置长一点,具体按实际需要设置
GO
/*
--删除证书
USE master;
DROP CERTIFICATE HOST_C_cert
*/
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=5022 --使用5022端口,这个端口可以改成未被使用的端口,但是镜像过程中的所有合作者都应该使用相同的端口
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE HOST_C_cert --使用证书来授权端点
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL --表示这个端点可以作为任何角色,包括主服务器、镜像服务器、见证服务器。具体可看联机丛书。
);
GO
/*
--删除镜像端点
IF EXISTS (SELECT * FROM sys.endpoints e WHERE e.name = N'Endpoint_Mirroring')
DROP ENDPOINT [Endpoint_Mirroring]
GO
*/
BACKUP CERTIFICATE HOST_C_cert TO FILE = 'C:\Certifications\HOST_C_cert.cer';
GO

确保RepA、RepB、Win7这三台机上都有主体、镜像和见证所产生的3个证书。

在见证服务器上为主体、镜像服务器创建以证书为验证的账号、用户名及端点。

--在Witness实例上创建一个登录名给Principal实例
USE master;
CREATE LOGIN HOST_A_login WITH PASSWORD = 'Pa$$w0rd';
GO
--创建一个用于给这个登录名
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
GO
--让该帐号使用证书授权
CREATE CERTIFICATE HOST_A_cert
AUTHORIZATION HOST_A_user
FROM FILE = 'C:\Certifications\HOST_A_cert.cer'
GO
--授予这个新账号连接端点的权限
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO HOST_A_login;
GO
/*
--删除账号
DROP LOGIN HOST_A_user
*/
--在Witness实例上创建一个登录名给Mirror实例
USE master;
CREATE LOGIN HOST_B_login WITH PASSWORD = 'Pa$$w0rd';
GO
--创建一个用于给这个登录名
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
GO
--让该帐号使用证书授权
CREATE CERTIFICATE HOST_B_cert
AUTHORIZATION HOST_B_user
FROM FILE = 'C:\Certifications\HOST_B_cert.cer'
GO
--授予这个新账号连接端点的权限
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO HOST_B_login;
GO
/*
--删除账号
DROP LOGIN HOST_B_user
*/

分别在RepA和RepB中执行下面语句,为见证服务器创建连接端点的权限:

USE master;
CREATE LOGIN HOST_C_login WITH PASSWORD = 'Pa$$w0rd';
GO
--创建一个用于给这个登录名
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
GO
--让该帐号使用证书授权
CREATE CERTIFICATE HOST_C_cert
AUTHORIZATION HOST_C_user
FROM FILE = 'C:\Certifications\HOST_C_cert.cer'
GO
--授予这个新账号连接端点的权限
GRANT CONNECT ON ENDPOINT::DatabaseMirroring TO HOST_C_login;
GO

在RepB中应该存在这两个登录,而在RepA中应该存在Host_B_Login和Host_C_Login两个账户:

然后在主体服务器上执行下面语句,加入见证服务器:

ALTER DATABASE AdventureWorks2008R2   SET WITNESS = 'TCP://win7:5022'

完毕之后,打开RepA的镜像配置,可以见到见证服务器已经加入:

我们可以测试一下,把RepA的SQL Server服务关闭,实现主体服务器的“故障”,看是否RepB能自动切换:

第一步,检查RepB的状态:

第二步,关闭RepA的服务:

第三步,刷新RepB的状态:

可见已经切换过去,并且状态为Disconnected,注意,即使此时RepA再次联机,也不会自动切换成为主体服务器,需要手动切换,这部分读者可以自行测试。把RepA再次启动之后,可以对比镜像的状态,从Disconnected变成了Synchronized。

到处为止,非域环境下的镜像配置已经完毕。

第三篇——第二部分——第四文 配置SQL Server镜像——非域环境的更多相关文章

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

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

  2. 第三篇——第二部分——第六文 监控SQL Server镜像

    原文:第三篇--第二部分--第六文 监控SQL Server镜像 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26846203 要优化, ...

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

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

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

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

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

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

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

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

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

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/DBA_Huangzj/article/details/26951563 原文出处:http://bl ...

  8. 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)

    该篇是 Grissom.CMS 框架系列文章的第三篇, 主要介绍框架用到的核心库 EasyJsonToSql, 把标准的配置文件和数据结构解析成可执行的 sql. 该框架能实现自动化增删改查得益于 E ...

  9. 配置sql server 2000以允许远程访问 及 连接中的四个最常见错误

    地址:http://www.cnblogs.com/JoshuaDreaming/archive/2010/12/01/1893242.html 配置sql server 2000以允许远程访问适合故 ...

随机推荐

  1. SE 2014年4月5日

    背景需求: 缺省情况下,Level-1路由器只将去往其它区域的报文发送到最近的Level-1-2路由器. 路由渗透使Level-1-2路由器将Level-2区域的路由信息发布到Level-1区域. 4 ...

  2. 谈Web应用系统的可维护性

           每一个软件开发人员都十分清楚, 当软件构建得越来越复杂时, 可维护性就成了一个很突出的问题. 如何在构造软件系统的过程中始终保持可控制的可维护性呢?          一. 整体组织   ...

  3. 使用windows-SQLyog连接linux-mysql

          嘿嘿,最近又清闲了一点,重新安装了mysql去学习.   -----博客园-邦邦酱好 系统环境: 1. 主机为windows系统,安装了SQLyog. 2. 主机上还安装了虚拟机,系统为c ...

  4. JAVA邮件收发实现(待)

    http://blog.csdn.net/ycg01/article/details/1394465

  5. codeforces 112APetya and Strings(字符串水题)

    A. Petya and Strings 点击打开题目 time limit per test 2 seconds memory limit per test 256 megabytes input ...

  6. UVALive - 4621 Cav 贪心 + 分析

    题目大意:有一张洞穴地图,要在这个洞穴里面存放水,要求水不能碰到洞穴顶部.如今给出每一个位置的顶部位置和地面高度.问最多能够放多少水 解题思路:根据物理定理,每一段有水的连续区间,水位高度必须相等 所 ...

  7. svn代码统计工具的金额

    StatSVN介绍 StatSVN是Java写开源统计程序,从statCVS从移植.从能Subversion版本号来获取信息库,该项目开发的叙述性说明,然后生成各种表格和图表.例:时间线.针对每一个开 ...

  8. CSDN-markdown语法之怎样使用LaTeX语法编写数学公式

    文件夹 文件夹 正文 标记公式 行内公式 块级公式 上标和下标 分数表示 各种括号 根号表示 省略号 矢量表示 间隔空间 希腊字母 特殊字符 关系运算符 集合运算符 对数运算符 三角运算符 微积分运算 ...

  9. Unity多玩家网络游戏开发教程1章Unity带有网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件.专门提供了对网络功能的支持. 可是.大部分开发人员第一次接触到的还是Unity自带的网络功能.也就是大家常 ...

  10. 使用VBA将批量的WORD文档转换为PDF

    Sub BatchConvertToPDF() Dim destFolderPath As String destFolderPath = GetFolderPath If destFolderPat ...