一、怎么用SQL语句备份与恢复数据库
1、用SQL语句备份与恢复数据库的步骤:
2、备份: mysqldump--quick--database ondemand1--u root>bacqup.sql这样就能把数据库中ondemand1的表全部备份出来。
3、其中参数的格式是:--,两横杠,不是我们常用的单横杠。
4、quick是在数据比较多的时候,不用该参数的话,所有的数据都会先在内存缓存,接着才导出,这样会导致服务器运行减慢。
5、--u必须要加一个用户名,否则系统会提示你进不了ODBC数据库的。
6、>backup.sql则是你备份数据库的目标文件名。
7、恢复:m1ysql-u root-p database_name d:\db.bak,在WIN下,路径用path/filename.sql是不行的,那就用path\filename.sql。
8、是对数据库进行操作的一种语言。结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
二、用SQL语句备份数据库
利用T-SQL语句,实现数据库的备份和还原的功能
体现了SQL Server中的四个知识点:
1.获取SQL Server服务器上的默认目录
3.恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理
@dbname指定要取得目录的数据库名
如果指定的数据不存在,返回安装SQL时设置的默认数据目录
如果指定NULL,则返回默认的SQL备份目录名
select数据库文件目录=dbo.f_getdbpath(’tempdb’)
,[默认SQL SERVER数据目录]=dbo.f_getdbpath(’’)
,[默认SQL SERVER备份目录]=dbo.f_getdbpath(null)
if exists(select* from dbo.sysobjects where id= object_id(N’[dbo].[f_getdbpath]’) and xtype in(N’FN’, N’IF’, N’TF’))
drop function [dbo].[f_getdbpath]
create function f_getdbpath(@dbname sysname)
if@dbname is null or db_id(@dbname) is null
select@re=rtrim(reverse(filename)) from master..sysdatabases where name=’master’
select@re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname
set@re=reverse(substring(@re,charindex(’\’,@re)+5,260))+’BACKUP’
set@re=reverse(substring(@re,charindex(’\’,@re),260))
exec p_backupdb@bkpath=’c:\’,@bkfname=’db_\DATE\_db.bak’
exec p_backupdb@bkpath=’c:\’,@bkfname=’db_\DATE\_df.bak’,@bktype=’DF’
exec p_backupdb@bkpath=’c:\’,@bkfname=’db_\DATE\_log.bak’,@bktype=’LOG’
if exists(select* from dbo.sysobjects where id= object_id(N’[dbo].[p_backupdb]’) and OBJECTPROPERTY(id, N’IsProcedure’)= 1)
drop procedure [dbo].[p_backupdb]
@dbname sysname=’’,--要备份的数据库名称,不指定则备份当前数据库
@bkpath nvarchar(260)=’’,--备份文件的存放目录,不指定则使用SQL默认的备份目录
@bkfname nvarchar(260)=’’,--备份文件名,文件名中能用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间
@bktype nvarchar(10)=’DB’,--备份类型:’DB’备份数据库,’DF’差异备份,’LOG’日志备份
@appendfile bit=1--追加/覆盖备份文件
if isnull(@dbname,’’)=’’ set@dbname=db_name()
if isnull(@bkpath,’’)=’’ set@bkpath=dbo.f_getdbpath(null)
if isnull(@bkfname,’’)=’’ set@bkfname=’\DBNAME\_\DATE\_\TIME\.BAK’
set@bkfname=replace(replace(replace(@bkfname,’\DBNAME\’,@dbname)
,’\DATE\’,convert(varchar,getdate(),112))
,’\TIME\’,replace(convert(varchar,getdate(),108),’:’,’’))
set@sql=’backup’+case@bktype when’LOG’ then’log’ else’database’ end+@dbname
+’ to disk=’’’+@bkpath+@bkfname
+’’’ with’+case@bktype when’DF’ then’DIFFERENTIAL,’ else’’ end
+case@appendfile when 1 then’NOINIT’ else’INIT’ end
exec p_RestoreDb@bkfile=’c:\db_20031015_db.bak’,@dbname=’db’
exec p_RestoreDb@bkfile=’c:\db_20031015_db.bak’,@dbname=’db’,@retype=’DBNOR’
exec p_backupdb@bkfile=’c:\db_20031015_df.bak’,@dbname=’db’,@retype=’DF’
exec p_RestoreDb@bkfile=’c:\db_20031015_db.bak’,@dbname=’db’,@retype=’DBNOR’
exec p_backupdb@bkfile=’c:\db_20031015_log.bak’,@dbname=’db’,@retype=’LOG’
if exists(select* from dbo.sysobjects where id= object_id(N’[dbo].[p_RestoreDb]’) and OBJECTPROPERTY(id, N’IsProcedure’)= 1)
drop procedure [dbo].[p_RestoreDb]
@bkfile nvarchar(1000),--定义要恢复的备份文件名
@dbname sysname=’’,--定义恢复后的数据库名,默认为备份的文件名
@dbpath nvarchar(260)=’’,--恢复后的数据库存放目录,不指定则为SQL的默认数据目录
@retype nvarchar(10)=’DB’,--恢复类型:’DB’完事恢复数据库,’DBNOR’为差异恢复,日志恢复进行完整恢复,’DF’差异备份的恢复,’LOG’日志恢复
@filenumber int=1,--恢复的文件号
@overexist bit=1,--是否覆盖已存在的数据库,仅@retype为
@killuser bit=1--是否关闭用户使用进程,仅@overexist=1时有效
,@sql=case when charindex(’.’,@sql)=0 then@sql
else substring(@sql,charindex(’.’,@sql)+1,1000) end
,@sql=case when charindex(’\’,@sql)=0 then@sql
else left(@sql,charindex(’\’,@sql)-1) end
if isnull(@dbpath,’’)=’’ set@dbpath=dbo.f_getdbpath(’’)
set@sql=’restore’+case@retype when’LOG’ then’log’ else’database’ end+@dbname
+’ from disk=’’’+@bkfile+’’’’
+’ with file=’+cast(@filenumber as varchar)
+case when@overexist=1 and@retype in(’DB’,’DBNOR’) then’,replace’ else’’ end
+case@retype when’DBNOR’ then’,NORECOVERY’ else’,RECOVERY’ end
if@retype=’DB’ or@retype=’DBNOR’
declare@lfn nvarchar(128),@tp char(1),@i int
create table#tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
insert into#tb exec(’restore filelistonly from disk=’’’+@bkfile+’’’’)
declare#f cursor for select ln,tp from#tb
fetch next from#f into@lfn,@tp
select@sql=@sql+’,move’’’+@lfn+’’’ to’’’+@dbpath+@dbname+cast(@i as varchar)
+case@tp when’D’ then’.mdf’’’ else’.ldf’’’ end
fetch next from#f into@lfn,@tp
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
fetch next from#spid into@spid
fetch next from#spid into@spid
exec p_createjob@jobname=’mm’,@sql=’select* from syscolumns’,@freqtype=’month’
exec p_createjob@jobname=’ww’,@sql=’select* from syscolumns’,@freqtype=’week’
exec p_createjob@jobname=’a’,@sql=’select* from syscolumns’
--每日执行的作业,每天隔4小时重复的作业
exec p_createjob@jobname=’b’,@sql=’select* from syscolumns’,@fsinterval=4
if exists(select* from dbo.sysobjects where id= object_id(N’[dbo].[p_createjob]’) and OBJECTPROPERTY(id, N’IsProcedure’)= 1)
drop procedure [dbo].[p_createjob]
@jobname varchar(100),--作业名称
@sql varchar(8000),--要执行的命令
@dbname sysname=’’,--默认为当前的数据库名
@freqtype varchar(6)=’day’,--时间周期,month月,week周,day日
@fsinterval int=1,--相对于每日的重复次数
@time int=170000--开始执行时间,对于重复执行的作业,将从0点到23:59分
if isnull(@dbname,’’)=’’ set@dbname=db_name()
exec msdb..sp_add_job@job_name=@jobname
exec msdb..sp_add_jobstep@job_name=@jobname,
declare@ftype int,@fstype int,@ffactor int
select@ftype=case@freqtype when’day’ then 4
,@fstype=case@fsinterval when 1 then 0 else 8 end
if@fsinterval<>1 set@time=0
set@ffactor=case@freqtype when’day’ then 0 else 1 end
EXEC msdb..sp_add_jobschedule@job_name=@jobname,
@freq_type=@ftype,--每天,8每周,16每月
@freq_interval=1,--重复执行次数
@freq_subday_type=@fstype,--是否重复执行
@freq_subday_interval=@fsinterval,--重复周期
@freq_recurrence_factor=@ffactor,
@active_start_time=@time--下午17:00:00分执行
完整备份(每个星期天一次)+差异备份(每天备份一次)+日志备份(每2小时备份一次)
set@sql=’exec p_backupdb@dbname=’’要备份的数据库名’’’
exec p_createjob@jobname=’每周备份’,@sql,@freqtype=’week’
set@sql=’exec p_backupdb@dbname=’’要备份的数据库名’’,@bktype=’DF’’
exec p_createjob@jobname=’每天差异备份’,@sql,@freqtype=’day’
set@sql=’exec p_backupdb@dbname=’’要备份的数据库名’’,@bktype=’LOG’’
exec p_createjob@jobname=’每2小时日志备份’,@sql,@freqtype=’day’,@fsinterval=2
1.设置三个作业,分别对PRODUCE库进行每日备份,每周备份,每月备份
2.新建三个新库,分别命名为:每日备份,每周备份,每月备份
3.建立三个作业,分别把三个备份库还原到以上的三个新库。
目的:当用户在produce库中有所有的数据丢失时,均能从上面的三个备份库中导入相应的TABLE数据。
--1.建立每月备份和生成月备份数据库的作业,每月每1天下午16:40分进行:
declare@path nvarchar(260),@fname nvarchar(100)
set@fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_m.bak’’
set@path=dbo.f_getdbpath(null)+@fname
exec p_backupdb@dbname=’’PRODUCE’’,@bkfname=@fname
exec p_RestoreDb@bkfile=@path,@dbname=’’PRODUCE_月’’
--为周数据库恢复准备基础数据库
exec p_RestoreDb@bkfile=@path,@dbname=’’PRODUCE_周’’,@retype=’’DBNOR’’
--为日数据库恢复准备基础数据库
exec p_RestoreDb@bkfile=@path,@dbname=’’PRODUCE_日’’,@retype=’’DBNOR’’
exec p_createjob@jobname=’每月备份’,@sql,@freqtype=’month’,@time=164000
--2.建立每周差异备份和生成周备份数据库的作业,每周日下午17:00分进行:
declare@path nvarchar(260),@fname nvarchar(100)
set@fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_w.bak’’
set@path=dbo.f_getdbpath(null)+@fname
exec p_backupdb@dbname=’’PRODUCE’’,@bkfname=@fname,@bktype=’’DF’’
exec p_backupdb@bkfile=@path,@dbname=’’PRODUCE_周’’,@retype=’’DF’’
exec p_createjob@jobname=’每周差异备份’,@sql,@freqtype=’week’,@time=170000
--3.建立每日日志备份和生成日备份数据库的作业,每周日下午17:15分进行:
declare@path nvarchar(260),@fname nvarchar(100)
set@fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_l.bak’’
set@path=dbo.f_getdbpath(null)+@fname
exec p_backupdb@dbname=’’PRODUCE’’,@bkfname=@fname,@bktype=’’LOG’’
exec p_backupdb@bkfile=@path,@dbname=’’PRODUCE_日’’,@retype=’’LOG’’
exec p_createjob@jobname=’每周差异备份’,@sql,@freqtype=’day’,@time=171500
三、备份MYSQL数据库SQL语句怎么写
mysqldump备份还原和mysqldump导入导出语句大全详解
mysqldump-u用户名-p密码-h主机数据库 a-w"sql条件"--lock-all-tables>路径
mysqldump-uroot-p1234-hlocalhost db1 a-w"id in(select id from b)"--lock-all-tables> c:\aa.txt
mysqldump-u用户名-p密码-h主机数据库<路径
mysql-uroot-p1234 db1< c:\aa.txt
mysqldump-u用户名-p密码-h主机数据库 a--where"条件语句"--no-建表>路径
mysqldump-uroot-p1234 dbname a--where"tag='88'"--no-create-info> c:\a.sql
mysqldump-u用户名-p密码-h主机数据库<路径
mysql-uroot-p1234 db1< c:\a.txt
mysqldump-u用户名-p密码-h主机数据库表
mysqldump-uroot-p sqlhk9 a--no-data
讲一下 mysqldump的一些主要参数
它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。
导出的数据采用包含字段名的完整 INSERT方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。
--default-character-set=charset
指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
告诉 mysqldump在 INSERT语句的开头和结尾增加/*!40000 ALTER TABLE table DISABLE KEYS*/;和/*!40000 ALTER TABLE table ENABLE KEYS*/;语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM表。
默认情况下,mysqldump开启--complete-insert模式,因此不想用它的的话,就使用本选项,设定它的值为 false即可。
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction和--lock-tables选项。
它和--lock-all-tables类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM表,如果是 Innodb表可以用--single-transaction选项。
只导出数据,而不添加 CREATE TABLE语句。
不导出任何数据,只导出数据库表结构。
这只是一个快捷选项,等同于同时添加--add-drop-tables--add-locking--create-option--disable-keys--extended-insert--lock-tables--quick--set-charset选项。本选项能让 mysqldump很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用--skip-opt禁用。注意,如果运行 mysqldump没有指定--quick或--opt选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。
该选项在导出大表时很有用,它强制 mysqldump从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB和 BDB。
本选项和--lock-tables选项是互斥的,因为 LOCK TABLES会使任何挂起的事务隐含提交。
要想导出大表的话,应结合使用--quick选项。
同时导出触发器。该选项默认启用,用--skip-triggers禁用它。
其他参数详情请参考手册,我通常使用以下 SQL来备份 MyISAM表:
/usr/local/mysql/bin/mysqldump-uyejr-pyejr"
--default-character-set=utf8--opt--extended-insert=false"
--triggers-R--hex-blob-x db_name> db_name.sql
/usr/local/mysql/bin/mysqldump-uyejr-pyejr"
--default-character-set=utf8--opt--extended-insert=false"
--triggers-R--hex-blob--single-transaction db_name> db_name.sql
另外,如果想要实现在线备份,还可以使用--master-data参数来实现,如下:
/usr/local/mysql/bin/mysqldump-uyejr-pyejr"
--default-character-set=utf8--opt--master-data=1"
--single-transaction--flush-logs db_name> db_name.sql
它只是在一开始的瞬间请求锁表,然后就刷新binlog了,而后在导出的文件中加入CHANGE MASTER语句来指定当前备份的binlog位置,如果要把这个文件恢复到slave里去,就可以采用这种方法来做。
用 mysqldump备份出来的文件是一个可以直接倒入的 SQL脚本,有两种方法可以将数据导入。
/usr/local/mysql/bin/mysql-uyejr-pyejr db_name< db_name.sql
用 SOURCE语法(实验不成功!!!)
其实这不是标准的 SQL语法,而是 mysql客户端提供的功能,例如:
这里需要指定文件的绝对路径,并且必须是 mysqld运行用户(例如 nobody)有权限读取的文件。
文章到此结束,如果本次分享的备份数据库的sql语句和备份数据库的SQL语句是的问题解决了您的问题,那么我们由衷的感到高兴!