㈠ 数据库还原缓慢
你先把原来的那个数据库分离掉,把MDF和LDF文件移到其它文件夹,然后创建个新的同名空数据库,然后再强制还原,另外还原时请不要退出远程登录,要等完成后才退出。
㈡ 当数据库变慢时的解决方法有哪些
我们使用电脑和手机时候最不能忍受就是设备又卡又慢了,严重影响我们工作或者游戏体验。当数据库变慢时,我们应如何入手,下面的解决方法。
方法步骤
第一章 检查系统的状态
1.1 使用sar来检查操作系统是否存在IO问题
1.2 关注内存vmstat
1.3 找到使用资源特别大的Oracle的session及其执行的语句
1.4 查找前十条性能差的sql语句
当数据库变慢时,我们应如何入手
当应用管理员通告现在应用很慢、数据库很慢时,当Oracle DBA在数据库上做几个示例的Select也发现同样的问题时,有些时侯就会无从下手,因为DBA认为数据库的各种命种率都是满足Oracle文档的建议。实际上如今的优化己经向优化等待(waits)转型了,实际中性能优化最根本的出现点也都集中在I/O,这是影响性能最主要的方面,由系统中的等待去发现Oracle库中的不足、操作系统某些资源利用的不合理是一个比较好的办法。下面把一些实践经验与大家分享,本文测重于Unix环境。
第一章 检查系统的状态
通过操作系统的一些工具检查系统的状态,比如CPU、内存、交换、磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状态,因为cpu可能正等待IO的完成。除此之外,还应观注那些占用系统资源(cpu、内存)的进程。
1.1 使用sar来检查操作系统是否存在IO问题
#sar -u 2 10 -- 即每隔2秒检察一次,共执行20次。
结果示例:
注:在redhat下,%system就是所谓的%wio。
Linux 2.4.21-20.ELsmp (YY075) 05/19/2005
10:36:07 AM CPU %user %nice %system %idle
10:36:09 AM all 0.00 0.00 0.13 99.87
10:36:11 AM all 0.00 0.00 0.00 100.00
10:36:13 AM all 0.25 0.00 0.25 99.49
10:36:15 AM all 0.13 0.00 0.13 99.75
10:36:17 AM all 0.00 0.00 0.00 100.00
其中:
Ø %usr指的是用户进程使用的cpu资源的百分比;
Ø %sys指的是系统资源使用cpu资源的百分比;
Ø %wio指的是等待io完成的百分比,这是值得观注的一项;
Ø %idle即空闲的百分比。
如果wio列的值很大,如在35%以上,说明系统的IO存在瓶颈,CPU花费了很大的时间去等待I/O的完成。Idle很小说明系统CPU很忙。像以上的示例,可以看到wio平均值为11,说明I/O没什么特别的问题,而idle值为零,说明cpu已经满负荷运行了。
当系统存在IO问题时,可以从以下几个方面解决:
Ø 联系相应的操作系统的技术支持对这方面进行优化,比如hp-ux在划定卷组时的条带化等方面。
Ø 查找Oracle中不合理的sql语句,对其进行优化;
Ø 对Oracle中访问量频繁的表除合理建索引外,再就是把这些表分表空间存放以免访问上产生热点,再有就是对表合理分区。
1.2 关注内存
常用的工具便是vmstat,对于hp-unix来说,可以用glance。Aix来说可以用topas。当发现vmstat中pi列非零,memory中的free列的值很小,glance、topas中内存的利用率多于80%时,这时说明内存方面应该调节一下。方法大体有以下几项:
Ø 划给Oracle使用的内存不要超过系统内存的1/2,一般保在系统内存的40%为益。
Ø 为系统增加内存;
Ø 如果你的连接特别多,可以使用MTS的方式;
Ø 打全补丁,防止内存漏洞。
1.3 找到使用资源特别大的Oracle的session及其执行的语句
Hp-unix可以用glance或top。IBM AIX可以用topas。此外可以使用ps的命令。
通过这些程序可以找到点用系统资源特别大的这些进程的进程号,就可以通过以下的sql语句发现这个pid正在执行哪个sql,这个sql最好在pl/sql developer、toad等软件中执行:
SELECT a.username, a.machine, a.program, a.sid, a.serial#, a.status,
c.piece, c.sql_text
FROM v$session a, v$process b, v$sqltext c
WHERE b.spid = 'ORCL'
AND b.addr = a.paddr
AND a.sql_address = c.address(+)
ORDER BY c.piece;
可以把得到的这个sql分析一下,看一下它的执行计划是否走索引。对其优化避免全表扫描,以减少IO等待,从而加快语句的执行速度。
提示:在做优化sql时,经常碰到使用in的语句,这时一定要用exists把它给换掉,因为Oracle在处理In时是按Or的方式做的,即使使用了索引也会很慢。比如:
SELECT col1, col2, col3 FROM table1 a
WHERE a.col1 NOT IN (SELECT col1 FROM table2)
可以换成:
SELECT col1, col2, col3 FROM table1 a
WHERE NOT EXISTS
(SELECT 'x' FROM table2 b WHERE a.col1=b.col1)
1.4 查找前十条性能差的sql语句
SELECT * FROM (SELECT parsing_user_id, executions, sorts, command_type,
disk_reads, sql_text FROM v$sqlarea
ORDER BY disk_reads DESC)
WHERE ROWNUM<10;
第二章 检查会话状态
要快速发现Oracle Server的性能问题的原因,可以求助于v$session_wait视图,看系统的这些session在等什么,使用了多少的IO。以下是参考脚本:
-- 脚本说明:查看占I/O较大的正在运行的session:
SELECT se.sid, se.serial#, pr.spid, se.username, se.status, se.terminal,
se.program, se.mole, se.sql_address, st.event, st.p1text,
si.physical_reads, si.block_changes
FROM v$session se, v$session_wait st, v$sess_io si, v$process pr
WHERE st.sid=se.sid AND st.sid=si.sid
AND se.PADDR=pr.ADDR
AND se.sid>6
AND st.wait_time=0
AND st.event NOT LIKE '%SQL%'
ORDER BY physical_reads DESC;
对检索出的结果的几点说明:
1. 以上是按每个正在等待的session已经发生的物理读排的序,因为它与实际的I/O相关。
2. 可以看一下这些等待的进程都在忙什么,语句是否合理?
SELECT sql_address FROM v$session WHERE sid=;
SELECT * FROM v$sqltext WHERE address=;
执行以上两个语句便可以得到这个session的语句。
也以用alter system kill session 'sid, serial#';把这个session杀掉。
3. 应观注一下event列,这是调优的关键一列,下面对常出现的event做以简要的说明:
1) buffer busy waits,free buffer waits这两个参数所标识是dbwr是否够用的问题,与IO很大相关的,当v$session_wait中的free buffer wait的条目很小或没有时,说明系统的dbwr进程决对够用,不用调整;free buffer wait的条目很多,系统感觉起来一定很慢,这时说明dbwr已经不够用了,它产生的wio已经成为数据库性能的瓶颈,这时的解决办法如下:
Ø 增加写进程,同时要调整db_block_lru_latches参数:
示例:修改或添加如下两个参数
db_writer_processes=4
db_block_lru_latches=8
Ø 开异步IO。IBM这方面简单得多,hp则麻烦一些,可以与Hp工程师联系。
2) db file sequential read,指的是顺序读,即全表扫描,这也是应尽量减少的部分,解决方法就是使用索引、sql调优,同时可以增大db_file_multiblock_read_count这个参数。
3) db file scattered read参数指的是通过索引来读取,同样可以通过增加db_file_multiblock_read_count这个参数来提高性能。
4) latch free与栓相关,需要专门调节。
5) 其他参数可以不特别观注
补充:解决系统变慢的常用技巧方法
1、在我的电脑窗口,右击要清理的盘符―“属性”―“清理磁盘”--勾选要删除的文件--确定--是。
2、右键浏览器e――属性――点2个删除1个清除(都要逐一确定)――确定 。
3、把C:WINDOWSPrefetch(预读文件)把里面的文件全部删除
4、用优化大师或超级兔子清理注册表和垃圾文件。
5、“开始”――运行中输入msconfig――确定――启动――除了输入法ctfmon以外的勾全去掉。
6、右键我的电脑”――属性――点高级――点启动和故障恢复中的设置――去掉所有的勾――写入调试信息选择“无”――确定――点高级下面错误报告――点禁用――2次确定。
7、“开始”..打开控制面板中的文件夹选项..点查看..点去末项自动搜索文件夹前面的勾..确定。
8、右键我的电脑――属性――硬件――设备管理器――双击IDE控制器――次要通道――高级设置――传送模式都选DMA――设备类型选无――确定――主要通道也同样设置――确定。
9、右键C盘进行磁盘清理和其它选项中的系统还原清理。
㈢ SQL SERVER 2005 紧急状态下的mdf数据库恢复。需要花多少时间 数据库大小150G
你这个大的库文件,看样子很多数据。一般2G恢复需要3小时。
但是必须是配置比较高端的机器。不要有其他进程影响。有的话估计会更慢。
你的数据太多太大了。估计至少3天。
㈣ mysql还原数据库 怎么最快
经过分析发现,还源速度慢的主要原因是因为这类工具在执行 SQL 文件的时候,总是把每一条SQL以一个事务的方式去执行。所以面对几千万的数据,就需要执行几千万次的 SQL 语句,效率更加可想而知。于是想到了 OBDB2DB 这一个数据库转换工具,通过这一个工具把 MySQL 的数据导出为本地 SQLite 数据库,带回来后再将 SQLite 转换为 MySQL 数据库。由于 OBDB2DB 在进行数据转换时采用了批量处理的方式,所以转换速度相比原来的方式大大提高。
㈤ SQL Server如何提高数据库还原的速度
影响数据库还原速度的因素和影响数据库备份速度的因素相同。除此之外,假如你使用SQL Server 2005的话,你还可以启动另外一个优化任务来还原当前不存在的数据库,运行环境为Windows XP,Windows 2003 Server 或更新版本。
Perform Volume Maintenance Tasks
当你还原一个新的完整数据库是,SQL Server读备份文件头,然后创建原始数据库中数据和日志文件需要的磁盘空间。假如SQL Server服务启动帐户没有“Perform Volume Maintenance Tasks”权限的话,数据和日志文件就需要被初始化为0,也就是说,SQL Server先创建这些文件,然后用0来填充它们。对于一个大数据库来说,这将花费很多时间。我记得使用SQL Server 2000从磁带上还原一个320GB的数据库时,总是奇怪为什么总是有30分钟的时间,还原进程一点称进展都没有。
然后,假如SQL Server服务启动帐户有“Perform Volume Maintenance Tasks”权限的话,它就会根据大小来创建数据文件,跳过“填充0”这个阶段。
下图使用secpol.msc来显示权限
你可以设想一下它会节省你多少还原大型数据库的时间。注意,事务日志文件仍然需要“填充0”,仅仅是数据文件可以跳过这一步。
注意:当然使用新权限时,要启动SQL Server服务来使之生效
下面是一个还原20GB数据和5GB事务日志所消耗时间的对照表
还原消耗时间
未使用”Perform Volume Maintenance Tasks” 5:05
使用“Perform Volume Maintenance Tasks” 1:01
消耗1:01时间是因为SQL Server仍然要把事务日志文件进行“填充0”操作,未使用”Perform Volume Maintenance Tasks”的情况下,SQL Server需要把数据文件和事务日志都进行“填充0”的操作,所以还原时间显示变长了。
你可以用下面这个脚本来快速确定当前是否使用了PVMT(Perform Volume Maintenance Tasks)。
CREATE DATABASE test_InstantInit ON
PRIMARY (name = 'test_InstantInit', filename = 'k:/temp/test_InstantInit.mdf', size = 1GB)
LOG ON (name = 'test_InstantInit_log', filename = 'k:/temp/test_InstantInit.ldf', size = 1MB)
DROP DATABASE test_InstantInit
整个脚本如果在几秒内完成就证明使用了PVMT。
这里还有一点需要说明的地方。当SQL Server跳过“填充0”阶段空间时,如果数据文件所占用的空间里面包括以前的数据,那么使用DBCC PAGE命令或是其他16进制编辑器就可以看到未被数据页占据的空间内容。这就是说,如果一个包括敏感重要内容的数据虽然已经被删除了,但是如果新数据库占用了这片空间,那么敏感数据就有可能被部分泄露出来。
注意:当PVMT处于活动状态时,那么新建数据库,新建数据文件,数据文件增长等情况都会使用它。详情请看Database File Initialization [SQL2005]
综上所述,那么我从备份文件还原一个数据库之前是否要删除这个数据库呢?
下面的表格显示了还原同一个数据不同操作的效果:
还原时间
还原1GB数据库 0:40
还原2GB数据库 1:08
还原1GB数据库,当前有个同名的2GB数据库存在 0:29
还原2GB数据库,当前有个同名的1GB数据库存在 0:56
结果显示,假如你执行一个完整数据库恢复且覆盖已经存在的同名数据库,那么恢复速度会快于直接恢复(表中行1与行3,或行2与行4的对比)。这看起来好像是因为没有对已经存在的数据文件执行“填充0”操作而节省了时间。不过这也仅仅局限于你恢复的数据库有同名的文件。如果你使用MOVE选项来重定位数据库文件,那么无论你事先是否已经删除数据库,这都不再有什么区别了。
还原状态同样影响还原速度
另外一个影响还原速度的因素就是你所选择的还原后的数据库的状态,前提是recovery没有被选中。通常出于为以后升级做准备的需求,当你选择不完全恢复数据库时,有两个选项可以使用NORECOVERY或是STANDBY。NORECOVERY使数据库处于“恢复中”模式,允许你进行后续的升级,而且此时数据库是不可读状态。STANDBY也使数据库处于“恢复中”状态,允许你进行后续升级,但是此时数据库可读。
当你使用STANDBY选项时,你要为回滚文件提供一个名字。这个文件包括从未提示的事务中回滚操作结果。你的未提交事务越多,这个文件越大,那么随后还原时间越长。
下面的例子中有4个事务日志,每个大约131MB左右。除了第三个事务日志外,所有的备份都仅包括提交的事务,第三个事务日志包括32MB未提交事务,结果如下图:
使用NORECOVERY选项还原事务日志:
使用STANDBY选项还原事务日志:
总体来说,与NORECOVERY相比使用STANDBY还原事务日志会慢一些。因为当有未提交的事务时,SQL Server会花费额外的时间来创建回滚文件(undo file)。
还有说明的是,如果你要还原多个事务日志而且你想让数据库处于只读模式,那么你应该先使用NORECOVERY选项来还原事务日志,然后当所有日志都恢复完成后,你可以把数据库切换到STANDBY的只读模式,如下:
RESTORE DATABASE mydb WITH STANDBY = 'g:/data/mydb/mydb_und.dat'
使用这个方法,你仅仅创建了回滚文件一次,避免了还原多个事务日志时创建多次回滚文件的过程,加速了恢复过程。
㈥ Sql server700G数据要恢复多久
大约50个小时。主要看配置,7G多的话,半个多小时到一个小时不等,那700G要50个小时左右。
㈦ 求助,用 Navicat 还原 Mysql 数据库奇慢
二、打开Navicat---连接---Mysql 三、填写数据库连接信息 四、导出数据库文件双击打开创建的连接---选择您的数据库---右键点击---选择"转储SQL文件",即可将数据库导入成.sql文件五、 导入数据库文件 1)双击打开创建的连接---选择您的数据库---右键点击---选择"运行SQL文件"2)选择您的数据库备份文件以及备份文件的编码,默认选择的编码为65001 (UTF-8)。如果导入失败,可以删除失败的表,尝试选择936( Simplified Chinese GBK ) 再次导入 3)如果进度条显示完成,并且没有提示错误,则成功导入。
㈧ 用 Navicat 还原 Mysql 数据库奇慢
mysql -uuser -ppassword dbname < c:\\dbname.sql 这样试一下