在网上看到一个网友写的《自制Cassandra数据库备份还原工具》,本来想能拿过来就用,可惜是在linux上用的,Windows操作系统上根本用不了,很多命令都不同。于是乎我做了个移植工作,边看批处理命令,边修改这个脚本,总算初步搞定。
这里讲的Cassandra的备份还原使用了自带的工具sstable2json和json2sstable,关于这两个的介绍可以看如下两篇文章:
http://wiki.apache.org/cassandra/Operations
http://www.datastax.com/docs/1.0/utilities/sstable2json
使用语法:
Usage: sstable2json [-f outfile] <sstable> [-k key [-k key [...]]]
outfile是备份到的地址,sstable是数据文件的地址。
Usage: json2sstable -K keyspace -c column_family <json> <sstable>
还原的时候要指定KeySpace和Column Family,如果手动执行这个命令,要还原的Column Family多了,那可真是个累死人不偿命的活啊。
批处理原理:
这里所谓的批处理就是对相似的操作自动化的执行,减少人的体力劳动。通过遍历要备份和还原的文件夹中的数据文件,自动调用上边的两个命令进行备份或还原操作。
具体实现:
说了这么多,还是看看具体怎么做的,来点干货。
@echo off
SetLocal EnableDelayedExpansion
set "f=%*"
if not defined f goto usage
cd %~dp0
set bktool=%~dp0bin\sstable2json.bat
set rctool=%~dp0bin\json2sstable.bat
if "%1"=="-r" goto recover
if "%1"=="-b" goto backup
goto :eof
REM 备份操作
:backup
rem 创建备份目录
set backdir=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
md %3\%backdir%
set sDir=%2
set tDir=%3\%backdir%
cd %sDir%
set successno=0
for /f %%i in ('dir /s *-Data.db^|find /i "个文件"') do set filecount=%%i
echo 从[%sDir%]中读取SSTable文件共[%filecount%]个,备份至[%tDir%]
for /f "delims=" %%a in ('dir /b /a-d /s "*-Data.db"') do (
set filename=%%a
set "filename=!filename:.db=!"
set "filename=!filename:%sDir%\=!"
rem echo !filename!
set sFile=%sDir%\!filename!.db
set tFile=%tDir%\!filename!.json
echo 备份 !sFile!
rem echo 备份 !sFile! 到 !tFile!
CALL %bktool% !sFile! > !tFile!
if ERRORLEVEL 0 (
set /a successno+=1
echo SUCCESS
)
)
echo 备份完成:成功/总数 = %successno%/%filecount%
goto :eof
REM 还原操作
:recover
set sDir=%3
set tDir=%2
cd %sDir%
set successno=0
for /f %%i in ('dir /s *-Data.json^|find /i "个文件"') do set filecount=%%i
echo 从[%sDir%]中读取SSTable文件共[%filecount%]个,还原至[%tDir%]
for /f "delims=" %%a in ('dir /b /a-d /s "*-Data.json"') do (
set filename=%%a
set "filename=!filename:.json=!"
set "filename=!filename:%sDir%\=!"
rem echo !filename!
set sFile=%sDir%\!filename!.json
set tFile=%tDir%\!filename!.db
echo 还原 !sFile!
rem echo 还原 !sFile! 到 !tFile!
rem 查找KS和CF
rem echo !tDir:~-15,1!
echo TO: %tDir%
set dbName=
set num=0
set b=0
:redo
if not "!tDir:~-%num%,1!"=="\" (
rem echo "!tDir:~-%num%,1!"
set /a num+=1
goto redo
)
set /a num=!num!-1
set dbName=!tDir:~-%num%!
echo %dbName%
set cfName=
set num=0
set b=0
:redo2
if not "!filename:~%num%,1!"=="-" (
set /a num+=1
goto redo2
)
set cfName=!filename:~0,%num%!
echo %cfName%
CALL %rctool% -K %dbName% -c %cfName% !sFile! !tFile!
if ERRORLEVEL 0 (
set /a successno+=1
echo 还原成功
)
)
echo 还原结束:成功/总数 = %successno%/%filecount%
goto :eof
REM 使用说明
:usage
echo 用法:
echo 语法: [OPTIONS] [DBFileDir] [JSonFileDir]
echo.
echo -b, --backup 备份Cassandra数据库
echo -r, --recover 还原Cassandra数据库
echo DBFileDir Cassandra数据库文件的目录路径
echo JSonFileDir Json文件存放路径
echo.
echo 例子:
echo 备份: -b /db_data/data_file/system /db_data/json_file/system
echo 还原: -r /db_data/data_file/system /db_data/json_file/system
echo.
echo 备注:
echo 若需备份完整数据,请先停止Cassandra对外提供服务,然后将commit_log刷入数据库后再执行备份。
goto :eof
:doend
将这个文件保存到cassandra的根目录,文件名随便,但是需要.bat的后缀。
在命令提示符工具中进入这个目录,输入脚本文件名称,例如:datatool.bat。
如果不带参数,会显示如何使用的提示,在上边脚本的最后可以看到将要显示的信息,这里再说说怎么使用:
备份:
datatool.bat -b D:\cassandra\data\system D:\cassandra\backup\system
一共三个参数:
-b 指定备份操作
D:\cassandra\data\system 要备份的KeySpace的路径
D:\cassandra\backup\system 备份文件的存放路径
这个命令执行后,会在备份存放路径下创建一个以当前时间为名称的文件夹。
还原:
datatool.bat -r D:\cassandra\data\system D:\cassandra\backup\system
一共三个参数:
-r 指定还原操作
D:\cassandra\data\system 要还原的KeySpace的路径
D:\cassandra\backup\system 备份文件的存放路径
这个命令执行后,会根据备份文件的名称自动获取Column Family,根据要还原的KeySpace路径获取KeySpace名称。
计划任务:
虽然上边的脚本已经帮助我们解决了很多枯燥的工作,但是仍然要人工取处理。
何不把这个脚本的执行添加到Windows的计划任务中去,每隔一段时间做一次备份。
这个具体的计划任务我就不做了,有兴趣的朋友自己试试吧。
喜欢批处理的操作!!
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论