extractfilepath,oracle数据库如何与mysql数据库交互

伏羲号

extractfilepath,oracle数据库如何与mysql数据库交互?

OGG全称为Oracle GoldenGate,是由Oracle官方提供的用于解决异构数据环境中数据复制的一个商业工具。相比于其它迁移工具OGG的优势在于可以直接解析源端Oracle的redo log,因此能够实现在不需要对原表结构做太多调整的前提下完成数据增量部分的迁移。本篇文章将重点介绍如何使用OGG实现Oracle到MySQL数据的平滑迁移,以及讲述个人在迁移过程中所碰到问题的解决方案。

extractfilepath,oracle数据库如何与mysql数据库交互

(一)OGG逻辑架构

参照上图简单给大家介绍下OGG逻辑架构,让大家对OGG数据同步过程有个简单了解,后面章节会详细演示相关进程的配置方式,在OGG使用过程中主要涉及以下进程及文件:

Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全量、增量数据的抽取Trails文件:临时存放在磁盘上的数据文件Data Pump进程:运行在数据库源端,属于Extract进程的一个辅助进程,如果不配置Data Pump,Extract进程会将抽取的数据直接发送到目标端的Trail文件,如果配置了Data Pump,Extract进程会将数据抽取到本地Trail文件,然后通过Data Pump进程发送到目标端,配置Data Pump进程的主要好处是即使源端到目标端发生网络中断,Extract进程依然不会终止Collector进程:接收源端传输过来的数据变化,并写入本地Trail文件中Replicat进程:读取Trail文件中记录的数据变化,创建对应的DML语句并在目标端回放二、迁移方案(一)环境信息OGG版本 OGG 12.2.0.2.2 For Oracle OGG 12.2.0.2.2 For MySQL 数据库版本 Oracle 11.2.0.4 MySQL 5.7.21 OGG_HOME /home/oracle/ogg /opt/ogg (二)表结构迁移表结构迁移属于难度不高但内容比较繁琐的一步,我们在迁移表结构时使用了一个叫sqlines的开源工具,对于sqlines工具在MySQL端创建失败及不符合预期的表结构再进行特殊处理,以此来提高表结构转换的效率。注意:OGG在Oracle迁移MySQL的场景下不支持DDL语句同步,因此表结构迁移完成后到数据库切换前尽量不要再修改表结构。(三)数据迁移数据同步的操作均采用OGG工具进行,考虑数据全量和增量的衔接,OGG需要先将增量同步的抽取进程启动,抓取数据库的redo log,待全量抽取结束后开启增量数据回放,应用全量和增量这段期间产生的日志数据,OGG可基于参数配置进行重复数据处理,所以使用OGG时优先将增量进行配置并启用。此外,为了避免本章节篇幅过长,OGG参数将不再解释,有需要的朋友可以查看官方提供的Reference文档查询任何你不理解的参数。1.源端OGG配置(1)Oracle数据库配置针对Oracle数据库,OGG需要数据库开启归档模式及增加辅助补充日志、强制记录日志等来保障OGG可抓取到完整的日志信息查看当前环境是否满足要求,输出结果如下图所示:(2)Oracle数据库OGG用户创建OGG需要有一个用户有权限对数据库的相关对象做操作,以下为涉及的权限,该示例将创建一个用户名和密码均为ogg的Oracle数据库用户并授予以下权限(3)源端OGG 管理进程(MGR)配置(4)源端OGG 表级补全日志(trandata)配置表级补全日志需要在最小补全日志打开的情况下才起作用,之前只在数据库级开启了最小补全日志(alter database add supplemental log data;),redolog记录的信息还不够全面,必须再使用add trandata开启表级的补全日志以获得必要的信息。(5)源端OGG 抽取进程(extract)配置Extract进程运行在数据库源端,负责从源端数据表或日志中捕获数据。Extract进程利用其内在的checkpoint机制,周期性地检查并记录其读写的位置,通常是写入到本地的trail文件。这种机制是为了保证如果Extract进程终止或者操作系统宕机,我们重启Extract进程后,GoldenGate能够恢复到以前的状态,从上一个断点处继续往下运行,而不会有任何数据损失。(6)源端OGG 传输进程(pump)配置pump进程运行在数据库源端,其作用非常简单。如果源端的Extract抽取进程使用了本地trail文件,那么pump进程就会把trail文件以数据块的形式通过TCP/IP协议发送到目标端,Pump进程本质上是Extract进程的一种特殊形式,如果不使用trail文件,那么Extract进程在抽取完数据后,直接投递到目标端。补充:pump进程启动时需要与目标端的mgr进程进行连接,所以需要优先将目标端的mgr提前配置好,否则会报错连接被拒绝,无法传输抽取的日志文件到目标端对应目录下(7)源端OGG 异构mapping文件(defgen)生成该文件记录了源库需要复制的表的表结构定义信息,在源库生成该文件后需要拷贝到目标库的dirdef目录,当目标库的replica进程将传输过来的数据apply到目标库时需要读写该文件,同构的数据库不需要进行该操作。2.目标端OGG配置(1)目标端MySQL数据库配置确认MySQL端表结构已经存在MySQL数据库OGG用户创建mysql> create user 'ogg'@'%' identified by 'ogg';mysql> grant all on *.* to 'ogg'@'%';#### 提前创建好ogg存放checkpoint表的数据库mysql> create database ogg;(2)目标端OGG 管理进程(MGR)配置目标端的MGR进程和源端配置一样,可直接将源端配置方式在目标端重复执行一次即可,该部分不在赘述(3)目标端OGG 检查点日志表(checkpoint)配置checkpoint表用来保障一个事务执行完成后,在MySQL数据库从有一张表记录当前的日志回放点,与MySQL复制记录binlog的GTID或position点类似。#### 切换至ogg软件目录并执行ggsci进入命令行终端shell> cd $OGG_HOMEshell> ggsciggsci> edit param ./GLOBALScheckpointtable ogg.ggs_checkpointggsci> dblogin sourcedb ogg@17X.1X.84.121:3306 userid oggggsci> add checkpointtable ogg.ggs_checkpoint(4)目标端OGG 回放线程(replicat)配置Replicat进程运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML语句,然后应用到目标数据库中。#### 切换至ogg软件目录并执行ggsci进入命令行终端shell> cd $OGG_HOMEshell> ggsci#### 添加一个回放线程并与源端pump进程传输过来的trail文件关联,并使用checkpoint表确保数据不丢失ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint#### 增加/编辑回放进程配置文件ggsci> edit params r_cmsreplicat r_cmstargetdb cms@17X.1X.84.121:3306,userid ogg,password oggsourcedefs /opt/ogg/dirdef/cms.defdiscardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024HANDLECOLLISIONSMAP cms.*,target cms.*;注意:replicat进程只需配置完成,无需启动,待全量抽取完成后再启动。至此源端环境配置完成 待全量数据抽取完毕后启动目标端回放进程即可完成数据准实时同步。3.全量同步配置全量数据同步为一次性操作,当OGG软件部署完成及增量抽取进程配置并启动后,可配置1个特殊的extract进程从表中抽取数据,将抽取的数据保存到目标端生成文件,目标端同时启动一个单次运行的replicat回放进程将数据解析并回放至目标数据库中。(1)源端OGG 全量抽取进程(extract)配置#### 切换至ogg软件目录并执行ggsci进入命令行终端shell> cd $OGG_HOMEshell> ggsci#### 增加/编辑全量抽取进程配置文件#### 其中RMTFILE指定抽取的数据直接传送到远端对应目录下#### 注意:RMTFILE参数指定的文件只支持2位字符,如果超过replicat则无法识别ggsci> edit params ei_cmsSOURCEISTABLESETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")SETENV (ORACLE_SID=cms)SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)USERID ogg@appdb,PASSWORD oggRMTHOST 17X.1X.84.121,MGRPORT 7809RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purgeTABLE cms.*;#### 启动并查看抽取进程正常shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &## 查看日志是否正常进行全量抽取shell> tail -f ./dirrpt/ei_cms.rpt(2)目标端OGG 全量回放进程(replicat)配置#### 切换至ogg软件目录并执行ggsci进入命令行终端shell> cd $OGG_HOMEshell> ggsciggsci> edit params ri_cmsSPECIALRUNEND RUNTIMETARGETDB cms@17X.1X.84.121:3306,USERID ogg,PASSWORD oggEXTFILE /opt/ogg/dirdat/msDISCARDFILE ./dirrpt/ri_cms.dsc,purgeMAP cms.*,TARGET cms.*;#### 启动并查看回放进程正常shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &#### 查看日志是否正常进行全量回放shell> tail -f ./dirrpt/ri_cms.rpt三、数据校验数据校验是数据迁移过程中必不可少的环节,本章节提供给几个数据校验的思路共大家参数,校验方式可以由以下几个角度去实现:1.通过OGG日志查看全量、增量过程中discards记录是否为0来判断是否丢失数据;2.通过对源端、目标端的表执行count判断数据量是否一致;3.编写类似于pt-table-checksum校验原理的程序,实现行级别一致性校验,这种方式优缺点特别明显,优点是能够完全准确对数据内容进行校验,缺点是需要遍历每一行数据,校验成本较高;4.相对折中的数据校验方式是通过业务角度,提前编写好数十个返回结果较快的SQL,从业务角度抽样校验。四、迁移问题处理本章节将讲述迁移过程中碰到的一些问题及相应的解决方式。(一)MySQL限制在Oracle到MySQL的表结构迁移过程中主要碰到以下两个限制:1. Oracle端的表结构因为最初设计不严谨,存在大量的列使用varchar(4000)数据类型,导致迁移到MySQL后超出行限制,表结构无法创建。由于MySQL本身数据结构的限制,一个16K的数据页最少要存储两行数据,因此单行数据不能超过65,535 bytes,因此针对这种情况有两种解决方式:根据实际存储数据的长度,对超长的varchar列进行收缩;对于无法收缩的列转换数据类型为text,但这在使用过程中可能导致一些性能问题;2. 与第一点类似,在Innodb存储引擎中,索引前缀长度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且开启innodblargeprefix的场景下,这个限制是3072 bytes,即使用utf8mb4字符集时,最多只能对varchar(768)的列创建索引;3. 使用ogg全量初始化同步时,若存在外键约束,批量导入时由于各表的插入顺序不唯一,可能子表先插入数据而主表还未插入,导致报错子表依赖的记录不存在,因此建议数据迁移阶段禁用主外键约束,待迁移结束后再打开。mysql>set global foreign_key_checks=off;(二)全量与增量衔接HANDLECOLLISIONS参数是实现OGG全量数据与增量数据衔接的关键,其实现原理是在全量抽取前先开启增量抽取进程,抓去全量应用期间产生的redo log,当全量应用完成后,开启增量回放进程,应用全量期间的增量数据。使用该参数后增量回放DML语句时主要有以下场景及处理逻辑:目标端不存在delete语句的记录,忽略该问题并不记录到discardfile目标端丢失update记录- 更新的是主键值,update转换成insert- 更新的键值是非主键,忽略该问题并不记录到discardfile目标端重复insert已存在的主键值,这将被replicat进程转换为UPDATE现有主键值的行(三)OGG版本选择在OGG版本选择上我们也根据用户的场景多次更换了OGG版本,最初因为客户的Oracle 数据库版本为11.2.0.4,因此我们在选择OGG版本时优先选择使用了11版本,但是使用过程中发现,每次数据抽取生成的trail文件达到2G左右时,OGG报错连接中断,查看RMTFILE参数详细说明了解到trail文件默认限制为2G,后来我们替换OGG版本为12.3,使用MAXFILES参数控制生成多个指定大小的trail文件,回放时Replicat进程也能自动轮转读取Trail文件,最终解决该问题。但是如果不幸Oracle环境使用了Linux 5版本的系统,那么你的OGG需要再降一个小版本,最高只能使用OGG 12.2。(四)无主键表处理在迁移过程中还碰到一个比较难搞的问题就是当前Oracle端存在大量表没有主键。在MySQL中的表没有主键这几乎是不被允许的,因为很容易导致性能问题和主从延迟。同时在OGG迁移过程中表没有主键也会产生一些隐患,比如对于没有主键的表,OGG默认是将这个一行数据中所有的列拼凑起来作为唯一键,但实际还是可能存在重复数据导致数据同步异常,Oracle官方对此也提供了一个解决方案,通过对无主键表添加GUID列来作为行唯一标示,具体操作方式可以搜索MOS文档ID 1271578.1进行查看。(五)OGG安全规则报错信息2019-03-08 06:15:22 ERROR OGG-01201 Error reported by MGR : Access denied.错误信息含义源端报错表示为该抽取进程需要和目标端的mgr进程通讯,但是被拒绝,具体操作为:源端的extract进程需要与目标端mgr进行沟通,远程将目标的replicat进行启动,由于安全性现在而被拒绝连接。报错原因在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要远程启动目标端的replicat进程,需要在mgr节点增加访问控制参数允许远程调用解决办法在源端和目标端的mgr节点上分别增加访问控制规则并重启## 表示该mgr节点允许(ALLOW)10.186网段(IPADDR)的所有类型程序(PROG *)进行连接访问ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW(六)数据抽取方式报错信息2019-03-15 14:49:04 ERROR OGG-01192 Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').报错原因根据官方文档说明,当前直接通过Oracle数据库抽取数据写到MySQL这种initial-load方式,不支持LOBs数据类型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 则包含了CLOB字段,无法进行传输,并且该方式不支持超过4k的字段数据类型解决方法将抽取进程中的RMTTASK改为RMTFILE参数 官方建议将数据先抽取成文件,再基于文件数据解析进行初始化导入

如何用VBA代码来提取word中的图片?

使用Range.EnhMetaFileBits

来获取图片的EMF格式数组

然后用一系列API,转换成常规的jpg/png/gif/bmp格式

本方法不占用剪贴板

GDI+ 保存图片的函数改自这里:

https://www.cnblogs.com/Imageshop/archive/2012/03/02/2377871.html

略作调整如下:

'*************************************************************************

'** 作 者 : laviewpbt

'** 函 数 名 : SavehBitmapToFile

'** 输 入 : Stdpic(StdPicture) - 图象句柄

'** : FileName(String) - 保存路径

'** : FileFormat(ImageFileFormat) - 保存格式,默认jpg

'** : JpgQuality(Long) - JPG图象质量

'** : Resolution(Single) - 设置分辨率

'** 输 出 : 无

'** 功能描述 : 把图象保存为JPG、PNG、GIF、BMP格式

'** 修 改 人 : laviewpbt

'** 日 期 : 2012-03-02 22:56

'** 版 本 : 终结版

'** 修 改 人 : loquat 20190401

'*************************************************************************

Option Explicit

Private Const UnitPixel As Long = 2

Private Const EncoderQuality As String = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"

Private Type GdiplusStartupInput

GdiplusVersion As Long

DebugEventCallback As Long

SuppressBackgroundThread As Long

SuppressExternalCodecs As Long

End Type

Private Enum EncoderParameterValueType

EncoderParameterValueTypeByte = 1

EncoderParameterValueTypeASCII = 2

EncoderParameterValueTypeShort = 3

EncoderParameterValueTypeLong = 4

EncoderParameterValueTypeRational = 5

EncoderParameterValueTypeLongRange = 6

EncoderParameterValueTypeUndefined = 7

EncoderParameterValueTypeRationalRange = 8

End Enum

Private Type EncoderParameter

GUID(0 To 3) As Long

NumberOfValues As Long

type As EncoderParameterValueType

Value As Long

End Type

Private Type EncoderParameters

count As Long

Parameter As EncoderParameter

End Type

Private Type ImageCodecInfo

ClassID(0 To 3) As Long

FormatID(0 To 3) As Long

CodecName As Long

DllName As Long

FormatDescription As Long

FilenameExtension As Long

MimeType As Long

Flags As Long

Version As Long

SigCount As Long

SigSize As Long

SigPattern As Long

SigMask As Long

End Type

Private Declare Function GdiplusStartup Lib "gdiplus" (token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long

Private Declare Sub GdiplusShutdown Lib "gdiplus" (ByVal token As Long)

Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal hImage As Long, ByVal sFilename As Long, clsidEncoder As Any, encoderParams As Any) As Long

Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As Long

Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" (ByVal hbm As Long, ByVal hPal As Long, bitmap As Long) As GpStatus

Private Declare Function GdipGetImageEncodersSize Lib "gdiplus" (numEncoders As Long, Size As Long) As Long

Private Declare Function GdipGetImageEncoders Lib "gdiplus" (ByVal numEncoders As Long, ByVal Size As Long, Encoders As Any) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Declare Function lstrlenW Lib "kernel32" (ByVal psString As Any) As Long

Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszProgID As Long, pclsid As Any) As Long

Private Declare Function GdipBitmapSetResolution Lib "gdiplus" (ByVal bitmap As Long, ByVal xdpi As Single, ByVal ydpi As Single) As Long

Public Enum GpStatus

Ok = 0

GenericError = 1

InvalidParameter = 2

OutOfMemory = 3

ObjectBusy = 4

InsufficientBuffer = 5

NotImplemented = 6

Win32Error = 7

WrongState = 8

Aborted = 9

FileNotFound = 10

ValueOverflow = 11

AccessDenied = 12

UnknownImageFormat = 13

FontFamilyNotFound = 14

FontStyleNotFound = 15

NotTrueTypeFont = 16

UnsupportedGdiplusVersion = 17

GdiplusNotInitialized = 18

PropertyNotFound = 19

PropertyNotSupported = 20

ProfileNotFound = 21

End Enum

Public Enum ImageFileFormat

bmp = 1

jpg = 2

png = 3

gif = 4

End Enum

Public Function SavehBitmapToFile(hBitmap As Long, ByVal FileName As String, _

Optional ByVal FileFormat As ImageFileFormat = jpg, _

Optional ByVal JpgQuality As Long = 80, _

Optional Resolution As Single) As Boolean

Dim CLSID(3) As Long

Dim bitmap As Long

Dim token As Long

Dim Gsp As GdiplusStartupInput

Gsp.GdiplusVersion = 1 'GDI+ 1.0版本

GdiplusStartup token, Gsp '初始化GDI+

Debug.Print GdipCreateBitmapFromHBITMAP(hBitmap, 0, bitmap)

If bitmap <> 0 Then '如果成功的将hBitmap句柄代表的stdPic对象转换为GDI+的Bitmap对象了

GdipBitmapSetResolution bitmap, Resolution, Resolution

Select Case FileFormat

Case ImageFileFormat.bmp

If Not GetEncoderCLSID("Image/bmp", CLSID) = -1 Then

SavehBitmapToFile = (GdipSaveImageToFile(bitmap, StrPtr(FileName), CLSID(0), ByVal 0) = 0)

End If

Case ImageFileFormat.jpg 'JPG格式可以设置保存的质量

Dim aEncParams() As Byte

Dim uEncParams As EncoderParameters

If GetEncoderCLSID("Image/jpeg", CLSID) <> -1 Then

uEncParams.count = 1 ' 设置自定义的编码参数,这里为1个参数

If JpgQuality < 0 Then

JpgQuality = 0

ElseIf JpgQuality > 100 Then

JpgQuality = 100

End If

ReDim aEncParams(1 To Len(uEncParams))

With uEncParams.Parameter

.NumberOfValues = 1

.type = EncoderParameterValueTypeLong ' 设置参数值的数据类型为长整型

Call CLSIDFromString(StrPtr(EncoderQuality), .GUID(0)) ' 设置参数唯一标志的GUID,这里为编码品质

.Value = VarPtr(JpgQuality) ' 设置参数的值:品质等级,最高为100,图像文件大小与品质成正比

End With

CopyMemory aEncParams(1), uEncParams, Len(uEncParams)

SavehBitmapToFile = (GdipSaveImageToFile(bitmap, StrPtr(FileName), CLSID(0), aEncParams(1)) = 0)

End If

Case ImageFileFormat.png

If Not GetEncoderCLSID("Image/png", CLSID) = -1 Then

SavehBitmapToFile = (GdipSaveImageToFile(bitmap, StrPtr(FileName), CLSID(0), ByVal 0) = 0)

End If

Case ImageFileFormat.gif

If Not GetEncoderCLSID("Image/gif", CLSID) = -1 Then '如果原始的图像是24位,则这个函数会调用系统的调色板来将图像转换为8位,转换的效果会不尽人意,但也有可能系统不自动转换,保存失败

SavehBitmapToFile = (GdipSaveImageToFile(bitmap, StrPtr(FileName), CLSID(0), ByVal 0) = 0)

End If

End Select

End If

GdipDisposeImage bitmap '注意释放资源

GdiplusShutdown token '关闭GDI+。

End Function

Private Function GetEncoderCLSID(strMimeType As String, ClassID() As Long) As Long

Dim num As Long

Dim Size As Long

Dim i As Long

Dim Info() As ImageCodecInfo

Dim Buffer() As Byte

GetEncoderCLSID = -1

GdipGetImageEncodersSize num, Size '得到解码器数组的大小

If Size <> 0 Then

ReDim Info(1 To num) As ImageCodecInfo '给数组动态分配内存

ReDim Buffer(1 To Size) As Byte

GdipGetImageEncoders num, Size, Buffer(1) '得到数组和字符数据

CopyMemory Info(1), Buffer(1), (Len(Info(1)) * num) '复制类头

For i = 1 To num '循环检测所有解码

If (StrComp(PtrToStrW(Info(i).MimeType), strMimeType, vbTextCompare) = 0) Then '必须把指针转换成可用的字符

CopyMemory ClassID(0), Info(i).ClassID(0), 16 '保存类的ID

GetEncoderCLSID = i '返回成功的索引值

Exit For

End If

Next

End If

End Function

Private Function PtrToStrW(ByVal lpsz As Long) As String

Dim Out As String

Dim Length As Long

Length = lstrlenW(lpsz)

If Length > 0 Then

Out = StrConv(String$(Length, vbNullChar), vbUnicode)

CopyMemory ByVal Out, ByVal lpsz, Length * 2

PtrToStrW = StrConv(Out, vbFromUnicode)

End If

End Function

以下是我封装的代码:

当然我偷懒,没有使用GDI+,又选用了GDI,实际可以都用GDI+

Private Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long

Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long

Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long

Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Declare Function SetEnhMetaFileBits& Lib "gdi32.dll" (ByVal DataLen&, pData As Any)

Private Declare Function PlayEnhMetaFile& Lib "gdi32" (ByVal hdc&, ByVal hEMF&, pRect As Any)

Private Declare Function DeleteEnhMetaFile& Lib "gdi32.dll" (ByVal hEMF As Long)

Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long

Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long

Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Private Declare Function FillRect Lib "user32.dll" (ByVal hdc As Long, ByRef lpRect As Any, ByVal hBrush As Long) As Long

Private Declare Function InvertRect Lib "user32.dll" (ByVal hdc As Long, ByRef lpRect As Any) As Long

Function ImageExtract(obj As Object, ByVal FileName As String, _

Optional ByVal FileFormat As ImageFileFormat = jpg, _

Optional ByVal JpgQuality As Long = 80, _

Optional Resolution As Single) As Boolean

Dim n! '放大倍数

Dim aRECT(0 To 3) As Long

Dim hScreenDC&

Dim hMemDC&

Dim hBitmap&, hBitTemp&

Dim arr() As Byte, hEMF&

n = 4

Select Case TypeName(obj) '获取图像数组

Case "InlineShape"

arr = obj.Range.EnhMetaFileBits

aRECT(2) = PointsToPixels(obj.Width, False) '宽度

aRECT(3) = PointsToPixels(obj.Height, True) '高度

Case "Shape"

arr = obj.Anchor.EnhMetaFileBits

aRECT(2) = PointsToPixels(obj.Width, False) '宽度

aRECT(3) = PointsToPixels(obj.Height, True) '高度

End Select

hEMF = SetEnhMetaFileBits(UBound(arr) + 1, arr(0))

hScreenDC = GetDC(0&)

hMemDC = CreateCompatibleDC(hScreenDC)

hBitmap = CreateCompatibleBitmap(hScreenDC, aRECT(2), aRECT(3))

hBitTemp = SelectObject(hMemDC, hBitmap)

InvertRect hMemDC, aRECT(0)

If hEMF Then

PlayEnhMetaFile hMemDC, hEMF, aRECT(0)

DeleteEnhMetaFile hEMF '销毁EMF

End If

hBitmap = SelectObject(hMemDC, hBitTemp)

ImageExtract = SavehBitmapToFile(hBitmap, FileName, FileFormat, JpgQuality, Resolution)

DeleteObject hBitmap

DeleteDC hMemDC

DeleteDC hScreenDC

End Function

调用示例:

Dim oInlineShape As InlineShapeDim oShape As ShapeSet oInlineShape = oDocument.InlineShapes(1)Set oShape = oDocument.Shapes(2)If ImageExtract(oInlineShape, "c:\1.jpg",jpg, 100,600) thenmsgbox "保存成功"End IfIf ImageExtract(oShape, "c:\2.jpg",jpg, 100,600) thenmsgbox "保存成功"End If

安装程序出现extract?

失败

选群晖还是威联通比较好?

下面有详细对比,可以看自己的需求而定!

入NAS坑也几年了,玩过的产品有群晖、威联通、华芸、西部数据My Cloud以及Drobo等,也是看着NAS从几年前的冷门变成现在的渐热。在之前,国内NAS市场是群晖一家独大,威联通后来者入局,一上来采取的是高性价比策略,就是玩的便宜,于是在国内啃出来一块市场。但是这还不足以让冷门NAS脱坑。

由于前些年公有云的大范围关闭,如今百度云几乎靠一己之力撑起国内存储云的市场,但是公有云终究有限制和泄露风险,于是NAS市场在群晖、威联通的大范围争相宣传中,在华芸、铁威马、西部数据等品牌饕餮分食中,在玩家对数据私人化的翘首期盼中,终于粉墨登场,来至大众面前!

在面对市场众多NAS时,许多新手玩家一般会患上选择困难综合症,虽然无论是品牌还是产品都远比之前丰富不止一个数量级的情况下,但是整个市场还是群晖与威联通两家独大,大部分购买者还是会在这两品牌里面购买。

作者在网上也看到许多玩家关于NAS选择的碎碎念:如群晖适合无公网IP的内网穿透,威联通CloudLink更简单好用,两者多款产品性能相同,两者价格相差很大,群晖的软件简单操作易上手,威联通的安全性好操作更复杂,群晖似iOS系统,威联通类似Android系统,威联通黑科技较多等等…

碎碎念终究是碎碎念,还是让我来个两者全方位讲解吧。

个人能力有限,各位看官,也希望大家随时来补充。

创作态度:

这篇文章只说事,以数据为准,不掺任何个人态度!

这次的讲解主要从5个方面来说群晖与威联通两者的不同,分别为配置、价格、外观、性能、功能。采用的机器是群晖DS918+与威联通TS-453Bmini,作者会在每个对比后面加一个小总结,如果不想看过程可以直接跳到总结里面看结果。

1、外观对比

2、配置对比

3、价格对比

4、性能对比

5、功能对比

5.1 外网连接对比

5.2 下载功能对比

5.3 手机应用对比

5.4 协同办公对比

5.5 4K视频播放对比

5.6 资料备份对比

6、总结

1、外观对比

群晖DS918+与威联通TS-453Bmini作为两者阵容的中坚力量,外观设计与产品用料自然不遗余力。群晖DS918+一直延续NAS的经典设计,硬盘可以横向插拔的柜式结构。威联通TS-453Bmini在设计上有点别出心裁,采用了直立式结构,硬盘进行竖向插拔。

群晖DS918+的体积为166 mm x 199 mm x 223 mm,外壳表面为磨砂设计。系统风扇大小为92 mm x 92 mm x 2 pcs,指示灯可调节,噪音值为19.8 dB(A),噪音值测试为Seagate 2TB ST2000VN000 硬盘在待机状态下,以两支 G.R.A.S. Type 40AE 麦克风分别架设于 Synology NAS 前后各距离 1 公尺处,取平均数据。

威联通TS-453Bmini的体积为 210 × 151 × 200 mm,外壳表面为钢琴烤漆设计。系统风扇内置,指示灯可调节,噪音值为16.9 db(A),噪音值测试依据ISO 7779,依盘数装载最多数量硬盘 ,以 Bystander Position 测量,取机器运行中前方一米处平均数据。

外观小结

两者采用不一样的外观设计,但是外壳用料基本相同。对于玩家来说,可以按照自己喜好来购买。

2、配置对比

群晖DS918+与威联通TS-453Bmini都可以定位为小型企业或者家庭用中阶NAS, 配置上基本上相同,但是在侧重上又有所不同,群晖更加侧重于商务办公,威联通更加侧重于影音娱乐。

侧重点不同导致配置也有差异,群晖DS918+支持2个M.2 NVMe 2280 SSD扩容,这对于NAS的4K随机性能会有大幅度提升,威联通TS-453Bmini支持4K HDMI视频接口拓展,这意味着可以利用NAS组建家庭影院。

配置小结

两者采用相同的处理器,所以理论上的存储性能是相同的,但是群晖DS918+机身内置2个M.2 NVMe 2280 SSD盘位,所以对于4K随机性能方面会有提升。威联通则是配置HDMI接口,可以搭配HD Station创建家庭影院,在家中享用4K影片,威联通随机附赠QNAP 红外线遥控器。用户可以根据个人侧重来选择。

3、价格对比

选购群晖DS918+与威联通TS-453Bmini,两者均为标准配置,内存为4 GB。价格是什么值得买上的往期最低价格。

群晖DS918+最低价格为4160 元。

威联通TS-453Bmini价格为1979元。

如今,京东618秒杀价格分别为4180元与2299元。

价格小结

从价格来看,威联通TS-453Bmini的价格方面更有优势。

4、性能对比

我们对于两者的性能进行测试,两者都安装4块 2 TB西部数据NAS红盘,NAS红盘西部数据红盘拥有NASware特色技术,支持7X24小时不间断运行,拥有高稳定性与高可靠性。

关于RAID,我们需要在数据安全和性能上都做到最好的权衡,最终有RAID 5、RAID 10与RAID 6三个阵列可供选择,我们来看两者的利弊。

RAID5将数据以块为单位分布到各个硬盘上。RAID5不对数据进行备份,而是把数据和与其相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。

RAID 10首先对数据进行两两镜像,然后将数据在磁盘中条带化进行保护。在4块硬盘的情况下,可以防止两个磁盘同时出现故障,但是这两块硬盘不能是存储同一份数据的硬盘。如果发生意外,RAID 10重建速度较RAID 6更快。

RAID 6进行两次奇偶校验,以提供写入保护,因而RAID 6的写入速度小于其它级别的RAID。RAID 6可以允许任意两个磁盘同时出现故障。但是在4块硬盘的情况下,RAID 6的计算相较于RAID 10而言会更加密集,所以重建速度较慢。

综合考虑,我们选择RAID 10阵列。

我们使用CystalDisk Mark测试结果。

群晖DS918+测试数据

威联通TS-453Bmini测试数据

两者测试结果相似。

性能小结

群晖DS918+与威联通TS-453Bmini由于使用相同的处理器,所以对于速度而言,两者是相同的也在意料之中。

此外,群晖DS918+可以安装2个M.2 NVMe 2280 SSD,相比较之前而言,由于受制于千兆局域网的限制,它的连续性读写性能不会有太大变化,但是4K随机读写性能会有提升,对于Word、手机照片等类似的小文件速度会变快,可以达到几十兆每秒的速度,这需要根据所安装SSD的性能而言。

5、功能对比

群晖与威联通的系统都是基于Web页面进行操作,其中群晖最新的系统是DSM 6.2.2,威联通最新的系统是QTS 4.3.6,两者界面较为相似。通过多年的发展,两家都形成了自己庞大的生态圈,在系统中里面拥有丰富的应用拓展。

群晖DSM 6.2.2系统界面

威联通QTS 4.3.6系统界面

接下来我们从外网连接对比、下载功能对比、手机应用对比、协同办公对比、4K视频播放对比、资料备份对比 6个方面进行比对。让大家更好了解两者的差别。

5.1 外网连接对比

对于NAS玩家来说,外网连接是一个不可绕去的坎,在拥有NAS的那一刻,玩家想的是可以随时随地访问,它更像一个隐形的的移动硬盘,我们一直随身携带,当要访问的时候不能掉链子,但是公网IP是一个拦路虎。

作者先向大家作公网IP,内网IP,端口映射,内网穿透等名词解释,然后作者会从没有公网IP与有公网IP两种情况下,比较两者的实际使用效果。

公网IP:公网IP是主机用来与外部网络通信的公网IP地址,处于公网的电脑可以与其他的计算机互相访问。

内网IP:由于公网IP数量有限,所以会有多个内网的计算机以NAT(网络地址转换)协议,通过一个公网IP访问Internet。

端口映射:外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。

内网穿透:简单来讲,就是让外网能访问你本地的应用。

在没有公网IP的情况下,如果玩家想要进行远程访问的自己家中的NAS,则需要了解的是群晖QuickConnect与威联通CloudLink的官方服务。

这两个服务是一样的工作原理,都是通过官方的服务器进行数据中转,上传下载速度就受到官方服务器的带宽和同时访问的流量决定,这意味着你的速度快不了!

威联通CloudLink服务设置界面

群晖QuickConnect服务设置界面

这两个服务只需要使用自己的ID登录就可以使用,设置不复杂。作者尝试同时通过群晖QuickConnect与威联通CloudLink服务上传一个165 MB的视频文件,家里千兆局域网环境,带宽100 M电信,下午3:30测试。

结果群晖使用15秒上传完成,威联通使用9秒上传完成。这结果出乎意料,通过查验,在局域网内无论是群晖的DS file还是威联通的Qfile通过什么方式连接,都会优先选择局域网进行传输。

于是作者更换网络,再次上传同一个视频。群晖QuickConnect则是以100 KB/s左右的速度上传, 而威联通CloudLink跑满了带宽,上传速度为10MB/s。作者再同时下载一个文件,威联通的下载速度为110KB/s,群晖的下载速度为50 KB/s。

这个测试会受到上传下载时间、同一时间点访问量、以及家中电信带宽可能不稳定性干扰,仅做参考。

当然有条件的玩家也可以通过公网IP进行外网连接,对于电信用户来说,公网IP较好得到,只需要打电话就可申请。对于移动或者联通用户来说可能稍微复杂一些。由于连接上了公网之后就是考验玩家所处网络环境的速度,所以这个环节我们不测试速度,只看如何进行外网连接。

由于作者的是电信网络,已经拥有公网IP,所以可以直接进行连接。

在群晖系统中,我们可以看到有一个EZ-Internet,通过这个可以快速配置网络,主要配置路由器转发与DDNS服务就好了。

配置完成后,我们在DDNS中查看。

状态显示正常即可。

在威联通里面通过My DDNS进行操作,在里面启用就好。

两者都是极为简单的操作,就可以外网连接NAS了。

5.2 下载功能对比

很多NAS玩家都很重视下载这个功能,而NAS自带的就只有一个Download Station下载器。我们在群晖DS918+与威联通TS-453Bmini同时下载这个,查看双方的对比。

群晖Download Station:Download Station是一款网页式下载应用程序,可通过BT、FTP、 HTTP、 NZB、FlashGet、 QQDL和eMule从Internet 下载文件,并订阅RSS Feed来获得最热门或最新的BT信息。自动解压缩服务可以在每一次下载压缩文件至Synology NAS时,自动进行解压缩。使用Download Station,你不仅能从多个文件空间服务网站下载文件,还可通过BT搜索功能中系统默认及自己添加的搜索引擎来搜寻torrent文件。

威联通Download Station:Download Station 支持多种下载模式,包括 BT、PT、Megnet link、HTTP/HTTPS 及 FTP/FTPS。利用 Chrome或 Firefox 打开Download Station,您就可以轻易地以拖曳方式将下载种子从计算机桌面新增至 Download Station 中,或是输入 BT 文件网址完成下载任务。Download Station 搭载先进的下载搜索引擎,便利地提供下载服务。

通过两者的介绍与使用对比,两者都不能让玩家满意,作者任意选取一部分网上资源的下载链接,其中群晖Download Station表现比威联通略好,但是都是属于半斤八两的水平。两者针对于热门资源的下载表现不错,冷门资源基本上无法指望。

但是这并不能代表群晖与威联通的下载水平,对于两家NAS厂商来说,他们并不是不明白,所以双方都开始对开源的应用软件容器引擎进行开发。在双方的应用库中都可以下载这个开源的应用软件容器引擎。而应用软件则是使用Docker Hub社区里面的现有Docker。Docker Hub是一个由Docker公司负责维护的公共注册中心,它包含了超过15,000个可用来下载和构建容器的镜像,并且还提供认证、工作组结构、工作流工具(比如webhooks)、构建触发器以及私有工具。

那么如何拥有?群晖的可以搜索Docker,威联通可以搜索Container Station。通过这个开源的应用软件容器引擎,玩家可以装各种各样的Docker软件,包括咱们之前熟知的迅雷、百度云、Transmission、aira2等等。

对于一些新手玩家,如何使用这个Docker还需要进行学习。主要的操作步骤就是首先在Docker Hub下载需要的Docker,然后安装设置参数进行使用,由于网上已经有太多群晖与威联通玩家推出的教程,所以这里不再赘述。

通过这个开源的应用软件容器引擎,群晖与威联通玩家可以暂时站在同一条战线了。因为两者都是从Docker Hub下载Docker进行使用,所以两者的使用方法可以说是一模一样,玩家在搜索教程的时候,不妨可以同时搜索群晖与威联通的教程。

就使用后的效果而言,作者针对几个常用的下载工具都进行了试用,其中Transmission下载速度优秀,但是占用的内存较高,内存大的NAS用户可以使用。qBittorrent占用内存较小,下载速度优秀,强力推荐。aira2的下载速度稍慢。百度云如果没有会员,分分钟会被封号,如果百度云有许多资料要导入,可以开个会员一次性全部导入,平时如果不得不玩百度云,建议可以租号进行下载。

5.3 手机应用对比

对于NAS而言,如何实现随时随地的访问,这与APP应用是分不开的。这次我们会以iOS系统为例,简述群晖与威联通的手机端应用对比。

作者查看了两者在App Store里面的应用,目前群晖已经开发了18个应用,其中包括有Apple Watch两个应用,Apple TV两个应用。威联通也开发了19个应用,其中包括Apple TV一个应用,两者的生态系统都建立的非常丰富。

笔者也对常用的功能进行列举,从而在App Store里面寻找相关应用,发现双方基本上都有相对应的APP,不过除开几个最基本的APP之外,其余的基本上功能有些单一。

我们就拿最基本的文件管理APP进行对比。

左群晖DS file / 右威联通Qfile

两者的界面设计以及交互方式如出一辙,十分简洁明了。其中威联通的Qfile相比较于群晖DS file,稍微多了几项小功能,如我的最爱,分享链接,以及下载文件夹,这些都不是主体作用,无妨大碍。接下来,我们对一个视频文件点开,查看可在APP中进行的操作有哪些?

左群晖DS file / 右威联通Qfile

与群晖相比,威联通在功能方面多了串流以及转档功能,串流功能是可以将视频串流到其他播放设备上进行观看,而转档是可以将较高码率的视频转成较低码率的视频,如将4K视频转成1080P、720P、480P、360P、240P等码率。

5.4 协同办公对比

协同办公功能主要是针对于局域网内办公使用,群晖DS918+与威联通TS-453Bmini都可以针对中小型办公团队配置,那么它的协作如何呢?

群晖DS918+的协作主要依赖Drive。你可以随时随地从其他设备同步文件到Drive,群晖也研发了各个平台的应用来保证这个操作的流畅性,通过官网可以下载应用,目前官网提供了5种PC端下载,包括有Windows (msi)、Windows (exe)、Mac (dmg)、Ubuntu (32 bits, deb)、Ubuntu (64 bits, deb)。同时我们也可以在直接在Drive应用里面下载移动端包括有iOS与安卓应用。

我们在Windows系统上安装了Drive,进行查看。

这是将Windows电脑上的一个文件夹与NAS中的一个文件夹保持同步,所有的数据可以实时更新,在一个局域网内的所有用户都可以安装这个Drive应用进行同步,相当于把NAS上的一个文件夹作为公共区域,所有在局域网内的用户都可以进行使用。

威联通则是有Qsync Central应用,这个应用是让用户随时随地同步文件。针对于一个局域网的用户而言,也可以使用此软件来写作办公。目前这个软件支持Windows、Mac、iOS以及安卓。其中iOS中是以Qfile APP呈现,因为同兼备管理文件功能。

这个应用与群晖的Drive应用的性质是一样的,两者的大体操作也是相同。我们下载Windows系统应用进行安装在电脑上。也是选择NAS上的一个文件夹与本地的一个文件夹进行相互同步。玩家也可以在在同一个局域网下创建一个公共局域映射到每个人的电脑上进行使用。

群晖与威联通两者对于办公协作的理念趋于一致,两者采取的方法几乎相同。

5.5 4K视频播放对比

对于4K视频的支持,是群晖DS918+与威联通TS-453Bmini都在宣传的卖点。不过群晖在宣传的时候,提到能够同时转码多达两个通道的 H.265/H.264 4K 视频,是用于共享和存储超高清媒体内容的理想之选。而威联通在宣传的时候是支持 2 路 4K (H.264) 硬件译码及影片在线实时转档与脱机背景转档。显然从宣传上来看,群晖支持H.265,威联通不支持H.265。

那么在讲4K视频播放之前,我们针对H.264与H.265进行一下科普。

H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。它是一种视频压缩标准,同时也是一种被广泛使用的高精度视频的录制、压缩和发布格式。H.264因其是蓝光光盘的一种编解码标准而著名,所有蓝光播放器都必须能解码H.264。

H.265标准在H.264基础上,对一些技术进行改进,仅需原来的一半带宽就可以播放相同质量的视频。那很明显采用H.265编码的时候电脑、手机、平板、电视、包括我们监控行业,都能在同等视频质量的基础上节省更多带宽和容量。然而,H.265要征收较高的专利费。

接下来,作者同时下载H.264标准的4K视频与H.265标准的视频进行打开尝试。

在群晖的应用库中我们下载Video Station,然后导入两个视频,经过测试,两个视频均可播放。

在威联通的应用库中,我们下载Video Station,然后导入两个视频,经过测试,其中H.265标准的视频无法播放,显示此视频的比特率较高,无法使用即时转码。

通过对比,威联通暂时不支持H.265格式的视频,但是并不是没有办法,通过Docker Hub

可以安装KODI软件,可以完美播放H.265标准视频。

此外,值得一提的是,如果你的播放设备如手机、电脑、电视支持H.265标准,那么这个文件就可以播放,你可以把NAS当做存储设备来使用,唯一遗憾的是它不能在应用内转码。而多数要观看4K H.265格式的玩家,也是不会转成低码率的!

5.6 资料备份对比

对于玩家来说,买NAS最大的作用还是为了保障数据安全。

如何保障数据安全?一方面防止资料被窃取,对于许多没办法连接外网的玩家,被窃取资料大概率是不太可能的。而连接外网的玩家,如果对数据安全较为担忧,也可以查看官方给的安全措施,这其中包括TLS/SSL传输加密、自动封锁IP、单文件加密、网域安全认证、Dos防护等等。在这方面,群晖与威联通官方都做的较好,而玩家却较少关注这一方面。

另一方面,保护数据安全则是备份!对于NAS而言,拥有一份天然的优势就是RAID磁盘阵列。RAID是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。

目前我们常用的RAID 有RAID 0、RAID 1、RAID 5、RAID 6、RAID 10、RAID 50等,其中RAID 0是没有冗余功能的,如果一个磁盘(物理)损坏,则所有的数据都无法使用。RAID 1利用率最高只能达到50%(使用两块盘的情况下),是所有RAID级别中最低的。一般对于家庭用户或者中小型企业用户而言,采用的较多是RAID 1、RAID 5、RAID 6以及RAID10。

那么除开RAID磁盘阵列之外,群晖与威联通还做了哪些备份保护呢?

群晖本地备份:Hyper Backup 和 Snapshot Replication

Hyper Backup 使您可以备份应用程序和系统配置,并在需要时进行还原,以确保数据一致性。更重要的是,此套件还具有块级增量备份,这意味着只备份与初始版本相比已更改的文件,同时通过跨文件重复数据删除来删除只是重命名或重复的文件,以避免不必要的存储消耗。

如果您的 NAS 型号支持 Btrfs1 文件系统,则可以考虑使用 Snapshot Replication 创建本地副本。执行快照过程只需几秒钟,只会对系统性能造成最低程度的影响。与 Hyper Backup 相比,Snapshot Replication 的备份速度/恢复时间更快,并且还适用于共享文件夹和 iSCSI LUN。

威联通本地备份:快照功能

快照为数据提供区块级保护。快照可以记录厚卷、精简卷或区块 iSCSI LUN 在特定时间点的状态。意外删除或修改快照中的数据时,可将其迅速恢复至该状态。快照存储在存储池中,仅记录最后一次创建快照之后的数据更改,从而能够节省空间。

通过比较两者的本地备份方案,发现群晖与威联通采取的措施其实是一样的。两者如今都支持区块级的数据保护技术,在本地备份中,将拥有极其快速的快照撷取与还原能力。

那么何为区块级技术?

区块层级Block- based LUN技术,与档案层级File-based LUN技术相比,它拥有更快速的快照撷取与还原能力。以iSCSI LUN分享NAS空间的方法为例来说明,iSCSI LUN可分为File-based LUN与Block- based LUN两种。File- based LUN是在NAS的文件系统中建立映像档,再将空间分享给其他装置,但也因其存在于文件系统上,效能发挥有限。而后期所发展的Block-based LUN,则直接将LUN以区块的方式做分配应用,不仅加强效能,更原生支持虚拟化应用技术。

3-2-1 数据保护策略

除开本地备份策略,双方都采用了最广为接受的3-2-1 数据保护策略。3-2-1 数据保护策略表示至少具有三个数据副本,其中一个副本存储在本地,其余副本存储在两个不同的设备上。对于个人用户,可以考虑采用此策略对珍贵记忆(如照片、家庭视频和自定义相册)进行企业级数据保护,或选择保留至少两个数据副本以确保数据可用性。实施这个策略的应用为群晖Hyper Backup与威联通Hybrid Backup Sync 3,群晖与威联通的这两个应用其实很像。

群晖Hyper Backup支持将数据备份到本地共享文件夹、连接到 Synology NAS 的外部存储设备(例如 USB)、远程 Synology NAS、文件服务器和云服务。

威联通Hybrid Backup Sync 3是将数据备份、复原、同步等功能整合到一个应用里面,通过应用可以将 QNAP NAS 中的数据备份或同步到另一台 QNAP NAS、远程服务器或云服务中。

值得一提的是,威联通在Hybrid Backup Sync 3中采用了重复数据删除 (QuDedup) 技术可加速多版本备份效率,节省带宽及储存空间。而且Windows、Mac 及 Linux(Ubuntu) 使用者还可下载 QuDedup Extract Tool 应用工具解析 QuDedup 去重复化文件格式 .qdff,并直接在计算机上还原从远程或云端上所下载的 .qdff 档案,让您的备份档随处可携。

功能小结

随着群晖与威联通两家的对标竞争,两者针对各个功能所采用的各种方案策略已经呈现趋同化,这也很好理解,同一功能并没有专利,如果出现更好的解决方案,两者没有理由不及时跟入。目前,两者大部分功能体验可以呈现一致性的趋势。虽然在以前有戏说新手“群”,老手“威”,有的玩家会深以为然,俯首称赞。但是拿到如今而言,却已时过境迁,不可同日而语了。

6、总结

群晖DS918+与威联通TS-453Bmini作为大众深受喜爱的两款NAS,两者的设计、功能以及体验显然是经过大众淘沙之后,得到沉金之选。而在这次对比体验中,我们发现两者趋同化已经达到一个十分惊人的地步,虽然在设计与使用的小细节有所差异,但是在功能性方面已经取得大同。

怎么讲excel里面的flash动画单独提出来?

1. 点击菜单栏中的“工具(T) -> 宏(M)-> 宏(M)”,调出“宏”窗口,按照图示,随便输入一个名字,然后点击“创建”2. 弹出窗口中的内容替换为下面代码。Sub ExtractFlash()Dim tmpFileName As String, FileNumber As IntegerDim myFileId As LongDim myArr() As ByteDim i As LongDim MyFileLen As Long, myIndex As LongDim swfFileLen As LongDim swfArr() As BytetmpFileName = Application.GetOpenFilename("office File(*.doc;*.xls),*.doc;*.xls", , "选择要提取FLash的office文件")If tmpFileName = "False" Then Exit SubmyFileId = FreeFileOpen tmpFileName For Binary As #myFileIdMyFileLen = LOF(myFileId)ReDim myArr(MyFileLen - 1)Get myFileId, , myArr()Close myFileIdApplication.ScreenUpdating = Falsei = 0Do While i < MyFileLenIf myArr(i) = &H46 ThenIf myArr(i + 1) = &H57 And myArr(i + 2) = &H53 ThenswfFileLen = CLng(&H1000000) * myArr(i + 7) + CLng(&H10000) * myArr(i + 6) + CLng(&H100) * myArr(i + 5) + myArr(i + 4)ReDim swfArr(swfFileLen - 1)For myIndex = 0 To swfFileLen - 1swfArr(myIndex) = myArr(i + myIndex)Next myIndexExit DoElsei = i + 3End IfElsei = i + 1End IfLoopmyFileId = FreeFiletmpFileName = Left(tmpFileName, Len(tmpFileName) - 4) & ".swf"Open tmpFileName For Binary As #myFileIdPut #myFileId, , swfArrClose myFileIdMsgBox "以" & tmpFileName & "名字保存"End Sub3. 输入完毕后,按F5键运行,出现如下窗口,选择含有Flash的Excel或Word文件打开。4. 弹出窗口如下,选择“确定”。5. 在该Excel或Word存放位置处就出现了提

取出来

的Flash文件(这里为”游戏.swf”).

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,118人围观)

还没有评论,来说两句吧...