暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【必备技能】Windows/Linux环境挂载NFS远程目录备份数据库

oracleace 2024-04-30
3169
感谢您关注“数据库运维之道”公众号,一起分享数据库运维技术!

本期将为大家分享“Windows/Linux环境挂载 NFS 远程目录备份数据库必备技能” 。数据库备份是一件非常重要的事情,为了实现数据库异机备份,很多时候我们会采用NFS远程挂载目录来备份数据库,例如:Oracle、MySQL、达梦数据库等备份。

关键词:NFS、挂载NFS目录、Oracle备份

一、NFS服务端配置

NFS是Network File System的缩写,是一种分布式文件系统协议,用于在计算机网络上共享文件。它允许客户端计算机通过网络远程访问和处理远程服务器上的文件和目录。下面介绍下nfs服务端配置步骤。

1、安装NFS软件包

    --安装nfs-utils软件包
    yum -y install nfs-utils
    --查看nfs软件包
    rpm -qa | grep nfs
    --查看nfs-utils软件包的配置文件
    rpm -qc nfs-utils
    --启动nfs和设置开机启动
    systemctl start nfs
    systemctl enable nfs

    2、在NFS服务器上建立用于NFS文件共享的目录,并设置足够的权限确保其他人也有写入权限。

      --创建目录
      mkdir dbywzdbackup
      --赋予权限
      chmod 777 dbywzdbackup
      --查看目录权限
      ls -ld dbywzdbackup
      --# 写入一个文本文件
      echo 'This is a nfs shared folder for ywzd database.' > dbywzdbackup/README

      3、NFS服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容,我们可以通过“rpm -qf”命令查看一下该配置文件是由哪个软件包安装提供的。

        --查看到/etc/exports文件由哪个软件包提供
        ls -l etc/exports
        rpm -qf etc/exports
        --查看setup软件包信息
        rpm -qi setup

        4、按照“共享目录的路径 允许访问的NFS客户端(共享权限参数)”的格式,定义要共享的目录与相应的权限。编辑"/etc/exports”配置文件。

          vim etc/exports
          /dbywzdbackup 192.168.6.0/24(rw,sync,root_squash)

          在NFS服务的配置文件中匹配IP地址有三种方法——第一种是直接写*号,代表任何主机都可以访问;第二种则是实验中采用的192.168.6.*通配格式,代表来自192.168.6.0/24网段的主机;第三种则是直接写对方的IP地址,如192.168.10.20,代表仅允许某个主机进行访问。

          6、启用NFS服务程序。由于在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call,远程过程调用)服务将NFS服务器的IP地址和端口号等信息发送给客户端。因此,在启动NFS服务之前,还需要顺带重启并启用rpcbind服务程序,并将这两个服务一并加入开机启动项中。

            systemctl restart rpcbind.service 
            systemctl enable rpcbind.service
            systemctl enable --now nfs-server.service

            7、如果有开启防火墙,防火墙放行NFS共享相关的服务。

              firewall-cmd --add-service=nfs --permanent 
              firewall-cmd --add-service=rpc-bind --permanent 
              firewall-cmd --add-service=mountd --permanent 
              firewall-cmd --reload

              以上步骤完成nfs服务端的配置!

              二、Linux服务端配置

              1、先使用showmount命令查询NFS服务器的远程共享信息。

                --查找showmount命令是由哪个软件包提供的
                yum provides showmount
                --安装nfs-utils软件包
                yum -y install nfs-utils
                --显示nfs服务器的共享列表
                showmount -e 192.168.6.40

                2、在NFS客户端创建一个挂载目录。使用mount命令并结合-t参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的IP地址、服务器上的共享目录以及要挂载到本地系统(即客户端)的目录

                  mkdir newstart
                  mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,nolock,proto=tcp,actimeo=0,vers=3,timeo=600 192.168.6.40:/dbywzdbackup newstart


                  # df -Th
                  Filesystem            Type      Size  Used Avail Use% Mounted on
                  nfs 192.168.6.40:/dbywzdbackup nfs4 500G 20M 499G 1% newstart

                  3、挂载成功后就应该能够顺利地看到在执行前面的操作时写入的文件内容了。如果希望NFS文件共享服务能一直有效,则需要将其写入到fstab文件中:

                    cat nfsfile/README 


                    --方法一
                    cat etc/rc.local
                    mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,nolock,proto=tcp,actimeo=0,vers=3,timeo=600 192.168.6.40:/dbywzdbackup newstart
                    chmod -X etc/rc.d/rc.local


                    --方法二
                    # vim /etc/fstab
                    192.168.6.40:/dbywzdbackup newstart nfs defaults 0 0 # 添加这一行
                    # mount -a

                    以上步骤实现NFS目录挂载。

                    三、Linux环境下Oracle rman定时备份配置

                    1、oracle用户,在/newstart目录下创建子目录,用于存放脚本和日志。

                      cd newstart
                      mkdir scripts log

                      2、在oracle用户下,创建rman脚本并授权。该脚本可以让多个实例和多个级别类型的备份共用一个脚本,可实现顺序压缩备份。

                        cd newstart/scripts
                        vi rman_level.sh
                        可以设置多个实例名称,以空格隔开:ORACLE_SIDS="orcl2"
                        可以设置备份文件的存放子目录,多个目录可用空格隔开:DIR_NAME="ORCL"
                        设置实例的ORACLE_HOME路径:ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1


                        chmod +x rman_level.sh
                        rman_level.sh脚本内容如下:
                        PATH=$PATH:$HOME/bin
                        CUSER=`id |cut -d"(" -f2 | cut -d ")" -f1`
                        LEVEL=${1}
                        if [ "$LEVEL" = "0" ]
                        then
                        BACKUPLEVEL=FULL
                        elif [ "$LEVEL" = "1" ]
                        then
                        BACKUPLEVEL=INCR
                        else
                        BACKUPLEVEL=ARCH
                        fi


                        CMD_STR1="
                        sql 'alter system archive log current ' ;
                        backup filesperset 2 incremental level=${1} as compressed backupset database format '/newstart/%d/%d_${BACKUPLEVEL}_%I_%T_%s' tag = 'LEVEL${1}' ;
                        "


                        if [ "$LEVEL" = "2" ]
                        then
                        CMD_STR1=""
                        fi


                        RMAN_LOG_FILE=/newstart/log/level${1}_rman.out


                        if [ ! -f "$RMAN_LOG_FILE" ]
                        then
                        touch "$RMAN_LOG_FILE"
                        chmod 666 $RMAN_LOG_FILE
                        fi


                        ORACLE_SIDS="orcl2"
                        for x in $ORACLE_SIDS
                        do
                        ORACLE_SID=$x
                        export ORACLE_SID


                        DIR_NAME="ORCL"
                        for d in $DIR_NAME
                        do
                        ORACLE_ID=$d
                        myPath="/newstart/$ORACLE_ID"
                        if [ ! -d "$myPath" ]
                        then
                        mkdir "$myPath"
                        chown -R oracle:oinstall "$myPath"
                        fi
                        done

                        echo >> $RMAN_LOG_FILE
                        chmod 666 $RMAN_LOG_FILE

                        echo Script $0 >> $RMAN_LOG_FILE
                        echo ==== started on `date` ==== >> $RMAN_LOG_FILE
                        echo >> $RMAN_LOG_FILE

                        ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
                        export ORACLE_HOME


                        ORACLE_USER=oracle
                        RMAN=$ORACLE_HOME/bin/rman




                        CMD_STR="
                        ORACLE_HOME=$ORACLE_HOME
                        export ORACLE_HOME
                        ORACLE_SID=$ORACLE_SID
                        export ORACLE_SID
                        $RMAN target nocatalog msglog $RMAN_LOG_FILE append << EOF
                        ALLOCATE CHANNEL FOR MAINTENANCE type disk;
                        crosscheck backup device type disk;
                        crosscheck archivelog all;
                        report obsolete;
                        delete noprompt expired backup;
                        delete noprompt obsolete device type disk;
                        release channel;


                        RUN {
                        ALLOCATE CHANNEL ch00 TYPE disk;
                        ALLOCATE CHANNEL ch01 TYPE disk;
                        ALLOCATE CHANNEL ch02 TYPE disk;
                        ALLOCATE CHANNEL ch03 TYPE disk;
                        $CMD_STR1
                        sql 'alter system archive log current' ;
                        backup as compressed backupset archivelog all format '/newstart/%d/%d_arch_%I_%T_%s' skip inaccessible delete input;
                        backup current controlfile format '/newstart/%d/%d_CONT_%I_%T_%s.ctl';
                        backup spfile format '/newstart/%d/spfile_%d_%I_%T_%s.ora';
                        RELEASE CHANNEL ch00;
                        RELEASE CHANNEL ch01;
                        RELEASE CHANNEL ch02;
                        RELEASE CHANNEL ch03;
                        }
                        EOF
                        "


                        # Initiate the command string
                        #echo $CMD_STR >> $RMAN_LOG_FILE
                        if [ "$CUSER" = "root" ]
                        then
                        su - $ORACLE_USER -c "$CMD_STR" >> $RMAN_LOG_FILE
                        RSTAT=$?
                        else
                        sh -c "$CMD_STR" >> $RMAN_LOG_FILE
                        RSTAT=$?
                        fi

                        #echo "$CMD_STR" >> $RMAN_LOG_FILE


                        # ---------------------------------------------------------------------------
                        # Log the completion of this script.
                        # ---------------------------------------------------------------------------

                        if [ "$RSTAT" = "0" ]
                        then
                        LOGMSG="ended successfully"
                        else
                        LOGMSG="ended in error"
                        fi

                        echo >> $RMAN_LOG_FILE
                        echo Script $0 >> $RMAN_LOG_FILE
                        echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE
                        echo >> $RMAN_LOG_FILE


                        done
                        exit $RSTAT

                        3、在oracle用户下,配置定时任务。参数0表示0级备份,1表示1级增量备份,2表示只做归档备份。每周六进行一次全备,周日至周五实现增量备份,每天中午归档备份。

                          crontab -e
                          30 23 * * 6 /newstart/scripts/rman_level.sh 0
                          30 23 * * 0-5 /newstart/scripts/rman_level.sh 1
                          15 12 * * * /newstart/scripts/rman_level.sh 2

                          4、备份检查脚本,通过sql语句检查每次的备份情况(备份类型、备份状态、备份时间、文件大小、压缩比)。

                            检查备份脚本
                            cd /newstart/scripts
                            vi check_backup.sh
                            chmod +x check_backup.sh


                            $ sh check_backup.sh
                            ora_pmon_orcl1
                            export ORACLE_SID=orcl1
                            INPUT_TYPE STATUS START_TIME END_TIME INPUT_BYTE OUTPUT_BYT TIME_TAKEN COMPRESSION_RATIO
                            ---------- ------------------------- -------------------- -------------------- ---------- ---------- ---------- -----------------
                            DB INCR RUNNING 2024-04-05 16:34:53 2024-04-05 17:00:23 165.24G 36.97G 00:25:30 4.46928092
                            ARCHIVELOG COMPLETED WITH WARNINGS 2024-04-05 16:31:01 2024-04-05 16:31:20 67.22M 65.95M 00:00:19 1.01929456
                            ARCHIVELOG COMPLETED WITH WARNINGS 2024-04-05 16:27:32 2024-04-05 16:28:41 2.42G 860.42M 00:01:09 2.87637185


                            检查脚本check_backup.sh的本文内容如下:
                            #!/bin/bash
                            source /home/oracle/.bash_profile
                            ps -ef|grep ora_|grep pmon|awk '{print$8}'
                            for inst_id in `ps -ef|grep ora_|grep pmon|awk '{print$8}'|sed -e 's/ora_pmon_//'|grep -v "sed"`
                            do
                            echo "export ORACLE_SID=$inst_id"
                            export ORACLE_SID=$inst_id
                            sqlplus -s / as sysdba <<-EOF
                            set pagesize 999
                            set linesize 1000
                            col input_type for a10
                            col status for a25
                            col time_taken_display for a10
                            col input_bytes_display for a10
                            col output_bytes_display for a10
                            col start_time for a20
                            col end_time for a20
                            select input_type,status,
                            to_char(start_time,'yyyy-mm-dd hh24:mi:ss') start_time,
                            to_char(end_time,'yyyy-mm-dd hh24:mi:ss') end_time,
                            input_bytes_display,
                            output_bytes_display,
                            time_taken_display,
                            compression_ratio
                            from v\$rman_backup_job_details
                            order by 3 desc;
                            EOF
                            done

                            以上步骤完成Oracle备份脚本配置。其他类型数据库备份不再举例。

                            四、在Windows NFS客户端上挂载NFS共享

                            1、启用windows  NFS客户端,windows10后的专业版和服务器版本内置有NFS客户端。控制面板\程序\程序和功能\启用或关闭windows功能中启用NFS客户端。

                            2、开始菜单中打开cmd窗口,使用和linux一样的mount命令进行挂载。

                              showmount -e 192.168.6.40
                              mount \\192.168.6.40\dbywzdbackup z:


                              如果挂载成功,命令将不会返回错误消息,然后盘符会多了一个E盘。


                              取消挂载命令
                              umount E:

                              通过以上配置,Linux服务器上的NFS共享能够在Windows NFS客户端中进行挂载并访问。如果想实现开机自动挂载,可以考虑用winodws的计划任务来帮助实现。

                              五、Windows环境下Oracle rman定时备份配置

                              1、进入到挂载目录盘,创建backup目录,接着创建全量备份文件ywzd_rman_level0.bat。

                                set ORACLE_SID=ywzd
                                rman target / nocatalog CMDFILE 'E:\backup\ywzd\ywzd_rman_level0.txt'
                                LOG 'E:\backup\ywzd\ywzd_rman_level0_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%".log'

                                2、创建ywzd_rman_level0.txt文件,用于存放rman备份脚本。

                                  run{
                                  allocate channel c1 device type disk;
                                  backup as compressed backupset filesperset 6 incremental level 0 database format 'E:\backup\ywzd\ywzd_db_level0_%d_%T_%U.bak'
                                  plus archivelog delete all input format 'E:\backup\ywzd\ywzd_arch_%d_%T_%U.bak';
                                  backup current controlfile format 'E:\backup\ywzd\ywzd_ctl_%d_%T_%U';
                                  crosscheck backup;
                                  report obsolete device type disk;
                                  delete noprompt obsolete device type disk;
                                  delete noprompt expired backup device type disk;
                                  release channel c1;
                                  }

                                  3、创建增量备份文件ywzd_rman_level1.bat。

                                    set ORACLE_SID=ywzd 
                                    rman target / nocatalog CMDFILE 'E:\backup\ywzd\ywzd_rman_level1.txt'
                                    LOG 'E:\backup\ywzd\ywzd_rman_level1_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%".log'

                                    4、创建ywzd_rman_level1.txt文件,用于存放rman备份脚本。

                                      run{
                                      allocate channel c1 device type disk;
                                      backup as compressed backupset filesperset 6 incremental level 1 database format 'E:\backup\ywzd\ywzd_db_level1_%d_%T_%U.bak'
                                      plus archivelog delete all input format 'E:\backup\ywzd\ywzd_arch_%d_%T_%U.bak';
                                      backup current controlfile format 'E:\backup\ywzd\ywzd_ctl_%d_%T_%U';
                                      crosscheck backup;
                                      report obsolete device type disk;
                                      delete noprompt obsolete device type disk;
                                      delete noprompt expired backup device type disk;
                                      release channel c1;
                                      }

                                      5、创建归档备份文件ywzd_rman_arch.bat

                                        set ORACLE_SID=lcncdbdg
                                        rman target / nocatalog CMDFILE 'E:\backup\ywzd\ywzd_rman_arch.txt'
                                        LOG 'E:\backup\ywzd\ywzd_rman_arch_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%".log'

                                        6、创建ywzd_rman_arch.txt文件,用于存放rman备份脚本。

                                          run{
                                          allocate channel c1 device type disk;
                                          backup archivelog all delete all input format 'E:\backup\ywzd\ywzd_arch_%d_%T_%U.bak';
                                          backup current controlfile format 'E:\backup\ywzd\ywzd_ctl_%d_%T_%U';
                                          release channel c1;
                                          }

                                          以上就是Window环境下的备份脚本。如果想实现定时备份,可以考虑用winodws的计划任务来帮助实现。

                                          【应知应会】数据文件大小扩容或缩容必备技能

                                          【经典案例】备份失败RMAN-06169及ORA-30013错误处理

                                          【备份恢复】Oracle 19.19 数据库异机恢复八大避坑指南分享

                                          【问题诊断】Oracle 11g 备份任务报RMAN-06820错误

                                          【应知应会】开启块修改跟踪特性提升备份效率

                                          以上就是本期关于“挂载 NFS 远程目录备份数据库必备技能”分享。希望能给大家带来帮助!

                                          欢迎关注“数据库运维之道”公众号,一起学习数据库技术!


                                          可以加我的微信,交个朋友或讨论数据库解决方案,请备注”姓名单位“,谢谢!


                                          推荐文章👇

                                          国外的程序员没有35岁魔咒吗?

                                          试看号主的拙作《MySQL 8.0运维与优化》(清华大学出版社)

                                          托业890分的Oracle ACE为您翻译国际大佬的雄文(合集)

                                          又考了一个Oracle优化的OCP,交一下作业

                                          一个计算机工程师如何达到英语专业八级的水平

                                          文章转载自oracleace,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                          评论