• 全部
  • API 调用
  • 基础类
  • 控件与界面
  • 数据库相关
  • DataWindow
  • 项目管理
  • Web 应用
  • 脚本语言

Pb怎么备份SQLSERVE数据库,怎么还原?

symbol68688 2003-05-19 09:56:53
Pb怎么备份SQLSERVE数据库,怎么还原?在程序中实现
...全文
47 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
andyzq 2003-05-22
代码已经写的很清楚,先断开与主数据库的连接,然后连接到master库中,还原数据库,完成
后再连接到主数据库
回复
xirumin 2003-05-21
恢复要断开连接的。
回复
symbol68688 2003-05-21
//注:恢复时可能会出现“数据库正在使用!”
//解决办法:先停止一次SQL服务,然后再启动SQL服务,最后再试试恢复,一定OK。^_^
大家辛苦了,我备份程序已经测试通过了,但数据恢复总是提示“数据库正在使用!”
我照上述方法做了,没通过,生成exe文件也不行,希望有更好办法
搞定就结贴!谢谢!
回复
andyzq 2003-05-20
ls_datebase_name = "enterprise" //数据库名
ls_date_logic_name = "enterprise_data" //数据文件逻辑名
ls_log_logic_name = "enterprise_log" //日志文件逻辑名
ls_date_reality_name = "enterprise.mdf" //数据文件物理名
ls_log_reality_name = "enterprise.ldf" //日志文件物理名

在企业管理器中,右键点击要备份的数据库->属性

"数据文件"页面中的"文件名"就是数据文件的逻辑名,"位置"所显示的路径的最后一部分就是数据文件的物理名
"事务日志"中同上,记录的是日志文件的相关信息
回复
waterstony 2003-05-19
收藏
回复
flyhot 2003-05-19
顶!
回复
tchatcha 2003-05-19
恢复:
String f_p,f_n
string ls_sql
//给用户选择数据库备份文件
GetFileOpenName("选择文件",f_p,f_n)

//断开此数据库当前数据库
disconnect;
//连接master数据库,连接其它数据库也行,我不知道为什么。
SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = "master"
//这是我的服务器名——“AK47”,请改为你的服务器名
SQLCA.ServerName = "ak47"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = true
SQLCA.DBParm = ""
connect;

if sqlca.sqlcode<0 then
messagebox("","连接数据库失败!")
return 1
end if

//恢复数据库,数据库名为"ak"
ls_sql ="Restore Database ak from Disk= '"+f_p+"' with replace"
EXECUTE IMMEDIATE :ls_sql;

IF sqlca.sqlcode<0 THEN
messagebox(f_p,sqlca.sqlerrtext)
Close(parent)
else
messagebox("","恢复成功!")
END IF

//断开master数据库
disconnect;

//连接当前数据库
// Profile wyglxt
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=ds_wyglxt;UID=;PWD='"

Connect;
注:恢复时可能会出现“数据库正在使用!”
解决办法:先停止一次SQL服务,然后再启动SQL服务,最后再试试恢复,一定OK。^_^

回复
dengxun78 2003-05-19
学习!
回复
qqf 2003-05-19
恢复:
String f_p,f_n
string ls_sql
//给用户选择数据库备份文件
GetFileOpenName("选择文件",f_p,f_n)

//断开此数据库当前数据库
disconnect;
//连接master数据库,连接其它数据库也行,我不知道为什么。
SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = "master"
//这是我的服务器名——“AK47”,请改为你的服务器名
SQLCA.ServerName = "ak47"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = true
SQLCA.DBParm = ""
connect;

if sqlca.sqlcode<0 then
messagebox("","连接数据库失败!")
return 1
end if

//恢复数据库,数据库名为"ak"
ls_sql ="Restore Database ak from Disk= '"+f_p+"' with replace"
EXECUTE IMMEDIATE :ls_sql;

IF sqlca.sqlcode<0 THEN
messagebox(f_p,sqlca.sqlerrtext)
Close(parent)
else
messagebox("","恢复成功!")
END IF

//断开master数据库
disconnect;

//连接当前数据库
// Profile wyglxt
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=ds_wyglxt;UID=;PWD='"

Connect;
注:恢复时可能会出现“数据库正在使用!”
解决办法:先停止一次SQL服务,然后再启动SQL服务,最后再试试恢复,一定OK。^_^

回复
andyzq 2003-05-19
我写的,使用的前提是备份还原操作必须在数据库所在服务器上进行,除了自己外不能有任何
用户连接数据库

自定义的两个用户事件

1.ue_connect_database

SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = 'enterprise'
SQLCA.LogPass = ''
SQLCA.ServerName = ProfileString("enterprise.ini","database","servername","")
SQLCA.LogId = "sa"
SQLCA.AutoCommit = true
SQLCA.DBParm = ""
connect;

2.ue_connect_master
string ls_reg_path, ls_computer_name, ls_server_name
ls_reg_path = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName"
RegistryGet(ls_reg_path, "ComputerName", RegString!, ls_computer_name)

ls_server_name = ProfileString("enterprise.ini","database","servername","")

if upper(ls_computer_name) = upper(ls_server_name) then
disconnect;
SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = "master"
SQLCA.LogPass = ''
SQLCA.ServerName = ProfileString("enterprise.ini","database","servername","")
SQLCA.LogId = "sa"
SQLCA.AutoCommit = true
SQLCA.DBParm = ""
connect;
else
messagebox('提示','数据备份和恢复必须在数据库所在服务器上进行!')
close(this)
end if


备份代码:
string ls_datebase_name,ls_bkfilename,ls_sql
string docname, named
int li_filenum

event ue_connect_master()
li_filenum = GetFileSaveName("备份数据库,请输入备份文件名称", docname, named, "","数据库备份文件,") //打开文件选择对话框
ls_bkfilename = docname //备份文件完整路径

if len(docname) = 0 then
messagebox('提示','请输入文件名称')
return
end if

ls_datebase_name = "enterprise"

//备份数据库
sqlca.autocommit = true
ls_sql = "BACKUP DATABASE" + space(1) + ls_datebase_name + space(1) + "to disk='" + ls_bkfilename + "'"


EXECUTE IMMEDIATE :ls_sql;

if sqlca.sqlcode <> 0 then
disconnect;
messagebox('提示','备份数据库时出错!')
return
else
disconnect;
messagebox("提示","数据库备份完毕")
end if

event ue_connect_database()


还原代码:
string ls_datebase_name,ls_date_logic_name,ls_log_logic_name,ls_date_reality_name,ls_log_reality_name,ls_bkfilename, ls_sql
string ls_reg_path, ls_install_path, docname, named
int li_filenum

event ue_connect_master()

ls_reg_path = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Currentversion\Uninstall\Microsoft SQL Server 2000"
RegistryGet(ls_reg_path, "InstallLocation", RegString!, ls_install_path)
ls_install_path = ls_install_path + "\data\"

li_filenum = GetFileOpenName("读取备份文件", docname, named, "","数据库备份文件,") //打开文件选择对话框
ls_bkfilename = "'" + docname + "'" //备份文件完整路径

//if len(docname) = 0 then
// messagebox('提示','未选中有效的文件!')
// return
//end if

ls_datebase_name = "enterprise" //这部分改为你的
ls_date_logic_name = "enterprise_data" //这部分改为你的
ls_log_logic_name = "enterprise_log" //这部分改为你的
ls_date_reality_name = "enterprise.mdf" //这部分改为你的
ls_log_reality_name = "enterprise.ldf" //这部分改为你的

//还原数据库
SQLCA.AutoCommit = true
ls_sql = "RESTORE DATABASE" + space(1) + ls_datebase_name + space(1) + "FROM DISK = " + ls_bkfilename + space(1) + &
"WITH MOVE" + space(1) + "'" + ls_date_logic_name + "'" + space(1) + "TO" + space(1) + "'" + ls_install_path + ls_date_reality_name + "'," + &
" MOVE" + space(1) + "'" + ls_log_logic_name + "'" + space(1) + "TO" + space(1) + "'" + ls_install_path + ls_log_reality_name + "'"

EXECUTE IMMEDIATE :ls_sql;

if sqlca.sqlcode <> 0 then
disconnect;
messagebox("提示","还原数据库时出错!")
return
else
disconnect;
messagebox("提示","数据库还原成功!")
end if

event ue_connect_database()
回复
cooltnt 2003-05-19
呵呵,上面的已经很详细了。这年代赚分真难! ^_^
回复
joss 2003-05-19
如何备份和恢复数据库

备份:
string ls_path ,ls_use
INT li_net

Ls_path = sle_backpath.text
IF ls_path = "" THEN
Messagebox('系统提示',"请先指定要备份的数据文件的名称! ")
RETURN
END IF
IF FileExists ( ls_path ) THEN
li_net=Messagebox('信息','提示:系统发现在"'+ls_path+'"目录下已经存在一个同名的文件.~r~n~n要替换它吗?',Question!,YesNo!)
IF li_net= 1 THEN
FileDelete ( ls_path )
ELSE
END IF
END IF
SetPointer(HourGlass!)//---开始备份---
This.Enabled = FALSE
cb_restore.Enabled = FALSE

ls_use = 'EXEC'+'('+"'USE '" + sqlca.database+')'
EXECUTE IMMEDIATE :ls_use ;

SQLCA.AutoCommit = TRUE

ls_use = "EXEC sp_addumpdevice 'disk' , 'zyqdata' , '"+ls_path+"'"
EXECUTE IMMEDIATE : ls_use ;

ls_use ="BACKUP DATABASE " + sqlca.database + " TO zyqdata"
EXECUTE IMMEDIATE : ls_use ;

IF SQLCA.SQLCODE = -1 THEN
Messagebox("系统信息","数据库备份失败!~r~n~n请到检查路径正确与否。",Stopsign!)
this.enabled = TRUE
cb_restore.enabled = TRUE
sqlca.sqlcode = 0
sqlca.sqldbcode = 0
ls_use = "EXEC sp_dropdevice 'zyqdata'"
EXECUTE IMMEDIATE : ls_use ;
RETURN
END IF

ls_use = "EXEC sp_dropdevice 'zyqdata'"
EXECUTE IMMEDIATE : ls_use ;

SetPointer(Arrow!)
IF SQLCA.SQLCODE >= 0 THEN
Messagebox("系统信息","备份完成! ")

This.enabled = TRUE
cb_restore.enabled = TRUE
RETURN
END IF
CONNECT USING SQLCA ;
SQLCA.AutoCommit = false

恢复:
string ls_server,ls_database
String ls_path,ls_use

ls_path = sle_repath.text
IF ls_path = "" THEN
Messagebox('系统提示',"请先选择要恢复的数据文件! ")
sle_repath.SetFocus()
RETURN
END IF
ls_server=sqlca.servername
ls_database=sqlca.database
COMMIT USING SQLCA ;
SetPointer(HourGlass!)//---开始恢复
//恢复的原因,连接到master数据库
DISCONNECT USING SQLCA ;
Transaction SQLCA_MASTER
SQLCA_MASTER = CREATE Transaction
SQLCA_MASTER.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA_MASTER.DataBase = "master"
SQLCA_MASTER.LogId = "sa"
SQLCA_MASTER.servername =ls_server
SQLCA_MASTER.AutoCommit = TRUE
SQLCA_MASTER.DBParm = ""
CONNECT USING SQLCA_MASTER ;

This.Enabled = FALSE
cb_backup.Enabled = FALSE

ls_use = "EXEC sp_addumpdevice 'disk' "+" , 'zyqdataa' "+","+" '"+ls_path+"' "
EXECUTE IMMEDIATE : ls_use USING SQLCA_MASTER;

ls_use = "RESTORE DATABASE " + ls_database + " FROM DISK = "+" '"+ls_path+"' "
EXECUTE IMMEDIATE : ls_use USING SQLCA_MASTER;

IF SQLCA_MASTER.SQLCODE = -1 THEN
Messagebox("系统信息","警告:数据库恢复失败!~r~n~n请确认路径以及所选文件正确与否!~r~n~n或者有其他用户正在连接数据库!",Stopsign!)
This.Enabled = TRUE
cb_backup.Enabled = TRUE
SQLCA.SQLCODE = 0
SQLCA.SQLDBCODE = 0
ls_use = "EXEC sp_dropdevice 'coolnan'"
EXECUTE IMMEDIATE : ls_use USING SQLCA_MASTER;
RETURN
END IF

ls_use = "EXEC sp_dropdevice 'zyqdata'"
EXECUTE IMMEDIATE : ls_use USING SQLCA_MASTER;

IF SQLCA_MASTER.SQLCODE = 0 THEN
Messagebox("系统信息","数据库恢复完成!")
This.Enabled = TRUE
cb_backup.Enabled = TRUE
RETURN
ELSE
Messagebox('系统信息','数据库备份操作未进行!',Stopsign!)
RETURN
END IF
DISCONNECT USING SQLCA_MASTER ;
CONNECT USING SQLCA ;
SetPointer(HourGlass!)
回复
dt 2003-05-19
恢复时,最好使用SA用户
回复
symbol68688 2003-05-19
ls_datebase_name = "enterprise"
ls_date_logic_name = "enterprise_data"
ls_log_logic_name = "enterprise_log"
ls_date_reality_name = "enterprise.mdf"
ls_log_reality_name = "enterprise.ldf"

andyzq(小强)侠,上述变量是什么意思?第一次写备份代码,有点晕
谢谢

回复
相关推荐
发帖
PowerBuilder
创建于2007-09-28

865

社区成员

PowerBuilder 相关问题讨论
申请成为版主
帖子事件
创建了帖子
2003-05-19 09:56
社区公告
暂无公告