-- 系统备份 备份的重要性 一般来说,只备份你的业务数据,操作系统本身的东西可以不备。 备份的工具或命令: 1,cp或scp 本地拷贝或远程拷贝 2,rsync 同步,可以实现本地或远程的实时同步 3,dd 实现存储底层的拷贝(不需要文件系统) 4,amanda Amanda 是最早出现的开源备份软件。它的名字来自Maryland大学。Amanda的意思是高级Maryland 硬盘归档器 5,dump linux上的一个备份工具(只能对一个分区来备份) 6,其它备份方式(如很多数据库有各种不同的备份工具和方式,这里就不一一列举) 备份的分类: 1,全备 2,增量备份(或者叫差异备份) 3,累计增量备份(或者叫累计差异备份) 备份的路径或设备: 1,把/aaa/test文件备份到/bbb/test.bak,这样备的话,如果硬盘坏了,就全没了 2,把一个硬盘里的文件备份到另外一个硬盘(可以通过存储共享挂载过来);这样可以防止硬盘坏了,数据全丢的情况 ;或者做raid 3,你备份的硬盘和源硬盘都在同一个机房,如果发生天灾(火灾,地震,战争等)。解决方法是异地备份,也叫异地容灾 也有些公司数据量非常大,备份不在硬盘上,而是用叫磁带机的设备 磁带机(Tape Drive)一般指单驱动器产品,通常由磁带驱动器和磁带构成,是一种经济、可靠、容量大、速度快的备份设备。这种产品采用高纠错能力编码技术和写后即读通道技术,可以大大提高数据备份的可靠性 对磁带机的总结:简单来说相对于同容量的硬盘来说便宜,可靠 备份的数据需要永久保留吗? 一般来说,很多数据不会永久保留,包括银行数据(注意,这里不是说你存在银行里的钱会没了,你存的钱不会没了,它是存放在数据库里。只是说你在银行的交易记录等它不会永久保留) ====================================== 实例:使用linux上的dump工具,演示备份策略的制定和自动备份 yum install dump 一般要实现备份的过程为: 1,根据你要备份的数据,分析,评估,并设计备份的策略(如备份工具,多久备一次,要不要增量或累计增量备份等) 2,根据策略写好备份脚本 3,用crontab做时间任务实现自动备份,并且加上备份成功与否的通知(如mail通知,短信通知等) 1 2 3 4 5 6 7 星期几 全 增 增 累(1-4) 增 增 累(4-7) 0 1 2 1 2 3 2 级别 这里我以下面这个磁盘来模拟这个过程 /dev/sda7 989M 18M 921M 2% /dump 第一天的备份模拟 # cd /dump/ # dd if=/dev/zero of=/dump/dump0 bs=1M count=10 --建立一个10M大小的数据来模拟 # mkdir /backup --建立一个备份目录,实际环境里这个目录可能是远程的存储所挂载的目录,也就是说把备份备到另外的存储上 # dump -0u /dev/sda7 -f /backup/sda7_0_1.dump --全备的命令,0u表示0级别全备,后,后面的名字随意,你可以取名尽量标识性强一点 第二天的备份模拟 # dd if=/dev/zero of=/dump/dump1 bs=1M count=10 # dump -1u /dev/sda7 -f /backup/sda7_1_2.dump 第三天的备份模拟 # dd if=/dev/zero of=/dump/dump2 bs=1M count=10 # dump -2u /dev/sda7 -f /backup/sda7_2_3.dump 第四天的备份模拟 # dd if=/dev/zero of=/dump/dump3 bs=1M count=10 # dump -1u /dev/sda7 -f /backup/sda7_1_4.dump 第五,六,七天的省略 ...... 验证 查看备份里的数据 # restore -t -f sda7_2_3.dump 把每天的命令写成脚本 方法一: vim /tmp/1.sh --下面七行,分别用七个脚本1.sh--7.sh来做 dump -0u /dev/sda7 -f /backup/sda7_0_1.dump dump -1u /dev/sda7 -f /backup/sda7_1_2.dump dump -2u /dev/sda7 -f /backup/sda7_2_3.dump dump -1u /dev/sda7 -f /backup/sda7_1_4.dump dump -2u /dev/sda7 -f /backup/sda7_2_5.dump dump -3u /dev/sda7 -f /backup/sda7_3_6.dump dump -2u /dev/sda7 -f /backup/sda7_2_7.dump --上面的方法,如果你第二个周期再执行,会覆盖第一个周期的 方法二:换一种命名的方法 vim /tmp/1.sh mkdir /backup/`date +%Y%m%d` dump -0u /dev/sda7 -f /backup/`date +%Y%m%d`/sda7_0_1.dump vim /tmp/2.sh dump -1u /dev/sda7 -f /backup/`date -d "-1 days" +%Y%m%d`/sda7_1_2.dump 。。。。。。 vim /tmp/7.sh dump -1u /dev/sda7 -f /backup/`date -d "-6 days" +%Y%m%d`/sda7_2_7.dump 用crontab时间任务自动来做 01 2 * * 1 root sh /tmp/1.sh 01 2 * * 2 root sh /tmp/2.sh 01 2 * * 3 root sh /tmp/3.sh 01 2 * * 4 root sh /tmp/4.sh 01 2 * * 5 root sh /tmp/5.sh 01 2 * * 6 root sh /tmp/6.sh 01 2 * * 7 root sh /tmp/7.sh 再或者把上面的写成一个脚本,通过判断今天是星期几来确定是执行哪一天的备份 vim /tmp/10.sh #!/bin/bash day=`date +%A` case "$day" in Monday ) mkdir /backup/`date +%Y%m%d` -p dump -0u /dev/sda7 -f /backup/`date +%Y%m%d`/sda7_0_1.dump ;; Tuesday ) dump -1u /dev/sda7 -f /backup/`date -d "-1 days" +%Y%m%d`/sda7_1_2.dump ;; Wednesday ) dump -2u /dev/sda7 -f /backup/`date -d "-2 days" +%Y%m%d`/sda7_2_3.dump ;; Thursday ) dump -1u /dev/sda7 -f /backup/`date -d "-3 days" +%Y%m%d`/sda7_1_4.dump ;; Friday ) dump -2u /dev/sda7 -f /backup/`date -d "-4 days" +%Y%m%d`/sda7_2_5.dump ;; Saturday ) dump -3u /dev/sda7 -f /backup/`date -d "-5 days" +%Y%m%d`/sda7_3_6.dump ;; Sunday ) dump -2u /dev/sda7 -f /backup/`date -d "-6 days" +%Y%m%d`/sda7_2_7.dump ;; * ) echo "日期有误" esac 时间任务写一条就可以如下 01 2 * * * root sh /tmp/10.sh ===================================== 上面我设计的是每7天一个周期 如果我换一个周期 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 每月的日期 全增增增增 累 增 增 增 增 累 增 增 增 增 增 0 1 2 3 4 1 2 3 4 5 2 3 4 5 6 7 按上面的如果16天写16个脚本又有点太多了 写8个脚本(级别一样的用相同脚本) vim /tmp/0.sh dump -0u /dev/sda7 -f /backup/`date +%Y%m%d`_sda7_0.dump vim /tmp/1.sh dump -1u /dev/sda7 -f /backup/`date +%Y%m%d`_sda7_1.dump vim /tmp/2.sh dump -2u /dev/sda7 -f /backup/`date +%Y%m%d`_sda7_2.dump ....... vim /tmp/7.sh dump -7u /dev/sda7 -f /backup/`date +%Y%m%d`_sda7_7.dump 再用时间任务来做 01 2 1 * * root sh /tmp/0.sh 01 2 3,11 * * root sh /tmp/1.sh 01 2 5,13,21 * * root sh /tmp/2.sh 01 2 7,15,23 * * root sh /tmp/3.sh 01 2 9,17,25 * * root sh /tmp/4.sh 01 2 19,27 * * root sh /tmp/5.sh 01 2 29 * * root sh /tmp/6.sh 01 2 31 * * root sh /tmp/7.sh ================================================================ 恢复的方法 [root@li dump]# pwd /dump [root@li dump]# restore -r -f /backup/sda8_0_1.dump [root@li dump]# ls dump0 lost+found restoresymtable [root@li dump]# restore -r -f /backup/sda8_1_4.dump [root@li dump]# ls dump0 dump1 dump2 dump3 lost+found restoresymtable ========================================================================== dd - convert and copy a file dd 指定大小地拷贝一个文件,并在拷贝的同时可以进行一些转换 linux存储模式 五层: 应用程序 cp 虚拟文件系统 VFS 文件系统 设备驱动 物理卷 dd 能否从ext4文件系统里拷贝一个文件到ntfs里? 可以,就是VFS虚拟文件系统层的功劳 1,备份mbr dd if=/dev/sda of=/backup/mbr.backup bs=1 count=512 删除mbr dd if=/dev/zero of=/dev/sda bs=1 count=512 就会发现fdisk -l 看不到分区,一重启系统就启不来了 恢复:dd if=/backup/mbr.backup of=/dev/sda 2,备份整个硬盘 dd if=/dev/sda of=/dev/sdb --把/dev/sda的数据备份到/dev/sdb 恢复:dd if=/dev/sdb of=/dev/sda dd if=/dev/sda of=/backup/full.backup --把/dev/sda的数据备份成一个文件 恢复:dd if=/backup/full.backup of=/dev/sda 3,备份软盘 dd if=/dev/fd0 of=/backup/fd0.backup bs=1 count=1440 恢复:dd if=/backup/fd0.backup of=/dev/fd0 4,从光盘拷贝iso镜像 (把iso镜像文件需要刻录软件如nero把它刻录到光盘) dd if=/dev/cdrom of=/xxx.iso 5,从内存里拷贝资料到磁盘 dd if=/dev/mem of=/backup/mem.bin 特殊应用: 6,销毁磁盘数据 dd if=/dev/urandom of=/dev/sda --随机数填充磁盘 7,修复硬盘,当硬盘长时间不使用 dd if=/dev/sda of=/dev/sda 8,raw设备(裸设备)或者lvm数据迁移等 --讲udev时会讲 裸设备 (没有格式化成文件系统的设备,优势就是跳过文件系统层,提高性能效率) 稀疏文件 # dd if=/dev/zero of=test bs=1M count=1 seek=4000000 # ll test -h -rw-r--r-- 1 root root 3.9T Sep 17 16:41 test # du -s test 1024 test ext4文件系统的最小单位为block size,一般默认为4096字节。(oracle的最小单位也叫block size,但它默认为8192字节) linux下每个分区的block size都可以不一样 如何查看一个分区的block size? 方法一: # dumpe2fs /dev/sda2 |grep -i "block size" dumpe2fs 1.41.12 (17-May-2010) Block size: 4096 方法二: 在格式化分区时,显示信息会有block size 如果改变一个分区的block size? # mkfs.ext4 -b 2048 /dev/sda7 # mkfs.ext4 -b 8192 /dev/sda7 --目前支持最大块大小为4096,格式化成8192会挂载失败 block size大小的影响? 块大:IO吞吐量大,空间浪费较多 块小:IO吞吐量小,较节省空间 # dd if=/dev/zero of=test1 bs=1M count=1 seek=17000000 dd: failed to truncate to 17825792000000 bytes in output file `test1': File too large --在ext4下,单个文件最大大小为16T,再大的话就会报错 单个文件16T是在ext4文件系统默认的block size=4096的情况下,如果块大小为1024,那么单个文件最大大小为4T 用dd备份,干掉,恢复分区表 skip为跳过input(也就是if后接的设备) seek为跳过output(也就是of后接的设备) 512=446+64+2 447-510 1,备份分区表 dd if=/dev/sda of=/backup/partition.bak bs=1 count=64 skip=446 2,干掉分区表 dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446 3,恢复分区表 dd if=/backup/partition.bak of=/dev/sda bs=1 seek=446 课后实践题: 如果机器A的分区表丢失,现在使用机器B(A和B两台所有的都一样)分区表备份出来,再恢复到机器A,是否可行? 如果是把分区表换成MBR呢,是否可行? ================================================================ sync 同步 async 异步 rsync 远程同步 rsync remote sync 远程同步 拷贝和同步的区别? rsync - faster, flexible replacement for rcp rsync — a fast, versatile, remote (and local) file-copying tool Wget - The non-interactive network down-loader. wget http://10.1.1.10/linux_basic01.txt --直接接url uniform resource locate(统一资源定位) wget http://10.1.1.10/linux_basic01.txt -O /test/123 # wget -m -k -np http://10.1.1.10/png/ 还支持https(http+ssl+tls)协议 关于wget的其它应用(因为它的参数比较多),可自行上网查找 rsync 特点: 1,可以镜像保存整个目录树和文件系统 2,容易做到保存原有的权限,owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件attributes等 3,传输效率高,使用同步算法,只比较变化的 4,支持匿名传输,方便网站镜像 rsync 参数介绍 -v verbo -a 归档模式,递归的方式传输文件,并保持文件的属性 -l 保留软链接 -R 保留相对路径 -H 保留硬链接 -p ,-o,-g,-A 分别保留权限,属主,属组,acl等,但如果加了-a,这些就都包括了 -D 等于--devices --specials 表示支持b,c,s,p类型的文件 普通应用: rsync -av /home/ /backup/ --本机上的同步,把/home目录下的内容同步到/backup目录下(包括隐藏文件) rsync -av /home/ 10.1.1.218:/backup/ --把本地的/home目录内容,同步到远端218的/backup目录下 rsync -av 10.1.1.218:/backup/ /backup/ --把远端218的/backup目录下的内容同步到本地的/backup目录 # rsync -a /test/ '-e ssh -p 22' 10.1.1.218:/test1/ --如果你本机的/etc/service里的ssh对应端口为2222,那么你默认连别人会以2222去连,但别人是22端口的话,就可以按上面的写法来做 思考: 1。 同步时保留原路径,也就是把/home同步到/backup会变成/backup/home/*再内容 --原目录后面加不加/也影响你的同步 下面这三个有区别: rsync -av /home/ /backup/ --/home下的内容直接同步到/backup下 rsync -av /home /backup/ rsync -aRv /home/ /backup/ --这两上是/home被同步成/backup/home/* # rsync -av /share/120214 /backup/ --被同步成/backup/120214/* # rsync -aRv /share/120214/ /backup/ --被同步成/backup/share/120214/* 2。如果源目录有文件被删除了,那同步的目录是删除还是不删除,是否可以用参数来控制? --delete # rsync -aHAX --delete /test/ /test1/ 思考:能否把上面的rsync做成服务的形式,并加上一些控制功能或日志记录功能呢? man rsyncd.conf 服务器端的配置: 1,第一步: vim /etc/rsyncd.conf --此文件不存在,需要手动建立 motd file=/etc/rsyncd.welcome [notes] --共享给客户端看到的名字 path=/var/www/html --实际共享的服务器路径 vim /etc/rsyncd.welcome --手动建立自己定义的motd文件,并写上自定义的欢迎信息 2,第二步: --修改服务启动脚本 service rsync { disable = no --yes改为no 打开rsync服务功能 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID } 第三步: /etc/init.d/xinetd restart --重启服务 netstat -ntlup |grep 873 --服务端就会有873的端口在监听了 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4080/xinetd 客户端的操作: # rsync -v 10.1.1.10:: --直接这样可以查看10这个服务器共享了哪些 "hello today! @_@" --这就是你rsyncd.welcome里写的欢迎内容 notes # rsync -a 10.1.1.10::notes /notes/ --这样同步,是不需要密码的;注意notes为共享名,前面有两个:: --没有密码有好处也有坏处,好处是不需要密码方便写脚本做远程同步。如果要密码写脚本就要用到expect自动应答。坏处就是不安全,但你可以使用iptables等来加强安全。 --如果你希望有密码,也不用传密码的话,可以用rsyncd本身自带的secrets file来做验证的用户 --如果同步报permission denied这种,可能是服务端selinux没有关闭 关闭selinux的方法: 1,setenforce 0 --这是马上把selinux由强制模式改成警告模式 2, vim /etc/selinux/config SELINUX=disabled --把这个改成disabled,然后需要重启电脑才能生效 例二:在上面的基础上加上一些功能 要求: 1。把日志记录到/var/log/rsyncd.log 2。共享模块要求隐藏(也就是说客户端查看不到这个模块名) 3。并且同时只能1个客户端连接进行同步这个module 4。只能允许10.1.1.x(ip你自定义)同步这个module 5。只能早上9点到下午5点同步 # vim /etc/rsyncd.conf motd file=/etc/rsyncd.welcome [notes] path=/var/www/html list=false max connections=1 log file=/var/log/rsyncd.log hosts allow=10.1.1.x 第五点要求,基于时间的访问使用xinetd的access_times参数来做 rsyncd能不能不拖管到xinetd下实现呢? 可以实现, 使用下面的命令来启动,而不用xinetd来做(这样做rsyncd.conf里的参数还是生效,但/etc/xinetd.d/rsync里的参数不生效了) /usr/bin/rsync --daemon