备份与还原是数据库避不开的主题,而作为DBA,经常会面临将一台机器上的所有数据库重新构建到一台新机器上的要求; 在现在都讲究自动化管理的时代,传统的界面操作备份还原的做法不仅浪费时间和精力,而且还很容易出错,并且这次完成后, 下次再有这样的要求
备份与还原是数据库避不开的主题,而作为DBA,经常会面临将一台机器上的所有数据库重新构建到一台新机器上的要求;
在现在都讲究自动化管理的时代,传统的界面操作备份还原的做法不仅浪费时间和精力,而且还很容易出错,并且这次完成后,
下次再有这样的要求,必须又重头开始(估计做5次就能做得人狂吐);于是,我们需要一套应对这种频繁操作、耗时、耗精力
的通用处理方法,所以以下批处理脚本就诞生了。
脚本主要的功能:
1. 备份一个服务器上的所有数据库(当然你也可以选择),备份文件按数据库名+日期生成,以.bak 结尾;
2. 将所有的备份文件还原到一台新机器上;
3. 验证磁盘和路径的正确性;
说明:
脚本合适 SQLServer 2005 & 2008 版本;
批量备份数据库:
<span>--</span><span>---------------------------批量备份数据-------------------------------------------</span><span><br></span><span>Use</span><span> master<br></span><span>GO</span><span><br></span><span>/*</span><span>=================Usp_BackUp_DataBase========================<br> =====BackUp Sigle DataBase ======<br> =====Ken.Guo ======<br> =====2010.9.10 ======<br> =====Version: 2005 & 2008 SQL Server ======<br> =====EXEC Usp_BackUp_DataBase 'MyDB','D:\BackUp' ======<br> ============================================================<br></span><span>*/</span><span><br></span><span>CREATE</span><span>PROC</span><span>[</span><span>dbo</span><span>]</span><span>.</span><span>[</span><span>Usp_BackUp_DataBase</span><span>]</span><span>@DatabaseName</span><span>nvarchar</span><span>(</span><span>200</span><span>),</span><span>@Path</span><span>nvarchar</span><span>(</span><span>200</span><span>) <br></span><span>AS</span><span> <br> </span><span>BEGIN</span><span> <br> </span><span>DECLARE</span><span>@fn</span><span>varchar</span><span>(</span><span>200</span><span>)<br> ,</span><span>@sql</span><span>varchar</span><span>(</span><span>1000</span><span>) <br> </span><span>SET</span><span>@fn</span><span>=</span><span>@Path</span><span>+</span><span>(</span><span>case</span><span>when</span><span>right</span><span>(</span><span>@Path</span><span>,</span><span>1</span><span>) </span><span></span><span>'</span><span>\</span><span>'</span><span>then</span><span>'</span><span>\</span><span>'</span><span>else</span><span>''</span><span>end</span><span>) <br> </span><span>+</span><span>@DatabaseName</span><span>+</span><span>'</span><span>_</span><span>'</span><span> <br> </span><span>+</span><span>convert</span><span>(</span><span>char</span><span>(</span><span>8</span><span>),</span><span>getdate</span><span>(),</span><span>112</span><span>)</span><span>+</span><span>'</span><span>_</span><span>'</span><span> <br> </span><span>+</span><span>replace</span><span>(</span><span>convert</span><span>(</span><span>char</span><span>(</span><span>8</span><span>),</span><span>getdate</span><span>(),</span><span>108</span><span>),</span><span>'</span><span>:</span><span>'</span><span>,</span><span>''</span><span>) <br> </span><span>+</span><span>'</span><span>.bak</span><span>'</span><span> <br> </span><span>set</span><span>@sql</span><span>=</span><span>'</span><span>backup database </span><span>'</span><span>+</span><span>@DatabaseName</span><span>+</span><span>'</span><span> to disk = N</span><span>'''</span><span>+</span><span>@fn</span><span>+</span><span>''''</span><span> <br> </span><span>--</span><span>SELECT @sql </span><span><br></span><span>EXEC</span><span>(</span><span>@sql</span><span>) <br> </span><span>END</span><span><br><br></span><span>GO</span><span><br><br></span><span>Use</span><span> master<br></span><span>GO</span><span><br></span><span>/*</span><span>=============BackUp Mutile DataBase=========================</span><span>*/</span><span><br></span><span>DECLARE</span><span>@dbname</span><span>nvarchar</span><span>(</span><span>200</span><span>)<br> ,</span><span>@backup_path</span><span>nvarchar</span><span>(</span><span>200</span><span>)<br></span><span>SET</span><span>@backup_path</span><span>=</span><span>'</span><span>D:\BackUp\</span><span>'</span><span><br></span><span>DECLARE</span><span> db_info </span><span>CURSOR</span><span> <br> LOCAL <br> STATIC <br> READ_ONLY <br> FORWARD_ONLY <br></span><span>FOR</span><span>--</span><span>根据查询,添加其他筛选条件</span><span><br></span><span>SELECT</span><span> <br> name <br> </span><span>FROM</span><span> master.sys.databases </span><span>WITH</span><span>(NOLOCK) <br> </span><span>WHERE</span><span> <br> database_id</span><span>></span><span>4</span><span><br><br></span><span>OPEN</span><span> db_info<br></span><span>FETCH</span><span>NEXT</span><span>FROM</span><span> db_info </span><span>INTO</span><span>@dbname</span><span><br><br></span><span>WHILE</span><span>@@FETCH_STATUS</span><span>=</span><span>0</span><span><br> </span><span>begin</span><span><br> </span><span>EXEC</span><span> master.dbo.<span>Usp_BackUp_DataBase </span></span><span>@dbname</span><span>,</span><span>@backup_path</span><span><br> </span><span>FETCH</span><span>NEXT</span><span>FROM</span><span> db_info </span><span>INTO</span><span>@dbname</span><span><br> </span><span>END</span><span><br></span><span>close</span><span> db_info<br></span><span>deallocate</span><span> db_info<br><br></span><span>--</span><span>-------------------------------BackUp DataBase End------------------------------------</span>
检查还原磁盘:
<span>Use</span><span> master<br></span><span>GO</span><span><br></span><span>/*</span><span>=================Check Restore Path Drives Exists==========================<br> =====Ken.Guo ======<br> =====2010.9.10 ======<br> =====EXEC Usp_Check_DriveExists @RestoreDataPath,@ResultCount OUTPUT ======<br> ===========================================================================<br></span><span>*/</span><span><br></span><span>CREATE</span><span>PROC</span><span> Usp_Check_DriveExists(<br> </span><span>@RestoreDataPath</span><span>nvarchar</span><span>(</span><span>200</span><span>)<br> ,</span><span>@ResultCount</span><span>int</span><span> OUTPUT) <br></span><span>AS</span><span><br></span><span>BEGIN</span><span><br></span><span>--</span><span>Check Restore Path and Size >1000M</span><span><br></span><span>if</span><span>CHARINDEX</span><span>(</span><span>'</span><span>:</span><span>'</span><span>,</span><span>@RestoreDataPath</span><span>)</span><span>></span><span>0</span><span><br> </span><span>begin</span><span><br> </span><span>DECLARE</span><span>@Drive</span><span>nvarchar</span><span>(</span><span>10</span><span>)<br> ,</span><span>@errorinfo</span><span>nvarchar</span><span>(</span><span>500</span><span>)<br><br> </span><span>DECLARE</span><span>@DriveList</span><span>TABLE</span><span> <br> ( <br> Drive </span><span>nvarchar</span><span>(</span><span>10</span><span>) <br> ,DSize </span><span>bigint</span><span> <br> )<br> </span><span>INSERT</span><span>INTO</span><span>@DriveList</span><span><br> </span><span>EXEC</span><span> master.dbo.xp_fixeddrives<br><br> </span><span>SET</span><span>@Drive</span><span>=Left</span><span>(</span><span>@RestoreDataPath</span><span>,</span><span>CHARINDEX</span><span>(</span><span>'</span><span>:</span><span>'</span><span>,</span><span>@RestoreDataPath</span><span>)</span><span>-</span><span>1</span><span>)<br> </span><span>if</span><span>not</span><span>exists</span><span>(</span><span>SELECT</span><span> <br> </span><span>*</span><span> <br> </span><span>FROM</span><span>@DriveList</span><span> <br> </span><span>WHERE</span><span> <br> Drive</span><span>=</span><span>@Drive</span><span> <br> </span><span>AND</span><span> DSize</span><span>></span><span>1024</span><span><br> <br> )<br> </span><span>begin</span><span><br> </span><span>set</span><span>@errorinfo</span><span>=</span><span>N</span><span>'</span><span>找不到还原磁盘:</span><span>'</span><span>+</span><span>@Drive</span><span>+</span><span>N</span><span>'</span><span> ,或者磁盘剩余空间小于1G</span><span>'</span><span><br> </span><span>RAISERROR</span><span>50001</span><span>@errorinfo</span><span> <br> </span><span>set</span><span>@ResultCount</span><span>=</span><span>0</span><span><br> </span><span>return</span><span><br> </span><span>end</span><span><br> </span><span>end</span><span><br></span><span>else</span><span>if</span><span>(</span><span>LEN</span><span>(</span><span>@RestoreDataPath</span><span>)</span><span>></span><span>1</span><span>) </span><span>AND</span><span>CHARINDEX</span><span>(</span><span>'</span><span>:</span><span>'</span><span>,</span><span>@RestoreDataPath</span><span>)</span><span>=</span><span>0</span><span><br> </span><span>begin</span><span><br> </span><span>set</span><span>@errorinfo</span><span>=</span><span>N</span><span>'</span><span>还原路径错误:</span><span>'</span><span>+</span><span>@RestoreDataPath</span><span>+</span><span>N</span><span>'</span><span>,必须包含":" 号</span><span>'</span><span><br> </span><span>Raiserror</span><span>50001</span><span>@errorinfo</span><span> <br> </span><span>set</span><span>@ResultCount</span><span>=</span><span>0</span><span><br> </span><span>return</span><span> <br> </span><span>end</span><span><br> </span><span>set</span><span>@ResultCount</span><span>=</span><span>1</span><span><br></span><span>end</span><span><br></span><span>GO</span>
还原单个数据库:
<span>Use</span><span> master<br></span><span>GO</span><span><br></span><span>/*</span><span>=================Usp_RestoreDataBaseFormPath=======================================<br> =====Restore Single DataBase From a Back File ======<br> =====Ken.Guo ======<br> =====2010.9.10 ======<br> =====Version: 2005 & 2008 SQL Server ======<br> =====Usp_RestoreDataBaseFormPath 'D:\databack\dbcenter.bak','D:\Data',0 ======<br> =====Key Point Info: ======<br> --Restore HeaderOnly from disk='D:\data\xx.bak'<br> --Restore FileListOnly from disk='D:\data\xx.bak'<br> ===================================================================================<br></span><span>*/</span><span><br></span><span>CREATE</span><span>PROC</span><span> Usp_RestoreDataBaseFormPath<br>(</span><span>@DatabBaseBakPath</span><span>nvarchar</span><span>(</span><span>400</span><span>),<br> </span><span>@RestoreDataPath</span><span>nvarchar</span><span>(</span><span>400</span><span>)</span><span>=</span><span>''</span><span>, </span><span>--</span><span>RESTORE DATABASE PATH </span><span><br></span><span>@IsRun</span><span>smallint</span><span>=</span><span>0</span><span>--</span><span> 0 PRINT 1 run </span><span><br></span><span>) <br></span><span>AS</span><span><br></span><span>BEGIN</span><span><br></span><span>set</span><span> nocount </span><span>on</span><span><br><br></span><span>declare</span><span>@dbname</span><span>nvarchar</span><span>(</span><span>200</span><span>),</span><span>@SQL</span><span>nvarchar</span><span>(</span><span>4000</span><span>),</span><span>@DirSQL</span><span>nvarchar</span><span>(</span><span>1000</span><span>),</span><span>@errorinfo</span><span>nvarchar</span><span>(</span><span>300</span><span>)<br></span><span>--</span><span>add path \</span><span><br></span><span>if</span><span> (</span><span>@RestoreDataPath</span><span>is</span><span>not</span><span>null</span><span>) </span><span>and</span><span>len</span><span>(</span><span>@RestoreDataPath</span><span>)</span><span>></span><span>1</span><span> <br> </span><span>and</span><span> (</span><span>right</span><span>(</span><span>@RestoreDataPath</span><span>,</span><span>1</span><span>)</span><span></span><span>'</span><span>\</span><span>'</span><span>)<br> </span><span>set</span><span>@RestoreDataPath</span><span>=</span><span>@RestoreDataPath</span><span>+</span><span>'</span><span>\</span><span>'</span><span><br><br></span><span>declare</span><span>@checkdrive</span><span>int</span><span><br></span><span>set</span><span>@checkdrive</span><span>=</span><span>1</span><span><br> </span><span>exec</span><span> master.dbo.Usp_Check_DriveExists </span><span>@RestoreDataPath</span><span>,</span><span>@checkdrive</span><span> output<br><br> </span><span>if</span><span>(</span><span>@checkdrive</span><span></span><span>1</span><span>)<br> </span><span>Goto</span><span> ExitFLag <br><br></span><span>DECLARE</span><span>@BakFileList</span><span>TABLE</span><span> <br> ( LogicalName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,PhysicalName </span><span>nvarchar</span><span>(</span><span>260</span><span>)<br> )<br><br></span><span>DECLARE</span><span>@BakHeaderInfo</span><span>TABLE</span><span><br> (<br> DatabaseName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> )<br><br></span><span>if</span><span>Charindex</span><span>(</span><span>'</span><span>Microsoft SQL Server 2008</span><span>'</span><span>,</span><span>@@VERSION</span><span>)</span><span>></span><span>0</span><span><br> </span><span>begin</span><span><br> </span><span>--</span><span>SQL Server 2008 </span><span><br></span><span>DECLARE</span><span>@BakFileList2008</span><span>TABLE</span><span> <br> ( LogicalName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,PhysicalName </span><span>nvarchar</span><span>(</span><span>260</span><span>)<br> ,Type </span><span>char</span><span>(</span><span>1</span><span>)<br> ,FileGroupName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,SIZE numeric(</span><span>20</span><span>,</span><span>0</span><span>)<br> ,MaxSize numeric(</span><span>20</span><span>,</span><span>0</span><span>)<br> ,FileID </span><span>bigint</span><span><br> ,CreateLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,DropLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,UniqueID </span><span>uniqueidentifier</span><span><br> ,ReadOnlyLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,ReadWriteLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,BackupSizeInBytes </span><span>bigint</span><span><br> ,SourceBlockSize </span><span>int</span><span><br> ,FileGroupID </span><span>int</span><span><br> ,LogGroupGUID </span><span>uniqueidentifier</span><span>NULL</span><span><br> ,DifferentialBaseLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,DifferentialBaseGUID </span><span>uniqueidentifier</span><span><br> ,IsReadOnly </span><span>bit</span><span><br> ,IsPresent </span><span>bit</span><span><br> ,TDEThumbprint </span><span>varbinary</span><span>(</span><span>32</span><span>)<br> ) <br> <br> </span><span>INSERT</span><span>INTO</span><span>@BakFileList2008</span><span> <br> </span><span>EXEC</span><span> sp_executesql N</span><span>'</span><span>Restore FileListOnly From Disk=@DatabBaseBakPath</span><span>'</span><span>,N</span><span>'</span><span>@DatabBaseBakPath nvarchar(260)</span><span>'</span><span>,</span><span>@DatabBaseBakPath</span><span> <br><br> </span><span>DECLARE</span><span>@BakHeaderInfo2008</span><span>TABLE</span><span><br> (<br> BackupName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,BackupDescription </span><span>nvarchar</span><span>(</span><span>255</span><span>)<br> ,BackupType </span><span>smallint</span><span><br> ,ExpirationDate </span><span>datetime</span><span><br> ,Compressed </span><span>tinyint</span><span><br> ,POSITION </span><span>smallint</span><span><br> ,DeviceType </span><span>tinyint</span><span><br> ,UserName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,ServerName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,DatabaseName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,DatabaseVersion </span><span>int</span><span><br> ,DatabaseCreationDate </span><span>datetime</span><span><br> ,BackupSize numeric(</span><span>20</span><span>,</span><span>0</span><span>)<br> ,FirstLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,LastLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,CheckpointLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,DatabaseBackupLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,BackupStartDate </span><span>datetime</span><span><br> ,BackupFinishDate </span><span>datetime</span><span><br> ,SortOrder </span><span>smallint</span><span><br> ,CodePage </span><span>smallint</span><span><br> ,UnicodeLocaleId </span><span>int</span><span><br> ,UnicodeComparisonStyle </span><span>int</span><span><br> ,CompatibilityLevel </span><span>tinyint</span><span><br> ,SoftwareVendorId </span><span>int</span><span><br> ,SoftwareVersionMajor </span><span>int</span><span><br> ,SoftwareVersionMinor </span><span>int</span><span><br> ,SoftwareVersionBuild </span><span>int</span><span><br> ,MachineName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,Flags </span><span>int</span><span><br> ,BindingID </span><span>uniqueidentifier</span><span><br> ,RecoveryForkID </span><span>uniqueidentifier</span><span><br> ,COLLATION </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,FamilyGUID </span><span>uniqueidentifier</span><span><br> ,HasBulkLoggedData </span><span>bit</span><span><br> ,IsSnapshot </span><span>bit</span><span><br> ,IsReadOnly </span><span>bit</span><span><br> ,IsSingleUser </span><span>bit</span><span><br> ,HasBackupChecksums </span><span>bit</span><span><br> ,IsDamaged </span><span>bit</span><span><br> ,BeginsLogChain </span><span>bit</span><span><br> ,HasIncompleteMetaData </span><span>bit</span><span><br> ,IsForceOffline </span><span>bit</span><span><br> ,IsCopyOnly </span><span>bit</span><span><br> ,FirstRecoveryForkID </span><span>uniqueidentifier</span><span><br> ,ForkPointLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,RecoveryModel </span><span>nvarchar</span><span>(</span><span>60</span><span>)<br> ,DifferentialBaseLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,DifferentialBaseGUID </span><span>uniqueidentifier</span><span><br> ,BackupTypeDescription </span><span>nvarchar</span><span>(</span><span>60</span><span>)<br> ,BackupSetGUID </span><span>uniqueidentifier</span><span>NULL</span><span><br> ,CompressedBackupSize numeric(</span><span>20</span><span>,</span><span>0</span><span>)<br> ) <br><br> </span><span>INSERT</span><span>INTO</span><span>@BakHeaderInfo2008</span><span> <br> </span><span>EXEC</span><span> sp_executesql N</span><span>'</span><span>Restore HeaderOnly From Disk=@DatabBaseBakPath</span><span>'</span><span>,N</span><span>'</span><span>@DatabBaseBakPath nvarchar(260)</span><span>'</span><span>,</span><span>@DatabBaseBakPath</span><span> <br> <br> </span><span>insert</span><span>into</span><span>@BakHeaderInfo</span><span>(DatabaseName)<br> </span><span>select</span><span> DatabaseName </span><span>from</span><span>@BakHeaderInfo2008</span><span><br><br> </span><span>insert</span><span>into</span><span>@BakFileList</span><span>(LogicalName ,PhysicalName)<br> </span><span>select</span><span> LogicalName ,PhysicalName </span><span>from</span><span>@BakFileList2008</span><span><br> </span><span>end</span><span><br></span><span>else</span><span><br> </span><span>begin</span><span><br> </span><span>--</span><span>SQL Server 2005 </span><span><br></span><span>DECLARE</span><span>@BakFileList2005</span><span>TABLE</span><span> <br> (<br> LogicalName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,PhysicalName </span><span>nvarchar</span><span>(</span><span>260</span><span>)<br> ,Type </span><span>char</span><span>(</span><span>1</span><span>)<br> ,FileGroupName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,SIZE numeric(</span><span>20</span><span>,</span><span>0</span><span>)<br> ,MaxSize numeric(</span><span>20</span><span>,</span><span>0</span><span>)<br> ,FileID </span><span>bigint</span><span><br> ,CreateLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,DropLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,UniqueID </span><span>uniqueidentifier</span><span><br> ,ReadOnlyLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,ReadWriteLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,BackupSizeInBytes </span><span>bigint</span><span><br> ,SourceBlockSize </span><span>int</span><span><br> ,FileGroupID </span><span>int</span><span><br> ,LogGroupGUID </span><span>uniqueidentifier</span><span>NULL</span><span><br> ,DifferentialBaseLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,DifferentialBaseGUID </span><span>uniqueidentifier</span><span><br> ,IsReadOnly </span><span>bit</span><span><br> ,IsPresent </span><span>bit</span><span><br> ) <br><br> </span><span>INSERT</span><span>INTO</span><span>@BakFileList2005</span><span> <br> </span><span>EXEC</span><span> sp_executesql N</span><span>'</span><span>Restore FileListOnly From Disk=@DatabBaseBakPath</span><span>'</span><span>,N</span><span>'</span><span>@DatabBaseBakPath nvarchar(260)</span><span>'</span><span>,</span><span>@DatabBaseBakPath</span><span> <br> <br> </span><span>DECLARE</span><span>@BakHeaderInfo2005</span><span>TABLE</span><span> <br> (<br> BackupName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,BackupDescription </span><span>nvarchar</span><span>(</span><span>255</span><span>)<br> ,BackupType </span><span>smallint</span><span><br> ,ExpirationDate </span><span>datetime</span><span><br> ,Compressed </span><span>tinyint</span><span><br> ,POSITION </span><span>smallint</span><span><br> ,DeviceType </span><span>tinyint</span><span><br> ,UserName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,ServerName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,DatabaseName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,DatabaseVersion </span><span>int</span><span><br> ,DatabaseCreationDate </span><span>datetime</span><span><br> ,BackupSize numeric(</span><span>20</span><span>,</span><span>0</span><span>)<br> ,FirstLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,LastLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,CheckpointLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,DatabaseBackupLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>)<br> ,BackupStartDate </span><span>datetime</span><span><br> ,BackupFinishDate </span><span>datetime</span><span><br> ,SortOrder </span><span>smallint</span><span><br> ,CodePage </span><span>smallint</span><span><br> ,UnicodeLocaleId </span><span>int</span><span><br> ,UnicodeComparisonStyle </span><span>int</span><span><br> ,CompatibilityLevel </span><span>tinyint</span><span><br> ,SoftwareVendorId </span><span>int</span><span><br> ,SoftwareVersionMajor </span><span>int</span><span><br> ,SoftwareVersionMinor </span><span>int</span><span><br> ,SoftwareVersionBuild </span><span>int</span><span><br> ,MachineName </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,Flags </span><span>int</span><span><br> ,BindingID </span><span>uniqueidentifier</span><span><br> ,RecoveryForkID </span><span>uniqueidentifier</span><span><br> ,COLLATION </span><span>nvarchar</span><span>(</span><span>128</span><span>)<br> ,FamilyGUID </span><span>uniqueidentifier</span><span><br> ,HasBulkLoggedData </span><span>bit</span><span><br> ,IsSnapshot </span><span>bit</span><span><br> ,IsReadOnly </span><span>bit</span><span><br> ,IsSingleUser </span><span>bit</span><span><br> ,HasBackupChecksums </span><span>bit</span><span><br> ,IsDamaged </span><span>bit</span><span><br> ,BeginsLogChain </span><span>bit</span><span><br> ,HasIncompleteMetaData </span><span>bit</span><span><br> ,IsForceOffline </span><span>bit</span><span><br> ,IsCopyOnly </span><span>bit</span><span><br> ,FirstRecoveryForkID </span><span>uniqueidentifier</span><span><br> ,ForkPointLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,RecoveryModel </span><span>nvarchar</span><span>(</span><span>60</span><span>)<br> ,DifferentialBaseLSN numeric(</span><span>25</span><span>,</span><span>0</span><span>) </span><span>NULL</span><span><br> ,DifferentialBaseGUID </span><span>uniqueidentifier</span><span><br> ,BackupTypeDescription </span><span>nvarchar</span><span>(</span><span>60</span><span>)<br> ,BackupSetGUID </span><span>uniqueidentifier</span><span>NULL</span><span><br> ) <br><br> </span><span>INSERT</span><span>INTO</span><span>@BakHeaderInfo2005</span><span> <br> </span><span>EXEC</span><span> sp_executesql N</span><span>'</span><span>Restore HeaderOnly From Disk=@DatabBaseBakPath</span><span>'</span><span>,N</span><span>'</span><span>@DatabBaseBakPath nvarchar(260)</span><span>'</span><span>,</span><span>@DatabBaseBakPath</span><span> <br><br> </span><span>insert</span><span>into</span><span>@BakHeaderInfo</span><span>(DatabaseName)<br> </span><span>select</span><span> DatabaseName </span><span>from</span><span>@BakHeaderInfo2005</span><span><br><br> </span><span>insert</span><span>into</span><span>@BakFileList</span><span>(LogicalName ,PhysicalName)<br> </span><span>select</span><span> LogicalName ,PhysicalName </span><span>from</span><span>@BakFileList2005</span><span><br><br> </span><span>end</span><span><br><br></span><span>--</span><span>Check back file info</span><span><br></span><span>if</span><span>not</span><span>exists</span><span> (</span><span>select</span><span>1</span><span>from</span><span>@BakFileList</span><span>) </span><span>OR</span><span>not</span><span>exists</span><span> (</span><span>select</span><span>1</span><span>from</span><span>@BakHeaderInfo</span><span>)<br> </span><span>begin</span><span><br> </span><span>set</span><span>@errorinfo</span><span>=</span><span>N</span><span>'</span><span>取不到备份文件:</span><span>'</span><span>+</span><span>@DatabBaseBakPath</span><span>+</span><span>N</span><span>'</span><span> 的信息,请检查备份文件是否正确或者版本是否兼容</span><span>'</span><span><br> </span><span>Raiserror</span><span>50001</span><span>@errorinfo</span><span> <br> </span><span>Goto</span><span> ExitFLag<br> </span><span>end</span><span><br><br></span><span>--</span><span>Get DataBase Name</span><span><br></span><span>SELECT</span><span>TOP</span><span>1</span><span>@dbname</span><span>=</span><span>databasename </span><span>FROM</span><span>@BakHeaderInfo</span><span><br><br></span><span>if</span><span>exists</span><span> (</span><span>select</span><span>1</span><span>from</span><span> master.sys.databases </span><span>with</span><span>(nolock) </span><span>where</span><span> name</span><span>=</span><span>@dbname</span><span>)<br> </span><span>begin</span><span><br> <br> </span><span>set</span><span>@errorinfo</span><span>=</span><span>N</span><span>'</span><span>数据库:</span><span>'</span><span>+</span><span>@dbname</span><span>+</span><span>N</span><span>'</span><span>已经存在,不能还原</span><span>'</span><span> <br> </span><span>Raiserror</span><span>50001</span><span>@errorinfo</span><span> <br> </span><span>Goto</span><span> ExitFLag<br> </span><span>end</span><span><br><br></span><span>DECLARE</span><span>@LogicalName</span><span>nvarchar</span><span>(</span><span>200</span><span>),</span><span>@PhysicalName</span><span>nvarchar</span><span>(</span><span>400</span><span>)<br> ,</span><span>@pos</span><span>int</span><span> ,</span><span>@endpos</span><span>int</span><span>,</span><span>@LastPhysicalName</span><span>nvarchar</span><span>(</span><span>400</span><span>)<br><br></span><span>DECLARE</span><span> db_file </span><span>CURSOR</span><span> <br> LOCAL <br> READ_ONLY <br> FORWARD_ONLY <br> STATIC <br></span><span>FOR</span><span><br> </span><span>SELECT</span><span> <br> LogicalName<br> ,PhysicalName <br> </span><span>FROM</span><span>@BakFileList</span><span><br><br></span><span>OPEN</span><span> db_file<br><br></span><span>set</span><span>@DirSQL</span><span>=</span><span>''</span><span><br></span><span>set</span><span>@SQL</span><span>=+</span><span>N</span><span>'</span><span>RESTORE DATABASE </span><span>'</span><span>+</span><span>QUOTENAME</span><span>(</span><span>@dbname</span><span>)</span><span>+</span><span>'</span><span> from disk=N</span><span>'''</span><span>+</span><span>@DatabBaseBakPath</span><span>+</span><span>''''</span><span><br></span><span>set</span><span>@SQL</span><span>=</span><span>@SQL</span><span>+</span><span>char</span><span>(</span><span>13</span><span>)</span><span>+</span><span>Char</span><span>(</span><span>10</span><span>)</span><span>+</span><span>N</span><span>'</span><span> WITH FILE=1 </span><span>'</span><span><br><br></span><span>FETCH</span><span>NEXT</span><span>FROM</span><span> db_file </span><span>INTO</span><span>@LogicalName</span><span>,</span><span>@PhysicalName</span><span><br><br></span><span>WHILE</span><span>@@FETCH_STATUS</span><span>=</span><span>0</span><span><br> </span><span>begin</span><span><br> </span><span>--</span><span>-Get DB PhysicalName</span><span><br></span><span>set</span><span>@endpos</span><span>=</span><span>0</span><span><br> </span><span>while</span><span>CHARINDEX</span><span>(</span><span>'</span><span>\</span><span>'</span><span>,</span><span>@PhysicalName</span><span>)</span><span>></span><span>0</span><span><br> </span><span>begin</span><span><br> </span><span>set</span><span>@pos</span><span>=</span><span>CHARINDEX</span><span>(</span><span>'</span><span>\</span><span>'</span><span>,</span><span>@PhysicalName</span><span>,</span><span>@endpos</span><span>)<br> </span><span>if</span><span>(</span><span>@pos</span><span>=</span><span>0</span><span>)<br> </span><span>break</span><span>;<br> </span><span>set</span><span>@endpos</span><span>=</span><span>@pos</span><span>+</span><span>1</span><span>;<br> </span><span>end</span><span><br> <br> </span><span>--</span><span>create new db path</span><span><br></span><span>if</span><span>(</span><span>len</span><span>(</span><span>@RestoreDataPath</span><span>)</span><span>></span><span>1</span><span>)<br> </span><span>begin</span><span><br> </span><span>set</span><span>@PhysicalName</span><span>=</span><span>@RestoreDataPath</span><span>+</span><span>@dbname</span><span>+</span><span>'</span><span>\</span><span>'</span><span>+</span><span>SUBSTRING</span><span>(</span><span>@PhysicalName</span><span>,</span><span>@endpos</span><span>,</span><span>LEN</span><span>(</span><span>@PhysicalName</span><span>)</span><span>-</span><span>@endpos</span><span>+</span><span>1</span><span>)<br> </span><span>set</span><span>@DirSQL</span><span>=</span><span>N</span><span>'</span><span>EXEC master.sys.xp_create_subdir N</span><span>'''</span><span>+</span><span>@RestoreDataPath</span><span>+</span><span>@dbname</span><span>+</span><span>''''</span><span><br> </span><span>END</span><span><br> </span><span>else</span><span><br> </span><span>begin</span><span><br> </span><span>if</span><span>len</span><span>(</span><span>@DirSQL</span><span>)</span><span><span>1</span><span>OR</span><span> (</span><span>SUBSTRING</span><span>(</span><span>@PhysicalName</span><span>,</span><span>1</span><span>,</span><span>@endpos</span><span>-</span><span>1</span><span>)</span><span></span><span>@LastPhysicalName</span><span>)<br> </span><span>if</span><span>(</span><span>len</span><span>(</span><span>@DirSQL</span><span>)</span><span><span>1</span><span>)<br> </span><span>set</span><span>@DirSQL</span><span>=</span><span>N</span><span>'</span><span>EXEC master.sys.xp_create_subdir N</span><span>'''</span><span>+</span><span>SUBSTRING</span><span>(</span><span>@PhysicalName</span><span>,</span><span>1</span><span>,</span><span>@endpos</span><span>-</span><span>1</span><span>)</span><span>+</span><span>''''</span><span><br> </span><span>else</span><span><br> </span><span>set</span><span>@DirSQL</span><span>=</span><span>@DirSQL</span><span>+</span><span>char</span><span>(</span><span>13</span><span>)</span><span>+</span><span>N</span><span>'</span><span>EXEC master.sys.xp_create_subdir N</span><span>'''</span><span>+</span><span>SUBSTRING</span><span>(</span><span>@PhysicalName</span><span>,</span><span>1</span><span>,</span><span>@endpos</span><span>-</span><span>1</span><span>)</span><span>+</span><span>''''</span><span><br> <br> </span><span>--</span><span>-Check Drives</span><span><br></span><span>set</span><span>@checkdrive</span><span>=</span><span>1</span><span><br> </span><span>exec</span><span> master.dbo.Usp_Check_DriveExists </span><span>@PhysicalName</span><span>,</span><span>@checkdrive</span><span> output<br><br> </span><span>if</span><span>(</span><span>@checkdrive</span><span></span><span>1</span><span>)<br> </span><span>Goto</span><span> ExitFLag <br><br> </span><span>set</span><span>@LastPhysicalName</span><span>=</span><span>SUBSTRING</span><span>(</span><span>@PhysicalName</span><span>,</span><span>1</span><span>,</span><span>@endpos</span><span>-</span><span>1</span><span>);<br> </span><span>END</span><span><br> <br> </span><span>set</span><span>@SQL</span><span>=</span><span>@SQL</span><span>+</span><span>char</span><span>(</span><span>13</span><span>)</span><span>+</span><span>Char</span><span>(</span><span>10</span><span>)</span><span>+</span><span>N</span><span>'</span><span> ,Move N</span><span>'''</span><span>+</span><span>@LogicalName</span><span>+</span><span>''''</span><span>+</span><span>'</span><span> TO N</span><span>'''</span><span>+</span><span>@PhysicalName</span><span>+</span><span>''''</span><span><br> <br> </span><span>FETCH</span><span>NEXT</span><span>FROM</span><span> db_file </span><span>INTO</span><span>@LogicalName</span><span>,</span><span>@PhysicalName</span><span><br> </span><span>end</span><span><br> </span><span>set</span><span>@SQL</span><span>=</span><span>@SQL</span><span>+</span><span>char</span><span>(</span><span>13</span><span>)</span><span>+</span><span>Char</span><span>(</span><span>10</span><span>)</span><span>+</span><span>N</span><span>'</span><span> ,NOUNLOAD,Recovery,STATS = 10</span><span>'</span><span><br><br></span><span>if</span><span>(</span><span>@IsRun</span><span>=</span><span>0</span><span>)<br> </span><span>print</span><span>( </span><span>@DirSQL</span><span>+</span><span>char</span><span>(</span><span>13</span><span>)</span><span>+</span><span>char</span><span>(</span><span>10</span><span>)</span><span>+</span><span>'</span><span>GO</span><span>'</span><span>+</span><span>char</span><span>(</span><span>13</span><span>)</span><span>+</span><span>Char</span><span>(</span><span>10</span><span>)</span><span>+</span><span>@SQL</span><span>+</span><span>char</span><span>(</span><span>13</span><span>))<br></span><span>else</span><span><br> </span><span>begin</span><span><br> </span><span>print</span><span>(</span><span>'</span><span>-----------Begin Restore Database:</span><span>'</span><span>+</span><span>@dbname</span><span>+</span><span>'</span><span>------------------</span><span>'</span><span>)<br> </span><span>exec</span><span>(</span><span>@DirSQL</span><span>)<br> </span><span>exec</span><span>(</span><span>@SQL</span><span>)<br> </span><span>print</span><span>(</span><span>'</span><span>-----------End Restore Database:</span><span>'</span><span>+</span><span>@dbname</span><span>+</span><span>'</span><span>---------------------</span><span>'</span><span>+</span><span>char</span><span>(</span><span>13</span><span>))<br> </span><span>end</span><span><br><br> </span><span>close</span><span> db_file<br> </span><span>deallocate</span><span> db_file<br><br>ExitFLag:<br></span><span>set</span><span> nocount </span><span>off</span><span><br></span><span>end</span></span></span>
批量还原数据库:
<span>Use</span><span> master<br></span><span>GO</span><span><br></span><span>/*</span><span>=================Usp_RestoreMuiteDataBaseFromPath========================<br> =====Restore Mutite DataBase File From a Path ======<br> =====Ken.Guo ======<br> =====2010.9.10 ======<br> =====Version: 2005 & 2008 SQL Server ======<br> =====EXEC Usp_RestoreMuiteDataBaseFromPath 'D:\databack','',0 ======<br> =========================================================================<br></span><span>*/</span><span><br></span><span>CREATE</span><span>PROC</span><span> Usp_RestoreMuiteDataBaseFromPath<br>( </span><span>@DatabBaseBakPath</span><span>nvarchar</span><span>(</span><span>400</span><span>)<br> ,</span><span>@RestoreDataPath</span><span>nvarchar</span><span>(</span><span>400</span><span>)</span><span>=</span><span>''</span><span>--</span><span>RESTORE DATABASE PATH </span><span><br></span><span> ,</span><span>@IsRun</span><span>smallint</span><span>=</span><span>0</span><span>--</span><span> 0 PRINT 1 run </span><span><br></span><span>) <br></span><span>AS</span><span><br></span><span>BEGIN</span><span><br></span><span>set</span><span> nocount </span><span>on</span><span><br></span><span>DECLARE</span><span>@BackUpFileName</span><span>nvarchar</span><span>(</span><span>200</span><span>) <br> ,</span><span>@DbName</span><span>nvarchar</span><span>(</span><span>200</span><span>) <br> ,</span><span>@errorinfo</span><span>nvarchar</span><span>(</span><span>400</span><span>)<br><br></span><span>IF</span><span>not</span><span>exists</span><span>(</span><span>SELECT</span><span>1</span><span> <br> </span><span>FROM</span><span> master.sys.procedures </span><span>WITH</span><span>(NOLOCK) <br> </span><span>WHERE</span><span> <br> name</span><span>=</span><span>N</span><span>'</span><span>Usp_RestoreDataBaseFormPath</span><span>'</span><span> <br> <br> )<br> </span><span>begin</span><span><br> </span><span>Raiserror</span><span>50001</span><span> N</span><span>'</span><span>找不到存储过程SP_RestoreDataBaseFormPath </span><span>'</span><span> <br> </span><span>Goto</span><span> ExitFLag<br> </span><span>end</span><span><br><br></span><span>--</span><span>add path \</span><span><br></span><span>if</span><span> (</span><span>@DatabBaseBakPath</span><span>is</span><span>not</span><span>null</span><span>) </span><span>and</span><span>len</span><span>(</span><span>@DatabBaseBakPath</span><span>)</span><span>></span><span>1</span><span> <br> </span><span>and</span><span> (</span><span>right</span><span>(</span><span>@DatabBaseBakPath</span><span>,</span><span>1</span><span>)</span><span></span><span>'</span><span>\</span><span>'</span><span>)<br> </span><span>set</span><span>@DatabBaseBakPath</span><span>=</span><span>@DatabBaseBakPath</span><span>+</span><span>'</span><span>\</span><span>'</span><span><br><br></span><span>--</span><span>Check Restore Path and Size >1000M</span><span><br></span><span>DECLARE</span><span>@checkdrive</span><span>int</span><span><br></span><span>SET</span><span>@checkdrive</span><span>=</span><span>1</span><span><br> </span><span>EXEC</span><span> master.dbo.Usp_Check_DriveExists </span><span>@RestoreDataPath</span><span>,</span><span>@checkdrive</span><span> OUTPUT<br><br> </span><span>IF</span><span>(</span><span>@checkdrive</span><span></span><span>1</span><span>)<br> </span><span>Goto</span><span> ExitFLag <br> <br></span><span>DECLARE</span><span>@Dir</span><span>TABLE</span><span> <br>( <br> BackDBFileName </span><span>nvarchar</span><span>(</span><span>100</span><span>) <br> ,DEPTH </span><span>int</span><span> <br> ,</span><span>[</span><span>File</span><span>]</span><span>int</span><span> <br>)<br><br></span><span>INSERT</span><span>INTO</span><span>@Dir</span><span>EXEC</span><span> xp_dirtree </span><span>@DatabBaseBakPath</span><span><br> ,</span><span>1</span><span><br> ,</span><span>1</span><span><br><br></span><span>DELETE</span><span>FROM</span><span>@Dir</span><span> <br></span><span>WHERE</span><span>charindex</span><span>(</span><span>'</span><span>.bak</span><span>'</span><span>,BackDBFileName)</span><span>=</span><span>0</span><span><br><br></span><span>if</span><span>not</span><span>exists</span><span> (</span><span>select</span><span>top</span><span>1</span><span>1</span><span>from</span><span>@Dir</span><span>)<br> </span><span>begin</span><span><br> </span><span>Raiserror</span><span>50001</span><span> N</span><span>'</span><span>在提供的路径下没有找到合符要求的备份文件</span><span>'</span><span> <br> </span><span>Goto</span><span> ExitFLag<br> </span><span>end</span><span><br><br></span><span>declare</span><span> db_file </span><span>Cursor</span><span> Local Static Read_Only Forward_Only<br></span><span>for</span><span><br></span><span>select</span><span> BackDBFileName </span><span>from</span><span>@Dir</span><span><br><br></span><span>Open</span><span> db_file<br></span><span>Fetch</span><span>Next</span><span>from</span><span> db_file </span><span>into</span><span>@BackUpFileName</span><span><br></span><span>while</span><span>@@FETCH_STATUS</span><span>=</span><span>0</span><span><br> </span><span>begin</span><span><br> </span><span>--</span><span>Restore DataBase</span><span><br></span><span>set</span><span>@BackUpFileName</span><span>=</span><span>@DatabBaseBakPath</span><span>+</span><span>@BackUpFileName</span><span><br> </span><span>exec</span><span> master.dbo.Usp_RestoreDataBaseFormPath </span><span>@BackUpFileName</span><span>,</span><span>@RestoreDataPath</span><span>,</span><span>@IsRun</span><span><br> </span><span>Fetch</span><span>Next</span><span>from</span><span> db_file </span><span>into</span><span>@BackUpFileName</span><span><br> </span><span>end</span><span><br></span><span>Close</span><span> db_file<br></span><span>deallocate</span><span> db_file<br><br>ExitFLag:<br></span><span>set</span><span> nocount </span><span>off</span><span><br></span><span>end</span>

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL是一个开源的关系型数据库管理系统,适用于数据存储、管理、查询和安全。1.它支持多种操作系统,广泛应用于Web应用等领域。2.通过客户端-服务器架构和不同存储引擎,MySQL高效处理数据。3.基本用法包括创建数据库和表,插入、查询和更新数据。4.高级用法涉及复杂查询和存储过程。5.常见错误可通过EXPLAIN语句调试。6.性能优化包括合理使用索引和优化查询语句。

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

InnoDB的锁机制包括共享锁、排他锁、意向锁、记录锁、间隙锁和下一个键锁。1.共享锁允许事务读取数据而不阻止其他事务读取。2.排他锁阻止其他事务读取和修改数据。3.意向锁优化锁效率。4.记录锁锁定索引记录。5.间隙锁锁定索引记录间隙。6.下一个键锁是记录锁和间隙锁的组合,确保数据一致性。

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。 1.没有索引导致查询缓慢,添加索引后可显着提升性能。 2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。 3.重构表结构和优化JOIN条件可改善表设计问题。 4.数据量大时,采用分区和分表策略。 5.高并发环境下,优化事务和锁策略可减少锁竞争。

在数据库优化中,应根据查询需求选择索引策略:1.当查询涉及多个列且条件顺序固定时,使用复合索引;2.当查询涉及多个列但条件顺序不固定时,使用多个单列索引。复合索引适用于优化多列查询,单列索引则适合单列查询。

要优化MySQL慢查询,需使用slowquerylog和performance_schema:1.启用slowquerylog并设置阈值,记录慢查询;2.利用performance_schema分析查询执行细节,找出性能瓶颈并优化。

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载
最流行的的开源编辑器

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器