Board logo

标题: [其他] 批处理BCP备份、还原SQL Server数据库 [打印本页]

作者: yuehuiemeng    时间: 2014-11-24 00:25     标题: 批处理BCP备份、还原SQL Server数据库

本帖最后由 yuehuiemeng 于 2023-9-23 23:43 编辑

一个无聊的帖子~
@echo off
echo   结束喽!!!
pause > nul
作者: DAIC    时间: 2014-11-24 10:04

适用于哪些版本的 Microsoft SQL Server 呢?
作者: yuehuiemeng    时间: 2014-11-26 01:15

本帖最后由 yuehuiemeng 于 2014-11-26 01:19 编辑

在安装上sql数据库以后,数据库会把“bcp.exe”、“isql.exe”这两个命令行工具文件添加到环境变量下,批处理只是调用这两个文件,也就是说只要有“bcp.exe、isql.exe、bcp.rll”这三个文件批处理就可以运行,微软只要不变跟bcp、isql他们的语法就不存在不兼容的情况(把这三个文件复制到没有安装sql数据库电脑的Windows下,批处理既可以运行起来)。回复 2# DAIC
作者: DAIC    时间: 2014-11-27 08:51

回复 3# yuehuiemeng


    我的意思是说你当时测试的时候使用的哪个版本的?
作者: yuehuiemeng    时间: 2014-11-28 14:21

回复 4# DAIC

xp、Win7和sql2000、2005四种组合都测试过,没问题
作者: DAIC    时间: 2014-11-28 14:30

回复 5# yuehuiemeng


    建议在脚本里面注明一下
作者: yuehuiemeng    时间: 2014-11-28 14:43

回复 6# DAIC


    受教了!!!
作者: CrLf    时间: 2014-11-28 15:01

回复 5# yuehuiemeng


    …………不愧是处女座
作者: kfyd163    时间: 2019-7-19 10:43

win7-64下怎么出现闪退呢
复制的代码如下
  1. @echo off
  2. color 6F
  3. title ♂♀BCP数据备份还原→_→YueE 工作室(☆_☆)/~~♀♂
  4. ::----------运行环境---------------
  5. ::系统:XP、Win7
  6. ::数据库版本:SQL2000、SQL2005、SQL2008
  7. ::由于本人电脑资源有限,望批友们在其他环境帮忙看看
  8. ::----------运行环境---------------
  9. setlocal enabledelayedexpansion
  10. ::若提示“'***' 不是内部或外部命令,也不是可运行的程序或批处理文件。”的时候,可能是本机未安装数据库程序
  11. bcp > nul 2>nul
  12. if "%errorlevel%" == "9009" goto error2
  13. osql > nul 2>nul
  14. if "%errorlevel%" == "9009" goto error2
  15. ::根据内部版本号来判断系统版本,由于XP和Win7在注册表和cmd中的格式都有差别,所以下面三个变量“skip”“set替换字符”“时间=”都需要用变量代替
  16. ver > %temp%\ver.tmp
  17. find " 5.0" %temp%\ver.tmp > nul && set skips=4&& set times=time=&& set fails=5
  18. find " 5.1" %temp%\ver.tmp > nul && set skips=4&& set times=time=&& set fails=5
  19. find " 5.2" %temp%\ver.tmp > nul && set skips=4&& set times=time=&& set fails=5
  20. find " 6.0" %temp%\ver.tmp > nul && set skips=2&& set times=时间=&& set fails=3
  21. find " 6.1" %temp%\ver.tmp > nul && set skips=2&& set times=时间=&& set fails=3
  22. ::读取注册表中桌面位置
  23. for /f "skip=%skips% tokens=2,*" %%i in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set desktop_path=%%j
  24. if "%desktop_path%" == "%%USERPROFILE%%\Desktop" set desktop_path="%userprofile%\Desktop"
  25. if "%desktop_path%" == "%%USERPROFILE%%\桌面" set desktop_path="%userprofile%\桌面"
  26. :start
  27. cls
  28. echo                                                                 %date:~11,3% %time:~0,8%
  29. echo.
  30. echo.
  31. ::初始化数据库信息
  32. set ip_db=127.0.0.1
  33. set user_db=sa
  34. set password_db=
  35. set /p ip_db=.        ┈━═^<-^<-^<@(((●^<请输入服务器IP地址:
  36. if /i "%ip_db%" == "q" goto end
  37. set /p user_db=.        ┈━═^<-^<-^<@(((●^<请输入数据库账  户:
  38. if /i "%user_db%" == "q" goto end
  39. set /p password_db=.        ┈━═^<-^<-^<@(((●^<请输入数据库密  码:
  40. if /i "%password_db%" == "q" goto end
  41. echo.
  42. echo *********************┈━═☆★ 开始查询数据库 ★☆═━┈**********************
  43. ::生成数据库名称列表文件name_db.tmp
  44. set /p=<nul >%temp%\name_db.tmp
  45. bcp "select name from master..sysdatabases where name <> 'master' and name <> 'model' and name <> 'msdb' and name <> 'Northwind' and name <> 'pubs' and name <> 'tempdb'" queryout %temp%\name_db.tmp -S%ip_db% -U%user_db% -P%password_db% -c
  46. if "%errorlevel%" == "1" (
  47.         echo.
  48.         echo.
  49.         echo         乖乖嘞!乖乖嘞!!乖乖嘞!!!
  50.         echo.
  51.         echo         您这是早上洗头脑袋进水啦!这点儿信息都能弄错,诶呀我去 。。。
  52.         pause>nul
  53.         goto start
  54.         ) else (
  55.         set /p=<nul >%temp%\name_db_xuhao.tmp
  56. )
  57. for /f "skip=2 delims=[" %%i in ('find /n /v "不存在的字符串" %temp%\name_db.tmp') do (
  58.         for /f "delims=] tokens=1,*" %%a in ("%%i") do echo                 %%a                %%b>> %temp%\name_db_xuhao.tmp
  59.         )
  60. echo.
  61. ping 127.0.0.1 -n 2 > nul 2>nul
  62. echo **************《序号》********《数据库名称》***********************************
  63. type %temp%\name_db_xuhao.tmp
  64. ::设置数据库名称变量“db%geshu%”为对应的数据库名称
  65. for /f "tokens=1,*" %%i in (%temp%\name_db_xuhao.tmp) do (
  66.         set name%%i=%%j
  67.         set yuee=%%i
  68.         )
  69. if "%yuee%" == "" goto error3
  70. :start_db
  71. echo.
  72. set db=
  73. set /p db=┈━═☆★ 请输入数据库的序号(不可输入名称):
  74. ::通常一台电脑上数据库数量(除去系统库)一般不会超过20个,所以这里只判断到20,若超过20个只需在下照猫画虎加几行
  75. if "%db%" == "1" goto check_db
  76. if "%db%" == "2" goto check_db
  77. if "%db%" == "3" goto check_db
  78. if "%db%" == "4" goto check_db
  79. if "%db%" == "5" goto check_db
  80. if "%db%" == "6" goto check_db
  81. if "%db%" == "7" goto check_db
  82. if "%db%" == "8" goto check_db
  83. if "%db%" == "9" goto check_db
  84. if "%db%" == "10" goto check_db
  85. if "%db%" == "11" goto check_db
  86. if "%db%" == "12" goto check_db
  87. if "%db%" == "13" goto check_db
  88. if "%db%" == "14" goto check_db
  89. if "%db%" == "15" goto check_db
  90. if "%db%" == "16" goto check_db
  91. if "%db%" == "17" goto check_db
  92. if "%db%" == "18" goto check_db
  93. if "%db%" == "19" goto check_db
  94. if "%db%" == "20" goto check_db
  95. if /i "%db%" == "q" goto end
  96. goto start_db
  97. :check_db
  98. if %db% GTR %yuee% goto start_db
  99. echo.
  100. echo.
  101. echo.
  102. echo.
  103. echo                 ┏┯┯┯┯┯┯┯┯┓        ┏┯┯┯┯┯┯┯┯┓
  104. echo                 ┠   1.导出数据   ┨        ┠   2.导入数据   ┨
  105. echo                 ┗┷┷┷┷┷┷┷┷┛        ┗┷┷┷┷┷┷┷┷┛
  106. echo.
  107. ::这里要先做个判断以分辨系统是否支持choice命令。
  108. choice /d y /t 0 > nul 2>nul
  109. if "%errorlevel%" == "9009" goto skip_choice
  110. choice /c 12q /n /m ".        请输入你现在的想干嘛滴心情:"
  111. echo.
  112. if "%errorlevel%" == "1" goto out_date
  113. if "%errorlevel%" == "2" goto in_date
  114. if "%errorlevel%" == "3" goto end
  115. :skip_choice
  116. set /p skip_choice=.        请输入你现在的想干嘛滴心情:
  117. echo.
  118. if "%skip_choice%" == "1" goto out_date
  119. if "%skip_choice%" == "2" goto in_date
  120. if /i "%skip_choice%" == "q" goto end
  121. goto skip_choice
  122. ::在桌面上新建BCP导出文件的保存位置“BCP数据备份文件”和一些前提条件
  123. :out_date
  124. echo.
  125. echo.
  126. rd /s /q %desktop_path%\BCP数据备份文件 > nul 2>nul
  127. md %desktop_path%\BCP数据备份文件\Date
  128. md %desktop_path%\BCP数据备份文件\Log
  129. echo 此文件夹为批程序执行日志目录 > %desktop_path%\BCP数据备份文件\Log\此为日志文件夹.txt
  130. cd /d %desktop_path%\BCP数据备份文件\Log
  131. ren 此为日志文件夹.txt 此为日志文件夹
  132. ::遍历当前数据库所有表生成三个文件,导出数据库文件:Out_date.bat,导入数据库文件:In_date.bat,清空数据库表文件:delete_date.sql
  133. osql -S%ip_db% -U%user_db% -P%password_db% -d!name%db%! /Q "set nocount on select name from sysobjects where type='u' set nocount off" -o %temp%\table.tmp -h-1 -w200
  134. for /f %%i in (%temp%\table.tmp) do echo bcp !name%db%!..%%i out %desktop_path%\BCP数据备份文件\Date\%%i.txt -S%ip_db% -U%user_db% -P%password_db% -c >>%desktop_path%\BCP数据备份文件\Out_date.bat
  135. for /f %%i in (%temp%\table.tmp) do echo bcp !name%db%!..%%i in %desktop_path%\BCP数据备份文件\Date\%%i.txt -S%ip_db% -U%user_db% -P%password_db% -c >>%desktop_path%\BCP数据备份文件\In_date.bat
  136. osql -S%ip_db% -U%user_db% -P%password_db% -d!name%db%! /Q "set nocount on select 'delete !name%db%!..' + name from sysobjects where type='u' set nocount off" -o %desktop_path%\BCP数据备份文件\delete_date.sql -h-1 -w200
  137. if "%errorlevel%" == "1" goto errors
  138. echo.
  139. echo         ▄︻┻═┳一 温馨警告:
  140. echo.
  141. echo                 导出数据时候程序会出现假死状态,请勿强制退出!!!
  142. echo.
  143. echo.
  144. echo         ▁▂▃▄▅▆▇█若数据量大可能需要很久 很久 很久 很久 很久 ... ...
  145. echo.
  146. echo         ...... 正 在 导 出 ...... 正 在 导 出 ...... 正 在 导 出 ......
  147. echo.
  148. call %desktop_path%\BCP数据备份文件\Out_date.bat > %desktop_path%\BCP数据备份文件\Log\Out_date.log
  149. if "%errorlevel%" == "1" goto errors
  150. set xz=出
  151. goto end_Public1
  152. :in_date
  153. echo.
  154. echo.
  155. echo.
  156. echo         ▄︻┻═┳一 温馨警告:
  157. echo.
  158. echo                 导入数据前会清空原有数据,你做好备份的准备了吗亲!!!
  159. echo.
  160. echo.
  161. pause > nul
  162. echo         ▁▂▃▄▅▆▇█若数据量大可能需要很久 很久 很久 很久 很久 ... ...
  163. echo.
  164. echo.
  165. echo         ...... 正 在 导 入 ...... 正 在 导 入 ...... 正 在 导 入 ......
  166. echo.
  167. osql -S%ip_db% -U%user_db% -P%password_db% -d!name%db%! -i %desktop_path%\BCP数据备份文件\delete_date.sql > %desktop_path%\BCP数据备份文件\Log\delete_date.log
  168. call %desktop_path%\BCP数据备份文件\In_date.bat > %desktop_path%\BCP数据备份文件\Log\In_date.log
  169. if "%errorlevel%" == "1" goto errors
  170. set xz=入
  171. goto end_Public1
  172. :errors
  173. echo.
  174. echo.
  175. echo.
  176. echo ●﹀●ΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨ●﹀●
  177. echo.
  178. echo         ▄︻┻═┳一 警告警告:
  179. echo.
  180. echo.
  181. echo               (((●^>糟糕出现致命性错误,按任意键重新运行程序^<●)))
  182. echo.
  183. echo.
  184. echo         ●︿●↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑●︿●
  185. echo.
  186. echo.
  187. echo                                                         抖抖   兄:944191705
  188. echo.
  189. echo                                                 %date% %time:~0,8%
  190. pause > nul
  191. goto start
  192. :error2
  193. echo                                                                 %date:~11,3% %time:~0,8%
  194. echo.
  195. echo.
  196. echo.
  197. echo         ∞╬═→乖乖嘞 大事不妙呀
  198. echo.
  199. echo         ∞╬═→bcp、osql不是内部或外部命令,也不是可运行的程序或批处理文件
  200. echo.
  201. echo         ∞╬═→恁瞧瞧,bcp、osql没办法在命令提示符下正常运行
  202. echo.
  203. echo         ∞╬═→自行检查一下数据库程序在本机安装与否
  204. echo.
  205. echo         ∞╬═→按任意键退出此程序
  206. echo.
  207. echo.
  208. echo.                ^<□:≡ 祝你好运 阿门 じò ぴé
  209. goto end_Public3
  210. :error3
  211. echo.
  212. echo.
  213. echo         ∞╬═→ 亲亲 大事不妙啊  ╠¤←
  214. echo.
  215. echo         ∞╬═→ 一个数据库都没发现啊  ╠¤←
  216. echo.
  217. echo         ∞╬═→ 恁检查下主机是否安装有第三方库  ╠¤←
  218. echo.
  219. echo          ∞╬═→ 按任意键退出此程序。。。。。。。。。。  ╠¤←
  220. echo.
  221. echo.                ^<□:≡ 祝你好运 阿门 じò ぴé
  222. goto end_Public3
  223. :end_Public1
  224. echo.
  225. echo.
  226. echo.
  227. echo         ^\^(^≧^^▽^^^≦^)^/
  228. echo.
  229. echo         诶呀我去,累死我了 。 。 。
  230. echo.
  231. echo         小哥 您真是太厉害了:-O 我都不好意思不让你用了 ⊙^^_^^o~么么哒~~
  232. echo.
  233. echo                 ┈━═☆★♀♂恭喜你 数据导%xz%成功♀♂★☆═━┈
  234. goto end_Public2
  235. :end
  236. echo.
  237. echo.
  238. echo.
  239. echo.
  240. echo.
  241. echo         么么哒~~
  242. echo.
  243. echo         亲 您真的不要我了吗:-O 能不能再多看看我呀 ~^>﹏^<~+伤心_
  244. echo.
  245. echo                         ┈━═☆★下次再来噢:-O★☆═━┈
  246. :end_Public2
  247. echo.
  248. echo.
  249. echo.
  250. echo.
  251. echo.
  252. :end_Public3
  253. echo.
  254. echo.
  255. echo.
  256. echo                                                         抖抖   兄:944191705
  257. echo.
  258. echo                                                 %date% %time:~0,8%
  259. pause>nul
  260. if "%xz%" == "入" explorer %desktop_path%\BCP数据备份文件\Log
  261. if "%xz%" == "出" explorer %desktop_path%\BCP数据备份文件\Date
  262. goto :eof
复制代码

作者: Batcher    时间: 2019-7-19 10:49

回复 9# kfyd163


专治“一闪而过”、“闪退”的秘方:

不要双击执行bat文件
把 @echo off 删掉
代码保存为 C:\test.bat
打开一个CMD窗口,执行命令:
C:\test.bat

这样可以看到详细的报错信息或者线索。如果自己看不懂,就发出来大家一起看看。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2