• 转://ASM与文件系统之间文件传输


    熟悉数据库运维的程序猿都知道,数据的备份重于一切,随着业务的发展,数据量也会越来越大,有时候备份集会放在文件系统上面,有的备份集会放在asm存储上面,实现文件系统到文件系统之间的文件传输很简单,cp或者scp都能简单的实现。

    但是很多情况下,我们的数据库服务器是挂了存储,划好了lun的,数据或者备份都放在大容量高性能的存储上,很多场景下文件系统可能满足不了这种需求,这时候就需要asm存储出场了,常见的如Oracle rac环境,standalone环境下。

    这里就引发了这样一种思考,存放在asm存储里面的文件,如何取到本地文件系统或者直接传输到另外一台服务器上去?

    即实现以下场景的文件传输:

    1. ASM存储 -> ASM存储,
    2. ASM存储 -> 文件系统,
    3. 文件系统 -> ASM存储 
    面对这3种情况,想必不是很熟悉数据库的人员会没有思路,或者有思路却不知道如何操作。当然,在同一服务器上,我们照样可以用cp命令实现,甚至也可以基于rman命令去实现文件传输:

    ◆ 实现ASM存储到文件系统之间的文件传输:

    ◆比如实现文件系统到ASM存储之前的文件传输:

    但是这样也稍显麻烦,如果要传输到另外一台服务器上去,我们还需要用到scp或者ftp命令,如果要传输的文件比较大数量比较多,那么瓶颈就来了,操作量大,过程繁琐,监控起来麻烦。

    下面就跨服务器的情况下,简单实现asm存储 -> 文件系统之间的文件传输,做了一个操作案例,希望能够提供我们另外一种新的思路去实现文件的传输。

    首先,开始案例之前,先介绍一下Oracle 10g就提供的DBMS_FILE_TRANSFER程序包,其作用可以实现本地与本地服务器,甚至本地与远程数据库服务器之间的文件传输,其中包括以下场景:
    文件系统 -> 文件系统
    ASM存储 -> ASM存储
    ASM存储 -> 文件系统
    文件系统 -> ASM存储

    这个包的用法有3种:
    在同一台服务器,我们可以用copy_file来实现asm存储到文件系统的文件传输。跨服务器之间我们推荐用: get_file 或者 put_file这两个存储过程实现文件传输,当然这个包功能很强大,比如可以支持在线备份,这里我们只介绍文件传输的使用。

    当然这里有个大前提,对于asm存储,并不是随便创建个文件都能放到asm存储上面的,必须是Oracle的数据库相关的文件才允许放置到asm存储上,比如数据文件、日志文件、控制文件、参数文件以及备份文件等

    原文如下:

    You can copy any type of file to and from a local file system. However, you can copy only database files (such as datafiles, tempfiles, controlfiles, and so on) to and from an ASM disk group.

    存储过程的描述如下:

    要使用这个包,需要注意的2点权限问题:
    对source_directory_object(源端)参数指定的目录对象有read权限
    对 destination_directory_object(目标端)指定的目录对象有write权限

    ▲ Usage Notes
    To run this procedure successfully, the current user must have the following privileges:
    • READ privilege on the directory object specified in the source_directory_object parameter
    • WRITE privilege on directory object specified in the destination_directory_object parameter

    要使用这个包,有2个限制就是
    1. 单个要传输的文件必须是512字节的整数倍
    2. 要传输的文件的大小不能超过2TB,
    不过这2点几乎不会成为瓶颈,因为很少有单个文件会超过2TB的:

    官方解释如下:
    Also, the copied file must meet the following requirements:
    • The size of the copied file must be a multiple of 512 bytes.
    • The size of the copied file must be less than or equal to two terabytes.

    下面进入具体场景:

    【场景一:本地数据库服务器之间的文件传输】

    1. 在dump文件所在的数据库创建需要的目录。

    目录已创建。

    目录已创建。

    2. 开始备份数据库,此场景共产生了6个dump文件

    3. 利用copy_file存储过程实现本地asm存储到文件系统的传输

    PL/SQL 过程已成功完成。
    结果显示如下:

    【场景二:跨服务器之间的文件传输】

    1. 在另外一台服务器(作为目标端),加入源端的tns串

    2. 在目标端创建dblink,通过dblink去访问源端(从这里可以看出,这种方式的文件传输也是依赖网络实现的)

    数据库链接已创建。
    3. 在目标端创建目录,存放从源端传输过来的文件

    目录已创建。
    4. 实现传输
    下面的脚本是基于官方的命令,做了一些改动,写成一个脚本,实现更有针对性的文件传输

    PL/SQL 过程已成功完成。

    如果要传输的文件比较大,建议后台nohup实现:

    也可以利用动态性能视图 V$SESSION_LONGOPS去监控与估算整个传输的过程与时间。

    至此,已经实现了 跨数据库服务器之间的 asm存储 -> 文件系统之间的文件传输,像其他场景asm存储->asm存储,文件系统->asm存储实现的方法是一致的。这个场景实现了对备份文件的传输,当然也可以根据具体的需求,对数据文件也可以进行文件传输。
    结果展示如下:

  • 相关阅读:
    MySql中游标的定义与使用方式
    C#操作Redis SortedSet 有序集合
    C#操作Redis Set 无序集合
    C#操作Redis Hash数据表
    C#操作Redis List 列表
    C#操作Redis String字符串(1)
    Code First 到现有数据库 Code First From DB
    C#中Typeof 是什么?和GetType 有什么关系?
    从政策到产品,一次聊懂互联网+护理
    全国及各省市级互联网医疗 相关行业政策汇总
  • 原文地址:https://www.cnblogs.com/zfox2017/p/7830986.html
Copyright © 2020-2023  润新知