说起备份数据的重要性,恐怕只有遭受过数据损失的人才会有深刻的感受。

那是一种切肤之痛,多少年的工作成果都灰飞烟灭。

所以定期备份数据是绝对必要的,最简单直接的方法就是手动拷贝,但这在数据量少的时候有效,如果数据量大,目录层次又多就很麻烦了,因为你要自行判断哪些文件是最新的文件,不再重复拷贝未变化的文件。

这里推荐一款工具软件:FastCopy,正如其名,它能快速地拷贝文件,但我们利用的是它的另一个功能:同步,仅仅把更改过的文件,或者新创建的文件拷贝到移动介质,未变化的文件不再重复拷贝,这就实现了增量备份。

fastcopy有图形界面,指定需要同步的源和目的磁盘,选择sync,点击Execute,就开始增量备份了:

QQ图片20210305225918.png

人工操作固然可以,但如果经常做备份还是嫌麻烦,而且备份过程本身就有风险,因为每次都要选择源和目的磁盘,万一选错了,由于目的磁盘没有源盘文件,那就不是增量备份,而是从零开始的完整备份了,这会耗费大量时间,而且之前备份的数据会被清空。

为此我写了一个批处理,能自动化备份数据,并且能适应盘符的变化,其原理如下:

QQ图片20210305225918.png

工作目标:PC本地有3个盘符:D、E、F,移动硬盘的盘符是G,每个盘符的卷标如上,编写批处理把PC本地磁盘的数据备份到移动硬盘。

在固定的盘符之间对拷是不行的,因为盘符可能发生变化,如上图,移动硬盘是G盘,如果在这之前插入U盘占用了G,随后插入的移动硬盘就会变为H,批处理要能够感知这种变化,获得正确的源盘符和目标盘符。

感知的关键是”卷标“,盘符虽然会变化,但卷标不会!批处理通过卷标找到变化之后的盘符,就能找到正确的源和目的磁盘,举例就是:

源盘卷标是”视频“,盘符是D;目的磁盘卷标是”移动硬盘“,盘符是G,备份方向是D→G

源盘卷标是”视频“,盘符是K;目的磁盘卷标是”移动硬盘“,盘符是H,备份方向是K→H

虽然盘符发生了变化,但仍然达到了目的:把卷标为”视频“的磁盘里的数据备份到了卷标为”移动硬盘“的磁盘。

批处理附文末,本例是把3个源盘(卷标分别是视频、照片、数据)备份到目标磁盘(卷标是移动磁盘,根据你的实际情况修改语句。

数据备份的一些注意事项。

数据一定要”离线备份“,也就是不能本机备份到本机,而要备份到独立于PC的移动存储设备上,而且移动存储设备要是机械硬盘,不能是U盘或者SSD(固态硬盘)。

因为U盘/SSD使用NAND闪存保存数据,这种存储器是有数据保质期的,过了保质期数据就会”挥发“,随着制程的提高,存储密度越来越高,保质期也越来越短,目前广泛使用的TLC闪存的保质期不到一年,理论上说,一年以后的SSD不一定能读出原始数据。

你可能会问,现在SSD的应用越来越广泛,大量PC已经内置了SSD,难道它们的数据都不能保存超过一年?非也,SSD厂商为了避免数据挥发,在固件里写了搬运程序,当判断出某块数据快到保质期,就将其拷贝到另一处,数据重新写入,保质期也就从头开始算了。

但很明显,SSD需要通电才能完成搬运,PC是长时间通电的设备,所以SSD有时间搬运数据,而U盘/移动硬盘是长时间断电放置的,没有时间搬运数据。

由此可见,如果笔记本/台式机内置了SSD,长时间断电是有数据丢失的风险的,建议把数据拷贝出来,或者定期开机让SSD搬运数据。

最后说说数据备份设备的选择,高大上的选择当然是NAS,有好几个磁盘做冗余,但是价格不菲,如果对备份没有很高的要求,可以购买台式机机械硬盘+USB 3.0转SATA线以实现廉价的备份,注意一定要是 USB 3.0或更高版本且支持USAP,否则备份速度太慢了。

Debian 10.x 64 位-2021-03-28-15-51-33.png

USB支持USAP协议

::本批处理的目的是把PC硬盘里的数据自动同步(备份)到外置的机械硬盘。
::把fastcopy放入系统路径,或者本批处理的目录下。
::因为PC硬盘的”卷标“和”盘符“不是固定的对应关系(比如插入U盘之后),所以不能在2个固定的盘符之间对拷。
::为此,先获得指定卷标的盘符,然后把该盘符下的数据用fastcopy同步到外置硬盘。
::有容错机制,如果发现任何一个这里指定的卷标找不到盘符,会显示报错信息并退出。
::插入硬盘以后等待一会,让操作系统认出盘符之后再备份。
::需要备份的3个源盘的卷标分别是:视频、照片、数据
::目标设备:卷标为“移动硬盘”的移动机械硬盘
@echo off
::=============获得卷标为“视频”的盘符==========
cls
set flag=0
set input=
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
    for /f "tokens=4" %%j in ('vol %%i: 2^>nul') do if /i "%%j"=="视频" call :s2 %%i&set flag=1
)
if %flag% neq 1 echo 没有卷标为“视频”的盘符&pause
goto :eof
:s2
set sp1=%1
echo.
echo  卷标为“视频”的盘符是:%sp1%
echo.
::=============获得卷标为“照片”的盘符==========
set flag=0
set input=
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
    for /f "tokens=4" %%j in ('vol %%i: 2^>nul') do if /i "%%j"=="照片" call :s4 %%i&set flag=1
)
if %flag% neq 1 echo 没有卷标为“照片”的盘符&pause
goto :eof
:s4
set ph=%1
echo.
echo  卷标为“照片”的盘符是:%ph%
echo.
::=============获得卷标为“数据”的盘符==========
set flag=0
set input=
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
    for /f "tokens=4" %%j in ('vol %%i: 2^>nul') do if /i "%%j"=="数据" call :s5 %%i&set flag=1
)
if %flag% neq 1 echo 没有卷标为“数据”的盘符&pause
goto :eof
:s5
set xbf=%1
echo.
echo  卷标为“数据”的盘符是:%xbf%
echo.
::=============获得卷标为“移动硬盘”的盘符,这是备份用的移动硬盘==========
set flag=0
set input=
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
    for /f "tokens=4" %%j in ('vol %%i: 2^>nul') do if /i "%%j"=="移动硬盘" call :s1 %%i&set flag=1
)
if %flag% neq 1 echo 没有卷标为“移动硬盘”的盘符&pause
goto :eof
:s1
set lxbf=%1
echo.
echo  卷标为“移动硬盘”的盘符是:%lxbf%
echo.
::=============将数据备份到移动硬盘==========
::变量:sp1,ph,xbf,lxbf
echo 正在将数据同步到移动硬盘 %lxbf%:(修改时间最新者,以及新创建的文件)
echo 同步: 视频 %sp1%:\ 到 移动硬盘 %lxbf%:
FastCopy.exe /cmd=sync /force_close  %sp1%:\* /to=%lxbf%:\视频
echo 同步: 照片 %ph%:\ 到 移动硬盘 %lxbf%:
FastCopy.exe /cmd=sync /force_close  %ph%:\* /to=%lxbf%:\照片
echo 同步: 数据 %xbf%:\ 到 移动硬盘 %lxbf%:
FastCopy.exe /cmd=sync /force_close  %xbf%:\* /to=%lxbf%:\数据
echo.
echo.
echo 备份完毕,请检查是否有报错信息,按任意键退出。
echo.
pause
:eof