如何自动备份数据库(access)?

时间:2022-06-03 14:07:48
请问如何在某一触发事件时自动备份数据库?比如在某一时间、或在退出程序时自动备份数据库。
请高手将代码共享一下   
多谢!

31 个解决方案

#1


直接拷贝一下,不可以吗?

#2


你可以建立一个备份数据库,将数据传过去,不过应该是很繁琐的,还是直接拷贝简单,CopyFile函数你看看。

#3


呵呵,如果想用直接拷贝的话,那太简单了 
不过那毕竟需要人为的,不是很方便的

我想用代码来实现,不知有谁能帮我啊?

#4


给你一些 SQL 语句:
备份语句:backup database XXX(数据库名称) to disk='XXXXXXXXX'(存放备份文件的路径)
还原语句:use master restore database XXX(数据库名称) from disk='XXXXXXXXX'(存放备份文件的路径)//必须先use master,否则出错。

#5


我试过这种方法,通不过
ACCESS 数据库下,能用吗?!

#6


一个思路:定时启动2000计划任务功能.用一个批处理做命令行的备份然后用FTP方式传到其它机器就OK.
备份程序的执行策略是:
    1.测试备份服务器是否已启动,若未启动则启动之。
    2.先通过命令语句执行将数据库dump到备份程序的目录下的db.dmp。
    3.如果dump成功,则在本机上删除上一次的备份文件db.dmp.1,然后将本次dump文件重命名为db.dmp.1。
    4.如果dump成功,再用FTP将本次文件上传到另一台机器上。在那台FTP服务器上有一个目录dumpfiles,用来保存上传的dump文件,并且在那个目录下保存最近两次的dump文件,其名字分别是db.dmp.1和db.dmp.2。FTP所执行的脚本是send.txt。
用以下命令可以FTP至其它机器,
ftp -s:send.txt > ls.txt
/send.txt 内容:
open 134.135.136.137
anonymous
abc
cd /dumpfiles
!echo %time% DELETE db.dmp.2 >>dumpdb.log
delete db.dmp.2
!echo %time% RENAME db.dmp.1 TO db.dmp.2 >>dumpdb_0.log
rename db.dmp.1 db.dmp.2
!echo %time% SEND db.dmp.1 >>dumpdb_0.log
bina
send db.dmp.1
!echo %time% SEND DONE. >>dumpdb_0.log
bye

#7


备份的命令可以用下华仔的语句在批处理文件中实现(借用华仔的语句不会生气吧,楼上如果给分的话请不要忘记华仔哟!)
给你一些 SQL 语句:
备份语句:backup database XXX(数据库名称) to disk='XXXXXXXXX'(存放备份文件的路径)
还原语句:use master restore database XXX(数据库名称) from disk='XXXXXXXXX'(存放备份文件的路径)//必须先use master,否则出错。

#8


你可以直接备份ACCESS文件好了!

#9


定时器事件中直接拷贝,不过备份前最好post一下。

#10


如果要实时拷贝那么就用
backup database XXX(数据库名称) to disk='XXXXXXXXX'(存放备份文件的路径)
否则直接拷贝数据库文件,然后改个文件名/扩展名就行了

#11


直接拷贝文件,用api函数copyfile即可

#12


请  wangxd(东东) 简单写一下代码好吗?
(不用路径选择)
我写了一些可是好像什么地方能错了
多谢!!

#13


怎么没有人解答呢?
用copyfile  谁能解决?

#14


VOID CopyAFile(LPSTR szFullPathSrc, LPSTR szFullPathDst, INT cmo, INT fAppend);

CopyAFile copies the specified file from its source directory to its destination directory.

Arguments

szFullPathSrc

Specifies the full path of the file you want to copy.

szFullPathDst

Specifies the full path of the destination directory for the file.

cmo

Specifies one or more command option flags. You can use one or more of the following for cmo (by adding them together): 
cmoDecompress, cmoTimeStamp, cmoReadOnly, cmoOverwrite, cmoNone, or cmoAll .

fAppend

Specifies whether you want any existing file to be appended to. A value of one indicates that you want to append to an existing file; zero indicates that you want to remove the existing file before copying the new file.

#15


数据库还原:
use master --使用master数据库,目的是关闭test数据库
RESTORE DATABASE test
FROM DISK = '.\baktest.mdf'
数据库备份:  
 backup database test to disk='.\baktest.mdf'  --'g:\baktest.mdf'

#16


还是提示语句错误啊!
晕~~~~~    
ADOQuery+Access  能用这些语句吗?有backup / use ?
如果是MySql数据库还是可以这么用的吧??!!

但我用的是ACCESS啊!

#17


怎么没有人回答啊?
难道没人能购回答我吗?
5555~~~~~~

#18


我请求斑竹给我删掉此帖,望帮忙!
因为我没有得到我要的答案!!!

#19


CopyFile("slh","d:\\slh.txt",false);
//false 表示文件存在也覆盖
//true 表示文件存在就不覆盖。

#20


同意 slhuang(★心如朗月连天静,性似寒潭彻底清★)

#21


在窗口的close 事件中
tablename ->post ;
CopyFile("slh","d:\\slh.txt",false);
....
就OK了

#22


可以建立一个备件事件,其实原理和楼上的一样,只是可以在程序运行过程中就可以备件,我的方法是:
1、断开数据库的连接:DataBase->Connected=false;
2、CopyFile(databasename,targetbasename);
3、重新启动数据库连接:DataBase->Connected=true

#23


CopyFile("YouDatabase","TYouDatabase",false);

不可以吗?

#24


Access不支持Restore 和bakup !
你最好自己写个函数手工备份你的数据

#25


备份直接拷数据库文件呢。

#26


CopyFile()函数这样使用
例:
String Sfile,Tfile;

Sfile=Path + "\\a.mdb";
Tfile=Path + "\\backup.mdb";
CopyFile(Sfile.c_str(),Tfile.c_str(),false);

#27


这是我的一个程序中使用到的一段代码;你看看

功能:保存某组数据到新的acess数据库;
bool __fastcall TMainForm::mCreateAccess(String mdbfile,String ZH)
{
  bool result=false;
  String sql,dsc;
  TResourceStream *rs=new TResourceStream((int)HInstance,"ID_MDB","MDB");
  if (rs==NULL) {ShowMessage("读取资源出错,不能够保存,可能程序已被病毒感染,请联系开发商。");return result;}
  rs->SaveToFile(mdbfile);
  delete rs;

  TQuery *mQuery=new TQuery(this);
  TDatabase *DataBase=new TDatabase(this);
  mQuery->RequestLive=true;
  try
  {

    OpenMDBDB(DataBase,mQuery,mdbfile,true);   //打开数据库; 建立一个数据源;

    String dbsql;
    String dbname[5];            //表名数组;
    dbname[0]="YGJB";            //基本表
    dbname[1]="YGTJ";            //统计数据表;
    dbname[2]="YGZH";            //组号表;
    dbname[3]="YGYSSJ";          //原始数据表;
    dbname[4]="YGBP";            //波谱数据表;
    String msql[5];
    msql[0]="(sypz,sd,sj,ch,cscs,syy,MTIME,xjlmd,cjlmd,mjlmd,jztz,SYCS,zh,MEAN)  VALUES(";

    msql[1]="(zh,sycs,AF,CV,U,CVm1,CVm2,CVm3,CVm4,CVm5,Dr1,Dr2,thin1,thin2,thin3,thin4,thick1,thick2,thick3,thick4,neps1,neps2,neps3,neps4,mean,MTIME)  VALUES(";
  
    msql[2]="(ZH,CSCS,MTIME)  VALUES(";

    msql[3]="(ZH,SYCS,MTIME)  VALUES(";
 
    msql[4]="(ZH,SYCS,MTIME)  VALUES(";

    for (int i=0;i<5;i++)
    {
      //查询语句;
      dbsql="select * from " +dbname[i]+"  where ZH=";
      dbsql=dbsql+"'"+ZH+"'";
      dbsql=dbsql+ " and MTIME=" +mPbVariable.mTime;   // tmptime为全局的时间变量;

     
      if (!DoSql(DM->Query,dbsql,false))
      {
         ShowMessage("当前组没有数据,不能够保存。");
         DeleteFile(mdbfile);   //删除拷贝过来的文件;
         return result;
      }

      int mN=DM->Query->RecordCount;
      int k=DM->Query->Fields->Count;
      String mSYCS;
      DM->Query->FindFirst();
      for (int j=0;j<mN;j++)
      {
          //合成sql语句;
          sql="INSERT into "+ dbname[i];
          sql=sql+msql[i];

          if (i<3)
          {
            for (int l=0;l<k-1;l++)
            {
              sql=sql+"'"+DM->Query->Fields->Fields[l]->AsString+"'";
              sql=sql+",";
            }
            sql=sql+"'"+DM->Query->Fields->Fields[k-1]->AsString+"'"+")";
          }
          else   //YGYSSJ;YGBP
          {
              mSYCS="'"+DM->Query->Fields->FieldByName("SYCS")->AsString+"'";
              sql=sql+"'"+DM->Query->Fields->FieldByName("ZH")->AsString+"'";
              sql=sql+",";
              sql=sql+mSYCS;
              sql=sql+",";
              sql=sql+"'"+DM->Query->Fields->FieldByName("MTIME")->AsString+"'";
              sql+=")";
          }
          
          DoSql(mQuery,sql,true);    //执行sql语句;
          if (i>2)
          {

            if (i==3)   //添加保存别的字段的内容
            {
               TMemoryStream* pms1,* pms2,* pms3; //读或者写的内容
               pms1=new TMemoryStream();
               pms2=new TMemoryStream();
               pms3=new TMemoryStream();
               sql="select BYSJ,MJSJ,YSSJ from YGYSSJ where ZH=";
               sql= sql+"'"+ZH+"'";
               sql= sql+ " and MTIME=" +mPbVariable.mTime;   // tmptime为全局的时间变量;
               sql= sql+ " and  SYCS="+mSYCS;
               DoSql(mQuery,sql,false);    //执行sql语句;
               //读取源表数据;
               ReadWriteBlobData(DM->Query,"BYSJ",pms1,false);
               ReadWriteBlobData(DM->Query,"MJSJ",pms2,false);
               ReadWriteBlobData(DM->Query,"YSSJ",pms3,false);
               //写新库;
               ReadWriteBlobData(mQuery,"BYSJ",pms1,true);
               ReadWriteBlobData(mQuery,"MJSJ",pms2,true);
               ReadWriteBlobData(mQuery,"YSSJ",pms3,true);
               delete pms1;
               delete pms2;
               delete pms3;

            }
            else
            {
               TMemoryStream* pms; //读或者写的内容
               pms=new TMemoryStream();

               sql="select BAR from  YGBP where ZH=";
               sql= sql+"'"+ZH+"'";
               sql= sql+ " and MTIME=" +mPbVariable.mTime;   // tmptime为全局的时间变量;
               sql= sql+ " and  SYCS="+mSYCS;
               DoSql(mQuery,sql,false);    //执行sql语句;
               //读取源表数据;
               ReadWriteBlobData(DM->Query,"BAR",pms,false);

               //写新库;
               ReadWriteBlobData(mQuery,"BAR",pms,true);

               delete pms;

            }
          }

          DM->Query->FindNext();
          
      }

     //继续保存其他的表;---原始数据表;
    }
    result=true;
    if (mQuery->Active) {mQuery->Active=false;}
    if (DM->Query->Active) {DM->Query->Active=false;;}
  }
  __finally
  {
    if (DataBase->Connected) DataBase->Close();
    delete  mQuery;
    delete  DataBase;

  }
  return  result;
}

#28


上边的方法是:把一个空的mdb结构表当作资源,备份时释放出来

然后使用select语句把符合条件的选出来,再insert到备份数据库;

很久以前写的程序,很乱,见笑了!@

#29


当然其中OpenMDBDB,DoSql,ReadWriteBlobDatae等都是我自定义的过程;

#30


我认为用COPYFILE函数最好,简单,而且效率也高。

#31


直接用CopyFile就行了,再加一个二次备份(备份的备份)的机制,基本就可以达到目的了

#1


直接拷贝一下,不可以吗?

#2


你可以建立一个备份数据库,将数据传过去,不过应该是很繁琐的,还是直接拷贝简单,CopyFile函数你看看。

#3


呵呵,如果想用直接拷贝的话,那太简单了 
不过那毕竟需要人为的,不是很方便的

我想用代码来实现,不知有谁能帮我啊?

#4


给你一些 SQL 语句:
备份语句:backup database XXX(数据库名称) to disk='XXXXXXXXX'(存放备份文件的路径)
还原语句:use master restore database XXX(数据库名称) from disk='XXXXXXXXX'(存放备份文件的路径)//必须先use master,否则出错。

#5


我试过这种方法,通不过
ACCESS 数据库下,能用吗?!

#6


一个思路:定时启动2000计划任务功能.用一个批处理做命令行的备份然后用FTP方式传到其它机器就OK.
备份程序的执行策略是:
    1.测试备份服务器是否已启动,若未启动则启动之。
    2.先通过命令语句执行将数据库dump到备份程序的目录下的db.dmp。
    3.如果dump成功,则在本机上删除上一次的备份文件db.dmp.1,然后将本次dump文件重命名为db.dmp.1。
    4.如果dump成功,再用FTP将本次文件上传到另一台机器上。在那台FTP服务器上有一个目录dumpfiles,用来保存上传的dump文件,并且在那个目录下保存最近两次的dump文件,其名字分别是db.dmp.1和db.dmp.2。FTP所执行的脚本是send.txt。
用以下命令可以FTP至其它机器,
ftp -s:send.txt > ls.txt
/send.txt 内容:
open 134.135.136.137
anonymous
abc
cd /dumpfiles
!echo %time% DELETE db.dmp.2 >>dumpdb.log
delete db.dmp.2
!echo %time% RENAME db.dmp.1 TO db.dmp.2 >>dumpdb_0.log
rename db.dmp.1 db.dmp.2
!echo %time% SEND db.dmp.1 >>dumpdb_0.log
bina
send db.dmp.1
!echo %time% SEND DONE. >>dumpdb_0.log
bye

#7


备份的命令可以用下华仔的语句在批处理文件中实现(借用华仔的语句不会生气吧,楼上如果给分的话请不要忘记华仔哟!)
给你一些 SQL 语句:
备份语句:backup database XXX(数据库名称) to disk='XXXXXXXXX'(存放备份文件的路径)
还原语句:use master restore database XXX(数据库名称) from disk='XXXXXXXXX'(存放备份文件的路径)//必须先use master,否则出错。

#8


你可以直接备份ACCESS文件好了!

#9


定时器事件中直接拷贝,不过备份前最好post一下。

#10


如果要实时拷贝那么就用
backup database XXX(数据库名称) to disk='XXXXXXXXX'(存放备份文件的路径)
否则直接拷贝数据库文件,然后改个文件名/扩展名就行了

#11


直接拷贝文件,用api函数copyfile即可

#12


请  wangxd(东东) 简单写一下代码好吗?
(不用路径选择)
我写了一些可是好像什么地方能错了
多谢!!

#13


怎么没有人解答呢?
用copyfile  谁能解决?

#14


VOID CopyAFile(LPSTR szFullPathSrc, LPSTR szFullPathDst, INT cmo, INT fAppend);

CopyAFile copies the specified file from its source directory to its destination directory.

Arguments

szFullPathSrc

Specifies the full path of the file you want to copy.

szFullPathDst

Specifies the full path of the destination directory for the file.

cmo

Specifies one or more command option flags. You can use one or more of the following for cmo (by adding them together): 
cmoDecompress, cmoTimeStamp, cmoReadOnly, cmoOverwrite, cmoNone, or cmoAll .

fAppend

Specifies whether you want any existing file to be appended to. A value of one indicates that you want to append to an existing file; zero indicates that you want to remove the existing file before copying the new file.

#15


数据库还原:
use master --使用master数据库,目的是关闭test数据库
RESTORE DATABASE test
FROM DISK = '.\baktest.mdf'
数据库备份:  
 backup database test to disk='.\baktest.mdf'  --'g:\baktest.mdf'

#16


还是提示语句错误啊!
晕~~~~~    
ADOQuery+Access  能用这些语句吗?有backup / use ?
如果是MySql数据库还是可以这么用的吧??!!

但我用的是ACCESS啊!

#17


怎么没有人回答啊?
难道没人能购回答我吗?
5555~~~~~~

#18


我请求斑竹给我删掉此帖,望帮忙!
因为我没有得到我要的答案!!!

#19


CopyFile("slh","d:\\slh.txt",false);
//false 表示文件存在也覆盖
//true 表示文件存在就不覆盖。

#20


同意 slhuang(★心如朗月连天静,性似寒潭彻底清★)

#21


在窗口的close 事件中
tablename ->post ;
CopyFile("slh","d:\\slh.txt",false);
....
就OK了

#22


可以建立一个备件事件,其实原理和楼上的一样,只是可以在程序运行过程中就可以备件,我的方法是:
1、断开数据库的连接:DataBase->Connected=false;
2、CopyFile(databasename,targetbasename);
3、重新启动数据库连接:DataBase->Connected=true

#23


CopyFile("YouDatabase","TYouDatabase",false);

不可以吗?

#24


Access不支持Restore 和bakup !
你最好自己写个函数手工备份你的数据

#25


备份直接拷数据库文件呢。

#26


CopyFile()函数这样使用
例:
String Sfile,Tfile;

Sfile=Path + "\\a.mdb";
Tfile=Path + "\\backup.mdb";
CopyFile(Sfile.c_str(),Tfile.c_str(),false);

#27


这是我的一个程序中使用到的一段代码;你看看

功能:保存某组数据到新的acess数据库;
bool __fastcall TMainForm::mCreateAccess(String mdbfile,String ZH)
{
  bool result=false;
  String sql,dsc;
  TResourceStream *rs=new TResourceStream((int)HInstance,"ID_MDB","MDB");
  if (rs==NULL) {ShowMessage("读取资源出错,不能够保存,可能程序已被病毒感染,请联系开发商。");return result;}
  rs->SaveToFile(mdbfile);
  delete rs;

  TQuery *mQuery=new TQuery(this);
  TDatabase *DataBase=new TDatabase(this);
  mQuery->RequestLive=true;
  try
  {

    OpenMDBDB(DataBase,mQuery,mdbfile,true);   //打开数据库; 建立一个数据源;

    String dbsql;
    String dbname[5];            //表名数组;
    dbname[0]="YGJB";            //基本表
    dbname[1]="YGTJ";            //统计数据表;
    dbname[2]="YGZH";            //组号表;
    dbname[3]="YGYSSJ";          //原始数据表;
    dbname[4]="YGBP";            //波谱数据表;
    String msql[5];
    msql[0]="(sypz,sd,sj,ch,cscs,syy,MTIME,xjlmd,cjlmd,mjlmd,jztz,SYCS,zh,MEAN)  VALUES(";

    msql[1]="(zh,sycs,AF,CV,U,CVm1,CVm2,CVm3,CVm4,CVm5,Dr1,Dr2,thin1,thin2,thin3,thin4,thick1,thick2,thick3,thick4,neps1,neps2,neps3,neps4,mean,MTIME)  VALUES(";
  
    msql[2]="(ZH,CSCS,MTIME)  VALUES(";

    msql[3]="(ZH,SYCS,MTIME)  VALUES(";
 
    msql[4]="(ZH,SYCS,MTIME)  VALUES(";

    for (int i=0;i<5;i++)
    {
      //查询语句;
      dbsql="select * from " +dbname[i]+"  where ZH=";
      dbsql=dbsql+"'"+ZH+"'";
      dbsql=dbsql+ " and MTIME=" +mPbVariable.mTime;   // tmptime为全局的时间变量;

     
      if (!DoSql(DM->Query,dbsql,false))
      {
         ShowMessage("当前组没有数据,不能够保存。");
         DeleteFile(mdbfile);   //删除拷贝过来的文件;
         return result;
      }

      int mN=DM->Query->RecordCount;
      int k=DM->Query->Fields->Count;
      String mSYCS;
      DM->Query->FindFirst();
      for (int j=0;j<mN;j++)
      {
          //合成sql语句;
          sql="INSERT into "+ dbname[i];
          sql=sql+msql[i];

          if (i<3)
          {
            for (int l=0;l<k-1;l++)
            {
              sql=sql+"'"+DM->Query->Fields->Fields[l]->AsString+"'";
              sql=sql+",";
            }
            sql=sql+"'"+DM->Query->Fields->Fields[k-1]->AsString+"'"+")";
          }
          else   //YGYSSJ;YGBP
          {
              mSYCS="'"+DM->Query->Fields->FieldByName("SYCS")->AsString+"'";
              sql=sql+"'"+DM->Query->Fields->FieldByName("ZH")->AsString+"'";
              sql=sql+",";
              sql=sql+mSYCS;
              sql=sql+",";
              sql=sql+"'"+DM->Query->Fields->FieldByName("MTIME")->AsString+"'";
              sql+=")";
          }
          
          DoSql(mQuery,sql,true);    //执行sql语句;
          if (i>2)
          {

            if (i==3)   //添加保存别的字段的内容
            {
               TMemoryStream* pms1,* pms2,* pms3; //读或者写的内容
               pms1=new TMemoryStream();
               pms2=new TMemoryStream();
               pms3=new TMemoryStream();
               sql="select BYSJ,MJSJ,YSSJ from YGYSSJ where ZH=";
               sql= sql+"'"+ZH+"'";
               sql= sql+ " and MTIME=" +mPbVariable.mTime;   // tmptime为全局的时间变量;
               sql= sql+ " and  SYCS="+mSYCS;
               DoSql(mQuery,sql,false);    //执行sql语句;
               //读取源表数据;
               ReadWriteBlobData(DM->Query,"BYSJ",pms1,false);
               ReadWriteBlobData(DM->Query,"MJSJ",pms2,false);
               ReadWriteBlobData(DM->Query,"YSSJ",pms3,false);
               //写新库;
               ReadWriteBlobData(mQuery,"BYSJ",pms1,true);
               ReadWriteBlobData(mQuery,"MJSJ",pms2,true);
               ReadWriteBlobData(mQuery,"YSSJ",pms3,true);
               delete pms1;
               delete pms2;
               delete pms3;

            }
            else
            {
               TMemoryStream* pms; //读或者写的内容
               pms=new TMemoryStream();

               sql="select BAR from  YGBP where ZH=";
               sql= sql+"'"+ZH+"'";
               sql= sql+ " and MTIME=" +mPbVariable.mTime;   // tmptime为全局的时间变量;
               sql= sql+ " and  SYCS="+mSYCS;
               DoSql(mQuery,sql,false);    //执行sql语句;
               //读取源表数据;
               ReadWriteBlobData(DM->Query,"BAR",pms,false);

               //写新库;
               ReadWriteBlobData(mQuery,"BAR",pms,true);

               delete pms;

            }
          }

          DM->Query->FindNext();
          
      }

     //继续保存其他的表;---原始数据表;
    }
    result=true;
    if (mQuery->Active) {mQuery->Active=false;}
    if (DM->Query->Active) {DM->Query->Active=false;;}
  }
  __finally
  {
    if (DataBase->Connected) DataBase->Close();
    delete  mQuery;
    delete  DataBase;

  }
  return  result;
}

#28


上边的方法是:把一个空的mdb结构表当作资源,备份时释放出来

然后使用select语句把符合条件的选出来,再insert到备份数据库;

很久以前写的程序,很乱,见笑了!@

#29


当然其中OpenMDBDB,DoSql,ReadWriteBlobDatae等都是我自定义的过程;

#30


我认为用COPYFILE函数最好,简单,而且效率也高。

#31


直接用CopyFile就行了,再加一个二次备份(备份的备份)的机制,基本就可以达到目的了