精华内容
下载资源
问答
  • 刚好需要容灾备份和恢复的内容,搜索了许多相关的网站,总算汇总了这点东西。其实容灾包括很多内容,比如一系列应急计划如BCP,ERP,COOP,IRP,OEP,CCP,DRP等等,以及容灾的七个层次和针对这七个层次的容灾策略,还有...

    其实最近一直在忙于项目的用户建议书,杂七杂八的知识都要写进去一点,自己要google一番,然后理解一下;刚好需要容灾备份和恢复的内容,搜索了许多相关的网站,总算汇总了这点东西。

    其实容灾包括很多内容,比如一系列应急计划如BCP,ERP,COOP,IRP,OEP,CCP,DRP等等,以及容灾的七个层次和针对这七个层次的容灾策略,还有比较严谨和系统的容灾计划,限于篇幅和能力,没敢摘录太多内容。。。[@more@]

    容灾概念

    容灾是一个范畴比较广泛的概念,广义上,我们可以把所有与业务连续性相关的内容都纳入容灾。容灾是一个系统工程,它包括支持用户业务的方方面面。而容灾对于IT而言,就是提供一个能防止用户业务系统遭受各种灾难影响破坏的计算机系统。容灾还表现为一种未雨绸缪的主动性,而不是在灾难发生后的“亡羊补牢”。

    从狭义的角度,我们平常所谈论的容灾是指,除了生产站点以外,用户另外建立的冗余站点,当灾难发生,生产站点受到破坏时,冗余站点可以接管用户正常的业务,达到业务不间断的目的。为了达到更高的可用性,许多用户甚至建立多个冗余站点.

    从技术上看,衡量容灾系统有两个主要指标:RPO(RecoveryPointObject)和RTO(RecoveryTimeObject),其中RPO代表了当灾难发生时允许丢失的数据量,而RTO则代表了系统恢复的时间。RPO与RTO越小,系统的可用性就越高,当然用户需要的投资也越大。

    成功关键

    由于容灾所承担的是用户最关键的核心业务,其重要作用勿庸置疑,容灾本身的复杂性也是十分明显的,这就决定了容灾成为一项系统工程,所以我们需要制订完备的容灾恢复分析、计划、方案、设计和实施等等步骤。

    设计和完成灾难备份需要以下六大步骤:

    1.确定业务要求在设计开始阶段,必须进行“风险分析”和“业务影响分析”,以确定业务要求。必须分析每个业务流程,评估在灾难事故发生时的影响,包括业务及收入的损失。

    2.确定数据处理要求当业务要求确定后,就要将其转换成数据处理语句,或者是系统设计者可以使用的资料。得到的结果将是报表式的,包括对于每个应用所需的恢复时间,最大的数据丢失容忍量,运行所需CPU、存储容量及于其他应用和数据的相关性。

    3.设计备份及恢复方案当数据处理要求确定后,就要设计备份及恢复方案。同时可能需要进行总体设计以得出成本预计,如果有更清晰的方案要求,或者可能进行更详细的设计。

    4.选择完成设计的产品完成恢复方案的设计后,就可以选择实现这个方案的产品了。有部分产品在起初的设计阶段就已经考虑到了,但在这一阶段必须选择能够协同运行以实现恢复设计方案的产品。

    5.实现备份及恢复方案现在可以根据设计完成恢复方案了。要实现这一点,必须根据备份地点作出安排,准备灾难备份计划。

    6.保持最新的解决方案实现灾难备份是一个长期的过程。不管生产中心或备份中心有什么改变,都必须执行适当的调整以保证备份方案仍然可行。

    容灾方案Disaster Recovery Solutions

    Ø基于软件的数据备份技术

    数据库复制技术在数据库级别的灾难备份解决方案中可以实现远程容灾,主要产品有IBM DB2 HADR (High Availability Disaster Recovery), IBM Informix HDR (High Availability Data Replication)以及Oracle Data Guard.

    ØHACMP高可靠性灾备方案

    HACMP是利用网络来侦测主机及网卡的状况,搭配AIX所提供的硬盘镜像等功能,在主机、网卡、硬盘控制卡、硬盘或网络发生故障时,自动切换到另一套备用元件上重新工作;若是主机故障还切换至备份机上继续应用系统的运行。

    Ø基于磁盘系统的PPRC数据级容灾解决方案

    全称为Peer to Peer Remote Copy,通过ESCON通道建立配对的逻辑卷,能够自动将源卷上的数据同步到目标卷,利用这个特性,可以实现以存储为基础的、实时的、与应用无关的数据远程镜像功能,可根据需要选择同步或异步方式。PPRC实现较为简单,纯粹基于硬件,是无数据丢失且具有完全恢复功能的的灾难恢复解决方案,需要两个中心均配置IBM的ESS。

    最佳实践

    基于数据库复制技术的容灾传输的是SQL指令或者重作日志文件,在新数据没有被业务系统写入存储子系统前,就被指定发送到异地备份中心的数据库进行相关处理。数据库容灾技术采用异步传输方式,通过IP网络传输,支持一个业务中心向多个备份中心的数据库进行复制的要求,或者多个业务中心向一个备份中心复制的要求。在容灾过程中,业务中心和备份中心的数据库都处于打开状态,所以,数据库容灾技术属于热容灾方式。数据库容灾技术与存储子系统的类型、业务系统服务器的平台无关,与数据库的版本有一定关系,数据库容灾解决方案具有较好的使用灵活性。

    技术最简单和投资最少的容灾解决方案是基于数据库复制技术,简单地说,就是通过安装在服务器的数据复制软件,或是应用程序提供的数据复制、灾难恢复工具(如数据库的相关工具),利用TCP/IP网络连接远端的容备服务器,实现异地数据复制,所需的成本较低,用户不需更换太多现有的系统架构,也不用担心后端存储系统的兼容性问题,只须支付软件的授权费和灾备端的硬件设备费用即可。

    如果是在服务器数量较多的环境下,管理上的复杂程度就会增加,整体的投入成本也会增加。它的另一个缺点是软件安装在应用程序主机上,运行时会消耗主机的运行资源,如果硬件的等级不高,就可能给应用程序带来影响。

    这是一个高性价比的容灾解决方案,也是相对比较成熟的容灾解决方案。目前也是国内比较常见的容灾解决方案。但是数据库复制容灾技术只能作为数据库应用的容灾解决方案,如果需要其他非结构数据的容灾,还需要其他容灾技术作为补充。

    resserver.php?blogId=25150&resource=25626-image001.gif灾难恢复

    当在生产数据库系统发生灾难的情况下,此时可使用容灾数据库首先接管业务,然后进行数据的反向恢复。具体步骤为:

    1.1.生产数据发生灾难,生产端业务停止;

    2.修改数据库连接字符串的指向,将数据库指向灾备中心的数据库;

    3.应用系统重新连接灾备数据库,完成业务接管;

    4.排除生产系统的故障;

    5.启动生产系统的数据库

    6.反向恢复生产系统数据

    7.修改数据库连接字符串指向,将数据库指向生产中心的数据库;

    8.应用系统重新连接生产中心数据库,完成业务回切。

    数据库日常备份

    备份是指为防止系统出现操作失误或系统故障导致数据丢失,而将全系统或部分数据集合从应用主机的硬盘或阵列复制到其它的存储介质的过程。备份是数据高可用的最后一道防线,其目的是为了系统数据崩溃时能够恢复数据。

    容灾系统的目的在于保证系统数据和服务的“在线性”,即当系统发生故障时,仍然能够正常地向网络系统提供数据和服务,以使系统不致停顿;而备份技术的目的与此并不相同,备份是“将在线数据转移成离线数据的过程”,其目的在于应付系统数据中的逻辑错误和历史数据保存。

    容灾不能替换备份。容灾系统会完整地把生产系统的任何变化复制到容灾端去,包括不想让它复制的工作,比如不小心把计费系统内的用户信息表删除了,同时容灾端的用户信息表也会被完整地删除。如果是同步容灾,那容灾端同时就删除了;如果是异步容灾,那容灾端在数据异步复制的间隔内就会被删除。这时就需要从备份系统中取出最新备份,来恢复被错误删除的信息。因此容灾系统的建设不能替代备份系统的建设。

    日常备份计划

    序号备份周期目标

    1月完全备份每月进行数据的完全备份

    2周累计备份每周进行数据的累积备份,自上次完全备份以来的所有新产生修改数据

    3日增量备份每日进行数据的增量备份,仅备份上次增量备份之后新产生的数据

    展开全文
  • 容灾备份

    2018-03-20 01:08:41
    ,可极大的提高资源的利用率和系统的工作效率、性能,让客户从容灾系统的中获得最大的价值。 a. 两个生产中心部署相同的业务系统,结合网络层、主机层或应用的负载均衡技术,实现业务系统在两个数据中心并行...

    1. 什么是双活数据中心

    首先我们要知道双活就是Active-Active,故名思义就是两边都是活动在线提供服务的,是相对于传统的主备模式Active-Standby模式的。一个真正的双活方案是应该涵盖基础设施、中间件、应用程序各个层次的。

    双数据中心同时对外提供业务生产服务的双活模式,两个数据中心是对等的、不分主从、并可同时部署业务,可极大的提高资源的利用率和系统的工作效率、性能,让客户从容灾系统的中获得最大的价值。

    • a. 两个生产中心部署相同的业务系统,结合网络层、主机层或应用的负载均衡技术,实现业务系统在两个数据中心并行工作和负载分担。
    • b.两个生产中心部署不同的业务系统,互相实时灾备接管。

    数据中心双活又分为:同城双活、异地双活。

    这里写图片描述


    2. 传统主备模式的缺点

    出于灾备(Disaster Recovery)的目的,一般都会建设2个(或多个)数据中心。一个是主数据中心用于承担用户的业务,一个是备份数据中心用于备份主数据中心的数据、配置、业务等。主备数据中心之间一般有热备、冷备、双活三种备份方式。

    2.1 热备

    热备的情况下,只有主数据中心承担用户的业务,此时备数据中心对主数据中心进行实时的备份,当主数据中心挂掉以后,备数据中心可以自动接管主数据中心的业务,用户的业务不会中断,所以也感觉不到数据中心的切换。

    2.2 冷备

    冷备的情况下,也是只有主数据中心承担业务,但是备用数据中心不会对主数据中心进行实时备份,这时可能是周期性的进行备份或者干脆不进行备份,如果主数据中心挂掉了,用户的业务就会中断。

    2.3 双活

    双活是觉得备用数据中心只做备份太浪费了,所以让主备两个数据中心都同时承担用户的业务,此时,主备两个数据中心互为备份,并且进行实时备份。一般来说,主数据中心的负载可能会多一些,比如分担60~70%的业务,备数据中心只分担40%~30%的业务。

    传统主备模式是一个业务只在一个数据中心运行,企业结合灾备等级需求和业务需求,在备份中心部署了大量的备份服务器,但备份中心仅为该业务提供灾备服务,只有当灾难发生、生产数据中心瘫痪时,灾备中心的业务系统才启动这些服务器,造成备份中心服务器资源浪费,广域网链路也无法得到充分的利用。

    双活数据中心优点

    • 充分利用资源,避免了一个数据中心常年处于闲置状态而造成浪费。通过资源整合,“双活”数据中心的服务能力是双倍的。
    • 双活数据中心如果断了一个数据中心,另外一个数据中心还在运行,对用户来说是不可感知的。

    而一个灾备中心的模式,如果生产数据中心瘫痪,需要半个小时、甚至两个小时、甚至更长时间才能启动灾备中心,在启动灾备中心的时间里,用户交易会严重受损。


    3. 异地“双活”难度大

    当然,部署“双活”数据中心的难度也非常大,尤其是异地“双活”,涉及到数据同步效率问题。如果数据同步效率达不到要求,在灾难发生时就会造成一段时间的交易丢失。在异地“双活”的模式中,两地数据中心同时接纳交易,技术难度很大,需要更改众多底层程序。

    双活数据中心的建设首先要满足三个条件:

    • 第一个是应用双活,也就是说应用系统一定要实现双活;
    • 第二个是网络要双活,业务网络要保证能够同时联通两个数据中心;
    • 第三个是数据要双活,两边的数据要能够实现被独立使用。

    4. 两地三中心

    这里写图片描述

    展开全文
  • 之前服务器遭受过一次撒旦(Satan)勒索病毒,导致大量重要文件被加密,服务中断几天,最终进行了磁盘格式化,最终还是丢失了部分数据,浪费了大量人力财力,又如去年... 服务要多实例部署,数据需要容灾备份,团...

          之前服务器遭受过一次撒旦(Satan)勒索病毒,导致大量重要文件被加密,服务中断几天,最终进行了磁盘格式化,最终还是丢失了部分数据,浪费了大量人力财力,又如去年“程序员锁死服务器毁掉600万游戏项目“导致游戏开发公司破产事件,让我们深深意识到,基本的定期异地备份容灾还是非常需要的,特别是配置文件及数据库备份,万一哪天灾难就发生了呢

           服务要多实例部署,数据需要容灾备份,团队成员的技术也是需要”容灾备份“的,一旦存在技术单点问题,对应的程序员需要请长假甚至离职,就会造成开发任务无法正常推进困难。”单点故障“要避免,就需要进行技术备份,多实例部署,我的解决方案是是选择业务少的时期安排自我学习,规定学习范围。然而这理所应当的学习安排却遭到了不止一个同事的抵制,认为强迫他人意愿。

          在一个中小型公司,往往不是一个萝卜一个坑,而是要求一专多能,这就要求程序员要往高处走,就一定不能只是端好当前的饭碗做好当前的本职工作。一个高级程序员掌握的往往不是一种语言,就算以后走上了管理岗位,如果知识面不够广,最终也会沦为团队成员的笑话,各种被忽悠。我觉得,服从,是一个优秀员工的必备品质。有时候,你的不服从,丢掉的不只是公司的信耐,而是一个难能可贵的机会。

    展开全文
  • 为此,在分析大数据容灾备份现状的基础上,结合行业对大数据容灾备份需求,讨论了几种典型的技术解决方案及其优缺点,提出了一种基于HDFS的增量数据备份恢复方案,具备分钟级RPO的系统远程备份特性,可以较好地解决...
  • java实现数据库容灾备份,可以集成定时任务去实时备份 或者定期备份,欢迎一起讨论
  • 主流厂商容灾备份解决方案对比,介绍了国际国内主流数据容灾备份软件的优缺点,对系统管理人员是一个很好的参考。
  • 容灾备份解决方案

    2014-09-09 14:20:33
    容灾备份解决方案
  •  经典容灾备份解决方案大全   【】D2D2T备份系统给我们带来了什么影响 【】EMC公司帮助江苏移动选择ILM战略建设容灾备份系统 【】EMC容灾解决方案 【】ESG推荐的自动化灾难恢复解决方案 ...
  • /bin/bash #使用:./xx.sh -uroot -p'123456',使用前修改脚本进行变量配置 #过程:备份并刷新binlog,将最新的binlog文件名记录并整体压缩打包 #恢复:先进行全量备份,再对根据tim-binlog.txt中的记录,进行逐个...

    一,环境需求

    **安装前准备

    操作系统环境:Centos 7.2

    [root@localhost soft]# rpm -qa | grep mariadb

    [root@localhost soft]# rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

    [root@localhost soft]# rpm -e --nodeps mariadb-5.5.60-1.el7_5.x86_64

    [root@localhost soft]# rpm -e --nodeps mariadb-server-5.5.60-1.el7_5.x86_64

    1、解决依赖包并下载源码包至/soft/目录下

    yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bison

    cd /soft/

    wget https://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

    tar -zxvf boost_1_59_0.tar.gz #解压

    mv boost_1_59_0 /usr/local/boost #移动至/usr/local/boost/目录下

    wget http://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz

    tar -zxvf mysql-5.7.17.tar.gz

    2、新建MySQL用户和用户组,创建/data/mysql 目录存放mysql数据

    groupadd -r mysql && useradd -r -g mysql -s /sbin/nologin -M mysql

    mkdir -pv /data/mysql

    3、预编译及编译安装

    cd mysql-5.7.17

    [root@node03 mysql-5.7.17]#

    cmake \

    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

    -DMYSQL_DATADIR=/data/mysql \

    -DSYSCONFDIR=/etc \

    -DWITH_MYISAM_STORAGE_ENGINE=1 \

    -DWITH_INNOBASE_STORAGE_ENGINE=1 \

    -DWITH_MEMORY_STORAGE_ENGINE=1 \

    -DWITH_READLINE=1 \

    -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock\

    -DENABLED_LOCAL_INFILE=1 \

    -DWITH_PARTITION_STORAGE_ENGINE=1 \

    -DWITH_BOOST=/usr/local/boost \

    -DMYSQL_USER=mysql \

    -DEXTRA_CHARSETS=all \

    -DDEFAULT_CHARSET=utf8 \

    -DDEFAULT_COLLATION=utf8_general_ci

    注:

    DCMAKE_INSTALL_PREFIX=/usr/local/mysql:安装路径

    DMYSQL_DATADIR=/data/mysql:数据文件存放位置

    DSYSCONFDIR=/etc:my.cnf路径

    DWITH_MYISAM_STORAGE_ENGINE=1:支持MyIASM引擎

    DWITH_INNOBASE_STORAGE_ENGINE=1:支持InnoDB引擎

    DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock:连接数据库socket路径

    DMYSQL_TCP_PORT=3306:端口

    DENABLED_LOCAL_INFILE=1:允许从本地导入数据

    DWITH_PARTITION_STORAGE_ENGINE=1:安装支持数据库分区

    DEXTRA_CHARSETS=all:安装所有的字符集

    DDEFAULT_CHARSET=utf8:默认字符

    DWITH_EMBEDDED_SERVER=1:嵌入式服务器

    [root@node03 mysql-5.7.17]# make

    [root@node03 mysql-5.7.17]#make install #编译安装

    [root@mysqltest ~]# chown -R root.mysql /usr/local/mysql/

    [root@mysqltest ~]# chown -R root.mysql /data/mysql/

    错误

    错误1:

    CMake Error: your C compiler: "CMAKE_C_COMPILER-NOTFOUND" was not found. Please set CMAKE_C_COMPILER to a valid compiler path or name.

    CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Please set CMAKE_CXX_COMPILER to a valid compiler path or name.

    CMake Error at cmake/os/Linux.cmake:41 (MESSAGE):

    Unsupported compiler!

    Call Stack (most recent call first):

    CMakeLists.txt:162 (INCLUDE)

    解决办法:

    # yum groupinstall -y "Development Tools" "Server Platform Development" "Desktop Platform Development"

    错误2:

    CMake Error at cmake/readline.cmake:64 (MESSAGE):

    Curses library not found. Please install appropriate package,

    解决办法:

    [root@node02 ~]# yum install -y ncurses-devel.x86_64

    后续

    初始化数据库

    [root@mysql57 ~]#/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

    错误:

    如果datadir目录有文件,则会报以下错:

    [root@localhost mysq]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

    2019-02-15T05:55:08.647604Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

    2019-02-15T05:55:08.647656Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.

    2019-02-15T05:55:08.647660Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.

    2019-02-15T05:55:08.649468Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.

    2019-02-15T05:55:08.649496Z 0 [ERROR] Aborting

    所以要把data directory文件删除掉再执行,如果删除目录下的文件还是报同样的错,可以试试把目录删除掉,再创建一个,然后授权:

    vim /usr/lib/systemd/system/mysql.service

    [Unit]

    Description=Mysql

    After=syslog.target network.target remote-fs.target nss-lookup.target

    [Service]

    Type=forking

    PIDFile=/usr/local/mysql/data/XXX.pid

    ExecStart=/usr/local/mysql/support-files/mysql.server start

    ExecReload=/bin/kill -s HUP $MAINPID

    ExecStop=/bin/kill -s QUIT $MAINPID

    PrivateTmp=false

    [Install]

    WantedBy=multi-user.target

    systemctl daemon-reload

    报错

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/ecapp/data_mysql/mysql.sock-DENABLED_LOCAL_INFILE=1' (2)

    解决办法

    ln -s mysql.sock /ecapp/data_mysql/mysql.sock-DENABLED_LOCAL_INFILE=1

    复制MySQL配置文件

    [root@node02 ~]# cd /usr/local/mysql/support-files/

    [root@node02 support-files]# cp my-default.cnf /etc/my.cnf

    [root@node02 support-files]# vim /etc/my.cnf

    [mysqld]

    ...

    basedir=/usr/local/mysql

    datadir=/data/mysql

    port=3306

    server_id=121

    socket=/data/mysql/mysql.sock

    启动mysql服务

    [root@mysqltest data]# /usr/local/mysql/bin/mysqld_safe --user=mysql &

    [root@mysqltest data]# ss -antp | grep mysqld

    LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=63756,fd=20))

    [root@mysqltest data]#

    修改环境变量PATH

    [root@mysqltest data]# cat /etc/profile.d/mysql.sh

    export PATH=$PATH:/usr/local/mysql/bin

    [root@mysqltest data]# source /etc/profile.d/mysql.sh

    [root@mysqltest data]# mysql -u root -p

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Www.1.com';

    mysql> FLUSH PRIVILEGES;

    Query OK, 0 rows affected (0.00 sec)

    设置源码mysql服务开机自启动

    # vim /etc/rc.d/rc.local

    /usr/local/mysql/bin/mysqld_safe --user=mysql &

    [root@node02 bin]# chmod a+x /etc/rc.d/rc.local

    复制mysql服务控制脚本

    [root@db_server_01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

    [root@db_server_01 ~]# chmod a+x /etc/init.d/mysqld

    [root@db_server_01 ~]# chkconfig --add mysqld>>>将mysqld服务添加为系统服务

    [root@db_server_01 ~]# chkconfig --level 2345 mysqld on>>>设置mysqld服务开机自启动

    2345:

    linux启动模式

    3:字符模式

    5:图形模式

    2:字符,无网络

    4:预留

    编辑/etc/my.cnf文件添加在[mysqld]版块下添加如下变量,添加后重启服务。

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    #开启,并且可以将mysql-bin改为其它的日志名

    log-bin=mysql-bin

    #添加id号,如果做主从,就不能一样

    server-id=1

    #超过200M将生产新的文件,最大和默认值是1GB

    max_binlog_size=1G

    #此参数表示binlog使用最大内存的数,默认1M。

    max_binlog_cache_size=1M

    #此参数表示binlog日志保留的时间,默认单位是天。

    expire_logs_days=7

    View Code

    二,准备脚本

    前戏mkdir -pv /ops/{bak,log}

    1.全量脚本:mybak-all.sh,对脚本变量部分进行配置

    #!/bin/bash

    #使用:./xx.sh -uroot -p'123456',使用前修改脚本进行变量配置

    #过程:备份并刷新binlog,将最新的binlog文件名记录并整体压缩打包

    #恢复:先进行全量备份,再对根据tim-binlog.txt中的记录,进行逐个恢复

    #提示:最多每分钟执行一次,否则会覆盖同分钟内的文件,可以修改脚本来改善

    # 出现问题会退出,可以到指定的日志目录查看日志输出

    # 同年的tar包超过指定天数的会删除掉

    #[变量]

    begin_time=`date +%F-%H-%M-%S`

    my_sql="/usr/local/mysql/bin/mysql"

    bak_sql="/usr/local/mysql/bin/mysqldump"

    binlog_dir=/data/mysql/

    bak_dir=/ops/bak

    log_dir=/ops/log/mybak-all.log

    #保存的天数,4周就是28天

    save_day=28

    #[自动变量]

    #当前年月

    date_nian=`date +%Y-`

    #所有天数的数组

    save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days "+%F";done))

    #开始

    /usr/bin/echo >> ${log_dir}

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:开始全备份" >> ${log_dir}

    #检查

    ${my_sql} $* -e "show databases;" &> /tmp/info_error.txt

    if [[ $? -ne 0 ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:登陆命令错误" >> ${log_dir}

    /usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息

    exit 1

    fi

    #移动到目录

    cd ${bak_dir}

    bak_time=`date +%F-%H-%M`

    bak_timetwo=`date +%F`

    #备份

    ${bak_sql} $* --all-databases --flush-privileges --single-transaction --flush-logs --triggers --routines --events --hex-blob > mybak-all-${bak_time}.sql

    if [[ $? -ne 0 ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:备份失败"

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:备份失败" >> ${log_dir}

    /usr/bin/cat /tmp/bak_error.txt #如果错误则显示错误信息

    exit 1

    else

    bin_dian=`tail -n 1 ${binlog_dir}/mysql-bin.index`

    echo "${bin_dian}" > ${bak_time}-binlog.txt

    fi

    #压缩

    if [[ -f mybak-all-${bak_time}.tar.gz ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:压缩包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir}

    /usr/bin/rm -irf mybak-all-${bak_time}.tar.gz ${bak_sql}-binlog.txt

    fi

    /usr/bin/tar -cf mybak-all-${bak_time}.tar.gz mybak-all-${bak_time}.sql ${bak_time}-binlog.txt

    if [[ $? -ne 0 ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:压缩失败" >> ${log_dir}

    exit 1

    fi

    #删除sql文件

    /usr/bin/rm -irf mybak-all-${bak_time}.sql ${bak_time}-binlog.txt

    if [[ $? -ne 0 ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:删除sql文件失败" >> ${log_dir}

    exit 1

    fi

    #整理压缩的日志文件

    for i in `ls | grep .tar.gz$`

    do

    echo $i | grep "^mybak-all.*tar.gz$" &> /dev/null

    if [[ $? -eq 0 ]];then

    a=`echo ${i%%.tar.gz}`

    b=`echo ${a:(-16)}`

    c=`echo ${b%-*}`

    d=`echo ${c%-*}`

    #看是否在数组中,不在则删除

    echo ${save_day_zu[*]} |grep -w $d &> /dev/null

    if [[ $? -ne 0 ]];then

    [[ "$d" != "$bak_timetwo" ]] && rm -rf $i

    fi

    else

    #不是当月的,其他类型压缩包,跳过

    continue

    fi

    done

    #结束

    last_time=`date +%F-%H-%M-%S`

    /usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir}

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:全备份完成" >> ${log_dir}

    /usr/bin/echo >> ${log_dir}

    2.增量脚本:mybak-section.sh

    #!/bin/bash

    #使用:./xx.sh -uroot -p'123456',将第一次增量备份后的binlog文件名写到/tmp/binlog-section中,若都没有,自动填写mysql-bin.000001

    #过程:增量先刷新binlog日志,再查询/tmp/binlog-section中记录的上一次备份中最新的binlog日志的值

    # cp中间的binlog日志,并进行压缩。再将备份中最新的binlog日志写入。

    #恢复:先进行全量恢复,再根据全量备份附带的time-binlog.txt中的记录逐个恢复。当前最新的Binlog日志要去掉有问题的语句,例如drop等。

    #提示:最多每分钟执行一次,否则会覆盖同分钟内的文件,可以修改脚本来改善

    # 出现问题会退出,可以到指定的日志目录查看日志输出

    # 同年的tar包超过指定天数的会删除掉

    #[变量]

    begin_time=`date +%F-%H-%M-%S`

    my_sql="/usr/local/mysql/bin/mysql"

    bak_sql="/usr/local/mysql/bin/mysqldump"

    binlog_dir=/data/mysql/

    binlog_index=${binlog_dir}/mysql-bin.index

    bak_dir=/ops/bak

    log_dir=/ops/log/mybak-section.log

    #保存的天数,4周就是28天

    save_day=7

    #[自动变量]

    #当前年

    date_nian=`date +%Y-`

    #所有天数的数组

    save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days "+%F";done))

    #开始

    /usr/bin/echo >> ${log_dir}

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:开始增量备份" >> ${log_dir}

    #检查

    ${my_sql} $* -e "show databases;" &> /tmp/info_error.txt

    if [[ $? -ne 0 ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:登陆命令错误" >> ${log_dir}

    /usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息

    exit 1

    fi

    #移动到目录

    cd ${bak_dir}

    bak_time=`date +%F-%H-%M`

    bak_timetwo=`date +%F`

    #刷新

    ${my_sql} $* -e "flush logs"

    if [[ $? -ne 0 ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:刷新binlog失败" >> ${log_dir}

    exit 1

    fi

    #获取开头和结尾binlog名字

    last_bin=`cat /tmp/binlog-section`

    next_bin=`tail -n 1 ${binlog_dir}/mysql-bin.index`

    echo ${last_bin} |grep 'mysql-bin' &> /dev/null

    if [[ $? -ne 0 ]];then

    echo "mysql-bin.000001" > /tmp/binlog-section #不存在则默认第一个

    last_bin=`cat /tmp/binlog-section`

    fi

    #截取需要备份的binlog行数

    a=`/usr/bin/sort ${binlog_dir}/mysql-bin.index | uniq | grep -n ${last_bin} | awk -F':' '{print $1}'`

    b=`/usr/bin/sort ${binlog_dir}/mysql-bin.index | uniq | grep -n ${next_bin} | awk -F':' '{print $1}'`

    let b--

    #输出最新节点

    /usr/bin/echo "${next_bin}" > /tmp/binlog-section

    #创建文件

    rm -rf mybak-section-${bak_time}

    /usr/bin/mkdir mybak-section-${bak_time}

    for i in `sed -n "${a},${b}p" ${binlog_dir}/mysql-bin.index | awk -F'./' '{print $2}'`

    do

    if [[ ! -f ${binlog_dir}/${i} ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:binlog文件${i} 不存在" >> ${log_dir}

    exit 1

    fi

    cp -rf ${binlog_dir}/${i} mybak-section-${bak_time}/

    if [[ ! -f mybak-section-${bak_time}/${i} ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:binlog文件${i} 备份失败" >> ${log_dir}

    exit 1

    fi

    done

    #压缩

    if [[ -f mybak-section-${bak_time}.tar.gz ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:压缩包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir}

    /usr/bin/rm -irf mybak-section-${bak_time}.tar.gz

    fi

    /usr/bin/tar -cf mybak-section-${bak_time}.tar.gz mybak-section-${bak_time}

    if [[ $? -ne 0 ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:压缩失败" >> ${log_dir}

    exit 1

    fi

    #删除binlog文件夹

    /usr/bin/rm -irf mybak-section-${bak_time}

    if [[ $? -ne 0 ]];then

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:删除sql文件失败" >> ${log_dir}

    exit 1

    fi

    #整理压缩的日志文件

    for i in `ls | grep "^mybak-section.*tar.gz$"`

    do

    echo $i | grep ${date_nian} &> /dev/null

    if [[ $? -eq 0 ]];then

    a=`echo ${i%%.tar.gz}`

    b=`echo ${a:(-16)}` #当前日志年月日

    c=`echo ${b%-*}`

    d=`echo ${c%-*}`

    #看是否在数组中,不在其中,并且不是当前时间,则删除。

    echo ${save_day_zu[*]} |grep -w $d &> /dev/null

    if [[ $? -ne 0 ]];then

    [[ "$d" != "$bak_timetwo" ]] && rm -rf $i

    fi

    else

    #不是当月的,其他类型压缩包,跳过

    continue

    fi

    done

    #结束

    last_time=`date +%F-%H-%M-%S`

    /usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir}

    /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:增量备份完成" >> ${log_dir}

    /usr/bin/echo >> ${log_dir}

    周六晚3点i分进行全量备份 周一到周六每天进行增量备份, 全量保存4周 增量保存近一周的每天数据

    crontab -e 添加计划任务。

    1 3 * * 6 /bin/bash /shell/mybak-all.sh -uroot -p'Www.1.com'

    1 2 * * * /bin/bash /shell/mybak-section.sh -uroot -p'Www.1.com'

    三.容灾测试

    准备

    按照第一步,环境需求中,将mysql开启binlog并重启

    vim /shell/mybak-all.sh,将全量脚本复制到其中,并 chmod+ x /shell/mybak-all.sh 添加执行权限。

    vim /shell/mybak-section.sh,将增量脚本复制到其中,并 chmod +x /shell/mybak-section.sh 添加执行权限

    创建测试数据库

    create database test;

    切换数据库

    use test;

    创建测试表

    create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);

    用 vim /root/bin/testsql.sh 命令创建一个数据插入脚本,随机插入一千条数据用于测试。

    #!/bin/bash

    ku=one

    biao=s1

    zi() {

    zu=(q w e r t y u i o p a s d f g h j k l z x c v b n m)

    for i in `seq 1 5`

    do

    a=`echo $[RANDOM%24]`

    echo -n ${zu[a]}

    done

    }

    for i in `seq 1 1000`

    do

    b=`zi`

    mysql -uroot -p'Www.1.com' -e "use test;insert into s1(name,age) values('${b}',${i});"

    done

    执行脚本

    bash /shell/testsql.sh

    用如下命令检查表的条目数是否是1000条

    mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

    测试

    第一次:

    更改时间

    date -s 2016-04-04

    执行全量脚本

    bash /shell/mybak-all.sh -uroot -p'Www.1.com'

    再执行增量脚本

    bash /shell/mybak-section.sh -uroot -p'Www.1.com'

    查看是否有2个tar包。可以看到tar包

    ls /ops/bak

    mybak-all-2016-04-04-00-00.tar.gz

    mybak-section-2016-04-04-00-00.tar.gz

    执行脚本插入1000条数据

    bash /shell/testsql.sh

    用如下命令检查表的条目数是否是2000条

    mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

    第二次:

    更改时间

    date -s 2016-04-05

    执行全量脚本

    bash /shell/mybak-all.sh -uroot -p'Www.1.com'

    再执行增量脚本

    bash /shell/mybak-section.sh -uroot -p'Www.1.com'

    用查看是否有4个tar包。可以看到如下

    ls /ops/bak

    mybak-all-2016-04-04-00-00.tar.gz / mybak-section-2016-04-04-00-00.tar.gz

    mybak-all-2016-04-05-00-00.tar.gz / mybak-section-2016-04-05-00-00.tar.gz

    执行脚本插入1000条数据

    bash /shell/testsql.sh

    用如下命令检查表的条目数是否是3000条

    mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

    第三次

    更改时间

    date -s 2016-04-06

    执行全量脚本

    bash /shell/mybak-all.sh -uroot -p'Www.1.com'

    再执行增量脚本

    bash /shell/mybak-section.sh -uroot -p'Www.1.com'

    用查看是否有4个tar包。可以看到如下

    ls /ops/bak

    mybak-all-2016-04-04-00-00.tar.gz / mybak-section-2016-04-04-00-00.tar.gz

    mybak-all-2016-04-05-00-00.tar.gz / mybak-section-2016-04-05-00-00.tar.gz

    mybak-all-2016-04-06-00-00.tar.gz / mybak-section-2016-04-06-00-00.tar.gz

    执行脚本插入1000条数据

    bash /shell/testsql.sh

    用如下命令检查表的条目数是否是4000条

    mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

    误删除

    删除:

    登陆mysql服务器

    mysql -uroot -p’Www.1.com’

    删除test数据库,用来模拟误操作

    drop database test;

    恢复第一步:准备

    移动到备份所在的目录

    cd /ops/bak

    解开最近时间点的全量备份包,最近时间是2016-04-06

    tar -xf mybak-all-2016-04-06-00-00.tar.gz

    解压后可以看到 mybak-all-2016-04-06-00-00.sql 和 2016-04-06-00-00-binlog.txt

    其中mybak-all-2016-04-06-00-00.sql 是sql语句,用于恢复某个时间点的全部内容,如果只误操作某个库,可以单独恢复某个库。2016-04-06-00-00-binlog.txt中记录了全备过程中刷新的Binlog文件名。

    解压增量备份的文件夹 ,因为这2个脚本是先后执行的,所以不需要解压6号前的,只解压6号及以后的。

    tar -xf mybak-section-2016-04-06-00-00.tar.gz

    解压后可以看到 mysql-bin.000008 和 mysql-bin.000009 2个binlog日志

    恢复第二步:全备份恢复

    导入数据进去

    mysql -uroot -p'Www.1.com' < mybak-all-2016-04-06-00-00.sql

    用如下命令检查表的条目数是否是3000条,6号备份完成后,才添加的最后1000条。

    mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

    恢复第三步:增量恢复

    查看应该从哪个binlog文件恢复。当前获得 ./mysql-bin.000014

    cat 2016-04-06-00-00-binlog.txt

    将 mybak-section-2016-04-06-00-00 文件夹中的 mysql-bin.000014 恢复,因为操作有问题的binlog日志在15中,14日志可以直接用于恢复

    mysqlbinlog mybak-section-2016-04-06-00-00/ysql-bin.000014 | mysql -uroot -p'Www.1.com'

    检查表的条目数是否是3000条,因为在写入3000条后,mysqldmp全备刷新了一下binlog,这个最新的是14,而还没有写入任何东西时便执行增量备份了,刷新了一下binlog,最新的是15,这时候才导入了最新的1000条。如果是持续的在写入,恢复14后会有数据变化。

    mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

    在mysql数据目录/ops/server/mysql/data/下找到mysql-bin.000015

    找出binlog日志中有删除数据库语句的行数,当前为728

    mysql -uroot -p'Www.1.com' -e "show binlog events in 'mysql-bin.000015'\G" | grep -n "drop database "

    12438dfa5db2bdd843d9405531a7f193.png

    找出728前后几行的内容,可以看到出现问题的pos点为5519,恢复到5519之前的数据即可。

    mysql -uroot -p'Www.1.com' -e "show binlog events in 'mysql-bin.000015'\G" | sed -n '715,730p'

    7c5478c1ed51a016ccdce21e8b58d06e.png

    进行恢复,stop-position是指定恢复截止的pos点。

    mysqlbinlog --stop-position=5519 mysql-bin.000015 | mysql -uroot -p'Www.1.com'

    检查表的条目数是否是4000条

    mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

    报错:

    [root@localhost mysql]# mysql -u root -p

    Enter password:

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysqld.sock-DENABLED_LOCAL_INFILE=1' (2)

    解决方法:

    [root@localhost mysql]# mv mysqld.sock mysqld.sock-DENABLED_LOCAL_INFILE=1

    展开全文
  • gitlab git代码管理仓库linux部署文档,及gitlab容灾备份解决
  • 本文针对小灵通网络安全运营的需要,对其重要网络单元——HLR设备的安全备份方案进行了讨论,并重点论述了异地容灾备份方案,同时列举和介绍了建设方案及容灾备份方案的应用。
  • 系统容灾备份解决方案系统容灾备份解决方案系统容灾备份解决方案系统容灾备份解决方案
  • netapp 容灾备份技术

    2014-09-05 15:00:47
    netapp 容灾 备份 SnapMirror snapvault 技术详解
  • PDSN的容灾备份方案和应用分析pdf,PDSN的容灾备份方案和应用分析
  • 数据中心容灾备份系统建设方案
  • 业务连续性,容灾备份技术,双活数据中心解决方案,技术方案说明
  • 容灾备份的相关细节

    2015-12-05 17:00:48
    随着IT行业的发展以及国家对信息化安全重视的大环境酝酿下,对数据资产的保护越来越重要,对于这一块容灾备份的重要性体现出来,这篇文档主要针对容灾备份的相应技术指标和内容作了详解
  • IBM容灾备份方案汇总

    2019-07-22 23:24:07
    教程名称: IBM容灾备份方案汇总【】IBM 2011数据保护解决方案.zip【】IBM-容灾白皮书.zip【】IBM存储容灾解决方案.zip【】IBM的三种异地容灾方案.zip【】IBM数据保护解决方案.zip【】IBM同城灾备解决方案建议书....
  • 异地容灾备份哪家好

    2020-04-07 11:41:19
    什么是异地容灾备份 首先说下容灾备份其实是两个不同的概念,容灾是指企业为了保证业务系统在遭受意外原因的情况下能保证原有的业务系统正常运转而在异地部署了一套与现有的业务系统一样的生产环境,保证业务的正常...
  • 容灾备份,实为两个概念。 容灾:为了在遭遇灾害时能保证信息系统能正常运行,帮助企业实现业务连续性的目标。 备份:为了应对灾难来临时造成的数据丢失问题。在容灾备份一体化产品出现之前,容灾系统与备份...
  • 容灾备份的等级和技术 http://www.csip.org.cn/new/st/al/2004/0730/342.htm 容灾备份是通过在异地建立和维护一个备份存储系统,利用地理上的分离来保证系统和数据对灾难性事件的抵御能力。  根据容灾系统...
  • Oracle容灾备份之实时备份+数据迁移应用实践技术文档,DBA必备资料。
  • 容灾备份厂商

    2020-04-26 10:29:14
    虽然容灾备份一直备受企业关注,但是根据调查显示,大多数公司并没有对自己的企业IT做好充足的容灾准备。IDG研究服务的调查结果显示,42%的受调查企业仍没有部署现代化的容灾恢复的解决方案,尽管之前这些企业遭受过...
  • 异地容灾备份

    2020-05-20 11:28:40
    异地备份,通过互联网TCP/IP协议,备特佳容灾备份系统将本地的数据实时备份到异地服务器中,可以通过异地备份的数据进行远程恢复,也可以在异地进行数据回退,异地备份,如果想做接管需要专线连接,只有在同一网段内...
  • 基于云计算的容灾备份方案1.ppt
  • Kafka跨集群容灾备份 1、使用场景 2、MirrorMaker架构 3、MirrorMaker工具使用 4、验证消息是否拷贝成功 5、跨机房备份案例 6、注意事项
  • 贝尔通信容灾备份解决方案 充分利用容灾端数据可复用功能,可用于业务模块的重分布,报表系统,数据抽取等。从数据级保证系统的高可用性,维持高可用的系统之间的数据同步性。数据集中: 实现数据的集中抽取,系统稽核,...
  • 局域网已经成为企业和部门实现办公自动化的有效平台,而对局域网中数据和业务经行容灾备份已成为不可或缺的工作。针对提高局域网中数据安全的目的,本文通过对容灾备份应急服务的系统结构、评价指标、关键技术以及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,040
精华内容 1,216
关键字:

容灾备份