求解酷派大神f2:关于Windows下Sql Server R2008和MySQL数据库的新建数据库自动备份脚本

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
sqluldr2超详细使拥拿教程-loracle数据导出工具及方法.pdf 33页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:140 &&
sqluldr2超详细使拥拿教程-loracle数据导出工具及方法
你可能关注的文档:
··········
··········
作者:楼方鑫(网名:d.c.b.a)个人主页:文本导出文本导出文本导出文本导出将数据导出成文本文件,在其他数据库(如Sybase、SQLServer、MySQL)中看起来是一件很容易的事,因为有官方的类似工具(bcp)或命令(SELECTINTO和LOADDATA),但在Oracle数据库上要做好这件事情却并非易事,Oracle即没有这样的工具,也没有提供这样的命令,因此经常看到论坛上有人在问如何将Oracle的数据快速导出成文本。回想起从大学毕业从事IT行业开始到现在,在许多项目中都遇到了这样的需求,也用过数种不同的语言(Java、PowerBuilder、Perl等)来实现过这个功能,但以前已经实现的每一种都不是最佳的,始终有些缺憾。刚毕业时当程序员,第一年用Developer2000,面对的所有数据库都是Oracle,没有文本导出要求,学会了Oracle的导入导出(exp/imp)功能。第二年用PowerBuilder,面对的数据库就有Oracle和Sybase,就遇到过文本导出的需求,用PowerBuilder的数据管道实现过,都是结合在具体项目中使用,单独用的很少,也不方便,为了一个文本导出功能需要一个很大的运行环境,并且速度也不快。后来Java流行,用JDBC实现了一个,算是比较轻量级的了,基本上Java的运行环境哪儿都有,在测试速度时,发现与OCI程序比要达到同样的速度,运行Java程序的机器上多耗了四倍的CPU,也就是用Java版本的文本导出程序常常让客户端的CPU跑满,因此无法面对更大量(上GB)的数据导出。开始做专职的DB后,一开始也在找能实现文本导出的好工具,和许多DB一样在上找到了TomKyte写的两个脚本,一个是用SQL*Plus的spool功能来实现的,另一个是用Pro*C语言来写的程序。用spool实现的不是很喜欢,第一速度不快,第二个不能指定任意字段分隔符,及记录分隔符。Pro*C版本的在性能上很好,但在灵活性上,还是比较差,要实现当时想到的需求,一样要改源程序,并且用Pro*C的程序在编译后很难跨版本通用,而这一点我比较看重,于是就想到以这个高效程序为样本,写一个更灵活通用的文本导出程序。刚好对C语言及OracleCallInterface产生了一些兴趣,就拿这个任务来练手吧。没有想到的是,为了这么一个小工具,前前后后五六年了,还在不停地维护,根据不同用户提出的改进需求完善程序,是当时没有始料到的事情。当然在整个过程中,得到了很多人的感谢邮件,而我自已也体会到坚持的乐趣,也让我对更多的事情多一分坚持。作者:楼方鑫(网名:d.c.b.a)个人主页:作者:楼方鑫(网名:d.c.b.a)个人主页:Sqluldr2Sqluldr2是灵活与强大的Oracle文本导出程序,已被大众使用三年多了,有几千国内外DB在使用它或使用过它,并在使用的过程中提出了宝贵实用的改进意见,在完善了众多真实客户的需求后,最终形成了现在的稳定版本。Oracle有一个工具叫SQL*Loader(sqlldr)是用来将文本文件装载到数据库中的,而我的工具是用来将Oracle中的数据导出成文本的,因此取名为SQL*UnLoader(sqluldr),而最后的2是因为第一版是用OCI7接口写的,而现在发布的是用OCI8接口重写的,是第二代的意思。学会这样的好工具,在一定的场合可以让DB的某些工作做得更轻松自在。文本方式有什么作用?文本方式是不同类型数据库数据交换的重要方式,从小的地方说,例如将一些Oracle性能数据收集到MySQL中,进行分析和展示;从大的地方讲,sqluldr2曾被用来在Oracle系统中导出大批量的数据,然后装载到数据仓库(NCR或SybaseIQ)中。阿里巴巴(Alibaba)集团的DB几年前就开始用sqluldr从生产系统中导出巨量数据给数据仓库分析,并在真实应用环境下创下了我所见过的文本导出速度的最高记录,总共用了595秒钟导出了条记录,平均每秒287622条记录。0rowsexportedat5:43:rowsexportedat5:53:04或者用在不同字符集的同种数据库之间进行数据交换,如US7ASCII字符集的Oracle数据库和ZHS16GBK字符集的Oracle数据库进行中文信息交换,这时DatabaseLink是不行的。在某些系统中为了防止软件版本变迁的问题,而选择用最简可靠的文本方式来归档和永久保存历史数据。最近也有不少人用sqluldr2来快速将数据导出成文本,为GreenPlum这样的海量数据分析处理系统提供数据。也有做搜索的,结合sqluldr的早期源代码,结合到商品搜索引挚的数据dump程序中。也有人
正在加载中,请稍后...当前位置: &
关注度排行榜
新品排行榜
热销排行榜查看: 2935|回复: 9
【体系结构】有关Oracle SCN知识点的整理
认证徽章论坛徽章:10
本帖最后由 lhrbest 于
21:22 编辑
1&&BLOG文档结构图
2&&前言部分2.1&&导读和注意事项各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:① Oracle中的SCN是什么?(重点)② 如何查询SCN?(重点)③ SCN有哪些分类?(重点)④ SCN和系统恢复的关系?(重点)④ 实例恢复和介质恢复的区别是什么?RAC中的实例恢复是什么样的?(重点)⑥ SCN和时间的转换⑦ SMON_SCN_TIME系统表的认识⑧ 不完全恢复的一些分类及其写法
21:21 上传
点击文件名下载附件
1.67 MB, 下载次数: 119
售价: 1 pub币 &[]
非常感谢各位朋友支持小麦苗。
认证徽章论坛徽章:10
2.2&&本文简介由于写书遇到了SCN的概念,所以就找了点资料,整理了一下有关SCN的一些知识。顺便复习了一下SCN和数据库恢复的关系。3&&Oracle SCN3.1&&简介SCN(System Change Number,系统改变号)是一个由系统内部维护的序列号。当系统需要更新的时候自动增加,它是系统中维持数据的一致性和顺序恢复的重要标志,是数据库非常重要的一种数据结构。SCN的最大值是0xffff.ffffffff。在数据库中SCN作为一种时钟机制来标记数据库动作,比如当事务的发生,数据库会用一个SCN来标记它。同时这个SCN在数据库全局也是唯一的,它随时间的增长而增长除非重建数据库。在数据库中,SCN可以说是无处不在,数据文件头,控制文件,数据块头,日志文件等等都标记着SCN。也正是这样,数据库的一致性维护和SCN密切相关。不管是数据的备份,恢复都是离不开SCN的。3.2&&官方文档A system change number (SCN) is a logical, internal time stamp used by Oracle Database. SCNs order events that occur within the database, which is necessary to satisfy the ACID properties of a transaction. Oracle Database uses SCNs to mark the SCN before which all changes are known to be on disk so that recovery avoids applying unnecessary redo. The database also uses SCNs to mark the point at which no redo exists for a set of data so that recovery can stop.SCNs occur in a monotonically increasing sequence. Oracle Database can use an SCN like a clock because an observed SCN indicates a logical point in time and repeated observations return equal or greater values. If one event has a lower SCN than another event, then it occurred at an earlier time with respect to the database. Several events may share the same SCN, which means that they occurred at the same time with respect to the database.Every transaction has an SCN. For example, if a transaction updates a row, then the database records the SCN at which this update occurred. Other modifications in this transaction have the same SCN. When a transaction commits, the database records an SCN for this commit.Oracle Database increments SCNs in the system global area (SGA). When a transaction modifies data, the database writes a new SCN to the undo data segment assigned to the transaction. The log writer process then writes the commit record of the transaction immediately to the online redo log. The commit record has the unique SCN of the transaction. Oracle Database also uses SCNs as part of its instance recovery and media recovery mechanisms.怎么理解这个“SCN(系统变更号)是供Oracle数据库使用的一个逻辑的、内部的时间戳”呢?要理解这个先需要理解Oracle中的事务(Transaction)和数据一致性(Data Consistency)的概念。先说说数据一致性的概念。数据一致性指的是数据的可用性。比如说管理一个财务的系统,需要从A账户将100元转入到B账户,正常的操作是从A账户减去100元,然后给B账户加上100元,如果这两步操作都正常完成了,那我们可以说完成转账操作之后的数据是一致可用的;但是如果在操作的过程中出了问题,A账户的100元给减掉了,但是B账户却没有加上100元,这样的情况下产生的结果数据就有问题了,因为部分操作的失败导致了数据的不一致而不可用,在实际中肯定是要避免这种让数据不一致的情况发生的。在Oracle数据库中,保证数据一致性的方法就是事务。事务是一个逻辑的、原子性的作业单元,通常由一个或者是多个SQL组成,一个事务里面的所有SQL操作要么全部失败回滚(Rollback),要么就是全部成功提交(Commit)。就像上面转账的例子,为保证数据的一致性,就需要将转账的两步操作放在一个事务里面,这样不管哪个操作失败了,都需要将所有已进行的操作回滚,以保证数据的可用性。进行事务管理是数据库区别于别的文件系统的一个最主要的特征,在数据库中事务最主要的作用就是保证了数据的一致性,每次事务的提交都是将数据库从一种一致性的状态带入到另外一种一致性的状态中,SCN就是用来对数据库的每个一致状态进行标记的,每当数据库进入到一个新的一致的状态,SCN就会加1,也就是每个提交操作之后,SCN都会增加。也许你会想为什么不直接记录事务提交时候的时间戳呢?这里面主要是涉及了两个问题,一个是时间戳记录的精度有限,再一个就是在分布式系统中记录时间戳会存在系统时钟同步的问题,详细的讨论可以查看Ordering Events in Oracle。SCN在数据库中是一个单一的不断的随着数据库一致性状态的改变而自增的序列。正如一个时间戳代表着时间里面的某一个固定的时刻点一样,每一个SCN值也代表着数据库在运行当中的一个一致性的点,大的SCN值所对应的事务总是比小SCN值的事务发生的更晚。因此把SCN说成是Oracle数据库的逻辑时间戳是很恰当的。3.3&&SCN的分类严格来说SCN是没有分类的,之所以会有不同类型的SCN并不是说这些SCN的概念不一样,而是说不同分类的SCN代表的意义不一样,不管什么时候SCN所指代的都是数据库的某个一致性的状态。就像我们给一天中的某个时间点定义上班时间、另外的某个时间点定义成下班时间一样,数据库Checkpoint发生点的SCN被称为Checkpoint SCN,仅此而已。SCN可以分为4类,系统检查点SCN(System Checkpoint SCN)、文件检查点SCN(Datafile Checkpoint SCN)、开始SCN(Start SCN)和结束SCN(Stop SCN),参考如下表格:
认证徽章论坛徽章:10
本帖最后由 lhrbest 于
20:32 编辑
3.4&&查询4种SCN常用的SQL语句col status for a10select GROUP# ,SEQUENCE#,STATUS,FIRST_CHANGE#,FIRST_TIME from v$ SELECT A.FILE#,& && & A.NAME,& && & (SELECT CHECKPOINT_CHANGE# FROM V$DATABASE) SYSTEM_CKPT_SCN,& && & A.CHECKPOINT_CHANGE# DF_CKPT_SCN,& && & A.LAST_CHANGE# END_SCN,& && & B.CHECKPOINT_CHANGE# START_SCN,& && & B.RECOVER,& && & A.STATUS&&FROM V&span class=&MathJax& id=&MathJax-Element-1-Frame& tabindex=&0& data-mathml=&DATAFILEA,V& role=&presentation& style=&display: line-height: 1.5; word-spacing: word-wrap: white-space: float: direction: max-width: max-height: min-width: 0 min-height: 0 border: 0 position:&&DATAFILEA,VDATAFILEA,VDATAFILE_HEADER BWHERE A.FILE# = B.FILE#;SELECT FILE#,ONLINE_STATUS,CHANGE#,ERROR FROM V$RECOVER_FILE; 3.4.1&&文件检查点SCN (Datafile Checkpoint SCN)SYS@lhrdb&&&select file#,checkpoint_change# from v$ & &&&FILE# CHECKPOINT_CHANGE#---------- ------------------& && && &1& && && && &9026292& && && &2& && && && &9026292& && && &3& && && && &9026292& && && &4& && && && &9026292& && && &5& && && && &9026292& && && &6& && && && &9026292& && && &7& && && && &9026292 7 rows selected. SYS@lhrdb&&&alter tables Tablespace altered. SYS@lhrdb& select file#,checkpoint_change# from v$ & &&&FILE# CHECKPOINT_CHANGE#---------- ------------------& && && &1& && && && &9026292& && && &2& && && && &9026292& && && &3& && && && &9026292& && && &4& && && && &9028165& && && &5& && && && &9026292& && && &6& && && && &9026292& && && &7& && && && &9026292 7 rows selected. SYS@lhrdb& select checkpoint_change# from v$ CHECKPOINT_CHANGE#------------------& && && &&&9026292 可以看到4号文件也就是users表空间所属的文件scn值和其他文件不一致,且比系统检查点的scn要大。3.4.2&&Stop SCNStop scn记录在数据文件头上。当数据库处在打开状态时,stop scn被设成最大值0xffff.ffffffff。在数据库正常关闭过程中,stop scn被设置成当前系统的最大scn值。在数据库打开过程中,Oracle会比较各文件的stop scn和checkpoint scn,如果值不一致,表明数据库先前没有正常关闭,需要做恢复。SYS@lhrdb& SELECT TABLESPACE_NAME,STATUS FROM DBA_TABLESPACES; TABLESPACE_NAME& && && && && & STATUS------------------------------ ---------SYSTEM& && && && && && && && & ONLINESYSAUX& && && && && && && && & ONLINEUNDOTBS1& && && && && && && &&&ONLINETEMP& && && && && && && && && &ONLINEUSERS& && && && && && && && &&&READ ONLYEXAMPLE& && && && && && && && &ONLINETS_MIG_CHAIN_LHR& && && && && &ONLINETS_TESTBLOCKLHR& && && && && & ONLINE 8 rows selected. SYS@lhrdb&&&SELECT FILE#,LAST_CHANGE# FROM&&V$DATAFILE; & &&&FILE# LAST_CHANGE#---------- ------------& && && &1& && && &2& && && &3& && && &4& && &9028165& && && &5& && && &6& && && &7 7 rows selected. 可以看到除了USERS表空间的结束SCN不为空,其他数据文件的结束SCN为空。将数据库至于MOUNT状态,由于该状态下所有的数据文件都不可写,故MOUNT状态下所有的数据文件都具有结束SCN。SYS@lhrdb& startup mountORACLE instance started. Total System Global Area
bytesFixed Size& && && && && && &2247072 bytesVariable Size& && && && &
bytesDatabase Buffers& && && & bytesRedo Buffers& && && && && & 6803456 bytesDatabase mounted.SYS@lhrdb& SELECT FILE#,LAST_CHANGE# FROM&&V$DATAFILE; & &&&FILE# LAST_CHANGE#---------- ------------& && && &1& && &9048847& && && &2& && &9048847& && && &3& && &9048847& && && &4& && &9028165& && && &5& && &9048847& && && &6& && &9048847& && && &7& && &9048847 7 rows selected. SYS@lhrdb& alter tablesp Tablespace altered. SYS@lhrdb& SELECT FILE#,LAST_CHANGE# FROM&&V$DATAFILE; & &&&FILE# LAST_CHANGE#---------- ------------& && && &1& && && &2& && && &3& && && &4& && && &5& && && &6& && && &7 7 rows selected. SYS@lhrdb& startup force mountORACLE instance started. Total System Global Area
bytesFixed Size& && && && && && &2247072 bytesVariable Size& && && && &
bytesDatabase Buffers& && && & bytesRedo Buffers& && && && && & 6803456 bytesDatabase mounted.SYS@lhrdb& SELECT FILE#,LAST_CHANGE# FROM&&V$DATAFILE; & &&&FILE# LAST_CHANGE#---------- ------------& && && &1& && && &2& && && &3& && && &4& && && &5& && && &6& && && &7 7 rows selected. 3.4.3&&HIGH AND LOW SCNORACLE的REDO LOG会顺序纪录数据库的各个变化。一组REDO LOG文件写满后,会自动切换到下一组REDO LOG文件。则上一组REDO LOG的HIGH SCN就是下一组REDO LOG的LOW SCN。在CURRENT LOG中HIGH SCN为无穷大。在视图V$LOG_HISTORY中,SEQUENCE#代表REDO LOG的序列号,FIRST_CHANGE#表示当前REDO LOG的LOW SCN,列NEXT_CHANGE#表示当前REDO LOG的HIGH SCN。可通过查询V$LOG_HISTORY查看 LOW SCN和 HIGH SCN。SYS@lhrdb& set pagesize 9999SYS@lhrdb& SELECT RECID,SEQUENCE#,FIRST_CHANGE#,NEXT_CHANGE# FROM V$LOG_HISTORY WHERE ROWNUM&=6;& &&&RECID&&SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#---------- ---------- ------------- ------------& && & 272& && &&&272& && & 7486197& && &7510243& && & 273& && &&&273& && & 7510243& && &7527538& && & 274& && &&&274& && & 7527538& && &7539409& && & 275& && &&&275& && & 7539409& && &7556740& && & 276& && &&&276& && & 7556740& && &7572195& && & 277& && &&&277& && & 7572195& && &75818476 rows selected.
查看CURRNET REDO LOG中的HIGH SCNSYS@lhrdb& COL MEMBER FORMAT A50SYS@lhrdb& SELECT VF.MEMBER,V.STATUS,V.FIRST_CHANGE# FROM V&span class=&MathJax& id=&MathJax-Element-2-Frame& tabindex=&0& data-mathml=&LOGFILEVF,V& role=&presentation& style=&display: line-height: 1.5; word-spacing: word-wrap: white-space: float: direction: max-width: max-height: min-width: 0 min-height: 0 border: 0 position:&&LOGFILEVF,VLOGFILEVF,VLOG V&&2& &&&WHERE VF.GROUP#=V.GROUP#&&3& &&&AND V.STATUS='CURRENT'; MEMBER& && && && && && && && && && && && && && && &STATUS& && && &&&FIRST_CHANGE#-------------------------------------------------- ---------------- -------------+DATA/lhrdb/onlinelog/group_4.798.& && &&&CURRENT& && && && && & 9069089+DATA/lhrdb/onlinelog/group_4.797.& && &&&CURRENT& && && && && & 9069089 SYS@lhrdb& ALTER SYSTEM DUMP LOGFILE '+DATA/lhrdb/onlinelog/group_4.797.'; System altered. SYS@lhrdb& oradebug setmypidStatement processed.SYS@lhrdb& oradebug tracefile_name/oracle/app/oracle/diag/rdbms/lhrdb/lhrdb/trace/lhrdb_ora_8388948.trc查看转储文件的内容:DUMP OF REDO FROM FILE '+DATA/lhrdb/onlinelog/group_4.797.'Opcodes *.*RBAs: 0x thru 0xffffffff.ffffffff.ffffSCNs: scn: 0x0 thru scn: 0xffff.ffffffffTimes: creation thru eternityFILE HEADER:& && &&&Compatibility Vsn = xb200400& && &&&Db ID=x392e0e0a, Db Name='LHRDB'& && &&&Activation ID=x392e5b06& && &&&Control Seq=21, File size=x32000& && &&&File Number=4, Blksiz=512, File Type=2 LOGdescrip:&Thread 0001, Seq# , SCN 0x1-0xffffffffffff&thread: 1 nab: 0xffffffff seq: 0x hws: 0x2 eot: 1 dis: 0resetlogs count: 0x36a23c8c scn: 0xdc (925916)prev resetlogs count: 0x3155bebd scn: 0x1 (1)Low&&scn: 0x1 (9069089) 10/11/:41Next scn: 0xffff.ffffffff 01/01/:00Enabled scn: 0xdc (/07/:56Thread closed scn: 0x1 (/11/:41Disk cksum: 0xc14c Calc cksum: 0xc14cTerminal recovery stop scn: 0x0Terminal recovery&&01/01/:00Most recent redo scn: 0x0Largest LWN: 0 blocksEnd-of-redo stream : NoUnprotected modeMiscellaneous flags: 0x800000Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0Zero blocks: 0Format ID is 1redo log key is 47e6cd1abd3a43fd864d2b94ae9a8128redo log key flag is 5Enabled redo threads: 1 当前最新的数据库scn值可通过如下命令查看:SYS@lhrdb& select dbms_flashback.get_system_change_GET_SYSTEM_CHANGE_NUMBER------------------------& && && && && &&&9069555如果需要进行实例恢复,则需要恢复的记录为69555中redo log中的记录。
认证徽章论坛徽章:10
3.5&&SCN号于数据库的启动、关闭Scn号与Oracle数据库恢复过程有着密切的关系,只有很好地理解了这层关系,才能深刻地理解恢复的原理。CKPT进程在checkpoint发生时,将当时的SCN号写入数据文件头和控制文件,同时通知DBWR进程将数据块写到数据文件。CKPT进程也会在控制文件中记录RBA(redo block address),以标志Recovery需要从日志中哪个地方开始。 1.在数据库的启动过程中,当System Checkpoint SCN=Datafile Checkpoint SCN=Start SCN的时候,Oracle数据库是可以正常启动的,而不需要做任何的MEDIA RECOVERY。而如果三者当中有一个不同的话,则需要做MEDIA RECOVERY。Oracle在启动过程中首先检查是否需要MEDIA RECOVERY,然后再检查是否需要INSTANCE RECOVERY。2.那什么时候需要做INSTANCE RECOVERY呢?其实在正常OPEN数据库的时候,Oracle会将记录在控制文件中的每一个数据文件头的End SCN都设置为#FFFFFF(NULL),那么如果数据库进行了正常关闭比如(shutdown or shutdown immediate)这个时候,系统会执行一个检查点,这个检查点会将控制文件中记录的各个数据文件头的End SCN更新为当前online数据文件的各个数据文件头的Start SCN,也就是End SCN=Start SCN,如果再次启动数据库的时候发现二者相等,则直接打开数据库,并再次将End SCN设置为#FFFFFF(NULL),那么如果数据库是异常关闭,那么CHECKPOINT就不会执行,因此再次打开数据库的时候End SCN&&Start SCN这个时候就需要做实例恢复。如果数据库异常关闭的话,则END SCN号将为NULL.则需要做instance recovery。3.5.1&&为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号为什么ORACLE会在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录Datafile Checkpoint SCN号?原因有二:1.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。这三个SCN在表空间处于只读期间都将被冻结。2.如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN或END SCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。SYS@lhrdb& alter tables Tablespace altered. SYS@lhrdb& SELECT A.FILE#,&&2& && && &A.NAME,&&3& && && &(SELECT CHECKPOINT_CHANGE# FROM V$DATABASE) SYSTEM_CKPT_SCN,&&4& && && &A.CHECKPOINT_CHANGE# DF_CKPT_SCN,&&5& && && &A.LAST_CHANGE# END_SCN,&&6& && && &B.CHECKPOINT_CHANGE# START_SCN,&&7& && && &B.RECOVER,&&8& && && &A.STATUS&&9& & FROM V&span class=&MathJax& id=&MathJax-Element-3-Frame& tabindex=&0& data-mathml=&DATAFILEA,V& role=&presentation& style=&display: line-height: 1.5; word-spacing: word-wrap: white-space: float: direction: max-width: max-height: min-width: 0 min-height: 0 border: 0 position:&&DATAFILEA,VDATAFILEA,VDATAFILE_HEADER B10& &WHERE A.FILE# = B.FILE#; & &&&FILE# NAME& && && && && && && && && && && && && && && && && && && &SYSTEM_CKPT_SCN DF_CKPT_SCN& & END_SCN&&START_SCN REC STATUS---------- ------------------------------------------------------------ --------------- ----------- ---------- ---------- --- ----------& && && &1 +DATA/lhrdb/datafile/system.347.& && && && && && && && && & 9225394& &&&9225394& && && && && &9225394 NO&&SYSTEM& && && &2 +DATA/lhrdb/datafile/sysaux.340.& && && && && && && && && & 9225394& &&&9225394& && && && && &9225394 NO&&ONLINE& && && &3 +DATA/lhrdb/datafile/undotbs1.353.& && && && && && && && &&&9225394& &&&9225394& && && && && &9225394 NO&&ONLINE& && && &4 +DATA/lhrdb/datafile/users.445.& && && && && && && && && &&&9225394& &&&<font color="#ff5& & 9229175& & 9229175 NO&&ONLINE& && && &5 +DATA/lhrdb/datafile/example.416.& && && && && && && && && &9225394& &&&9225394& && && && && &9225394 NO&&ONLINE& && && &6 +DATA/lhrdb/datafile/ts_mig_chain_lhr.471.& && && && && && &9225394& &&&9225394& && && && && &9225394 NO&&ONLINE& && && &7 /oracle/app/oracle/oradata/lhrdb/testblocklhr01.dbf& && && && && && &9225394& &&&9225394& && && && && &9225394 NO&&ONLINE 7 rows selected.
3.5.2&&recover database using backup controlfile当有一个Start SCN号超过了System Checkpoint SCN号时,则说明控制文件不是当前的控制文件,因此在做recover时需要采用using backup controlfile。这是为什么需要记录SystemCheckpoint SCN的原因之一。这里需要一提的是,当重建控制文件的时候,System Checkpoint SCN为0,Datafile Checkpoint SCN的数据来自于Start SCN。根据上述的描述,此时需要采用using backup controlfile做recovery.3.6&&查看系统当前SCNOracle数据库提供了两种直接查看系统当前SCN的方法,一个是V$DATABASE中的CURRENT_SCN列,另外一个就是通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER得到。SYS@ORACNSL1& COL SCN1 FOR 9SYS@ORACNSL1& COL SCN2 FOR 9SYS@ORACNSL1& COL SCN3 FOR 9SYS@ORACNSL1& SELECT CURRENT_SCN SCN1,DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER SCN2,TIMESTAMP_TO_SCN(SYSDATE) SCN3 FROM V$DATABASE;& && && & SCN1& && && &&&SCN2& && & SCN3-------------- -------------- ----------& & & &&&
一般情况下,SCN1和SCN2的结果一致,但在系统比较繁忙的时候可能SCN2比SCN1稍微大一点,比如大1。在oracle 9i中要麻烦些,V$DATABASE视图中没有CURRENT_SCN这列,只有通过查询X$KTUXE视图来得到。SYS@lhrdb& SELECT MAX(KTUXESCNW*POWER(2,32)+KTUXESCNB) SCN FROM X$KTUXE;& && & SCN----------& &8764198 3.7&&SCN与时间的相互转换(SCN_TO_TIMESTAMP与TIMESTAMP_TO_SCN)Oracle 10g提供了两个新函数对于SCN和时间戳进行相互转换,这两个函数是SCN_TO_TIMESTAMP、TIMESTAMP_TO_SCN,通过对SCN和时间戳进行转换,Oracle极大地方便了很多备份和恢复过程。一个SCN值总是发生在某一个特定的时刻的,只不过由于粒度的不一样,通常会存在多个SCN对应同一个时间戳。Oracle中提供了两个函数以供我们进行SCN和时间的互换:l SCN_TO_TIMESTAMP(scn_number) 将SCN转换成时间戳。l TIMESTAMP_TO_SCN(timestamp) 将时间戳转换成SCN。 通过这两个函数,最终Oracle将SCN和时间的关系建立起来,在Oracle 10g之前,是没有办法通过函数转换得到SCN和时间的对应关系的,一般可以通过logmnr分析日志获得。但是这种转换要依赖于数据库内部的数据记录(SMON_SCN_TIME),对于久远的SCN则不能转换,请看以下举例:SYS@lhrdb&&&SELECT MIN(FIRST_CHANGE#) SCN,DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM V$ARCHIVED_LOG; & && & SCN GET_SYSTEM_CHANGE_NUMBER---------- ------------------------& &7527538& && && && && && &8763206 SYS@lhrdb& SELECT SCN_TO_TIMESTAMP(7527538) SCN FROM DUAL;select scn_to_timestamp(7527538) scn from dual& && & *ERROR at line 1:ORA-08181: specified number is not a valid system change numberORA-06512: at &SYS.SCN_TO_TIMESTAMP&, line 1 SYS@lhrdb& select min(scn) from smon_scn_ &&MIN(SCN)----------& &8622517 SYS@lhrdb&&&select scn_to_timestamp(8622517) TIMESTAMP---------------------------------------------------------------------------08-OCT-16 04.30.26. AM SYS@lhrdb&&&select scn_to_timestamp(8622516)select scn_to_timestamp(8622516) timestamp from dual& && &&&*ERROR at line 1:ORA-08181: specified number is not a valid system change numberORA-06512: at &SYS.SCN_TO_TIMESTAMP&, line 1
从上面的例子可以看出Oracle能够转换的最小SCN也就是SMON_SCN_TIME.scn的最小值。 SYS@lhrdb& SELECT SCN_TO_TIMESTAMP(8763206) SCN FROM DUAL; SCN---------------------------------------------------------------------------10-OCT-16 05.22.40. PM SYS@lhrdb& SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('10-OCT-16 05.22.40. PM','DD-Mon-RR HH:MI:SS.FF AM')) SCN FROM DUAL; & && & SCN----------& &8763206 SYS@lhrdb& SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP(' 17:22:40','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL; & && & SCN----------& &8763206 SYS@lhrdb& SELECT TO_CHAR(SCN_TO_TIMESTAMP(8763206), 'YYYY-MM-DD HH24:MI:SS') CHR_DATE,TIMESTAMP_TO_SCN(SCN_TO_TIMESTAMP(8763206)) DT FROM DUAL; CHR_DATE& && && && && && &&&DT------------------- ---------- 17:22:40& & 8763206 对于时间到SCN的转换,Oracle只能定位到3秒以内,3秒内的时间都被转换成同一个SCN:SYS@lhrdb& SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP(' 17:22:40','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL; & && & SCN----------& &8763206 SYS@lhrdb& SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP(' 17:22:41','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL; & && & SCN----------& &8763206 SYS@lhrdb& SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP(' 17:22:42','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL; & && & SCN----------& &8763206 SYS@lhrdb& SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP(' 17:22:43','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL; & && & SCN----------& &8763213 SYS@lhrdb& SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP(' 17:22:39','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL; & && & SCN----------& &8763205 3.7.1&&SMON_SCN_TIMESELECT * FROM DBA_TABLES D WHERE D.TABLE_NAME = 'SMON_SCN_TIME'; Oracle 在内部都是使用scn,即使你指定的是as of timestamp,oracle 也会将其转换成scn,系统时间标记与scn 之间存在一张表,即SYS下的SMON_SCN_TIME。SYS@lhrdb& set linesize 80SYS@lhrdb& desc sys.smon_scn_timeName& && && && && && && && && && && && &&&Null?& & Type----------------------------------------- -------- ----------------------------THREAD& && && && && && && && && && && && && && && &NUMBERTIME_MP& && && && && && && && && && && && && && &&&NUMBERTIME_DP& && && && && && && && && && && && && && &&&DATESCN_WRP& && && && && && && && && && && && && && &&&NUMBERSCN_BAS& && && && && && && && && && && && && && &&&NUMBERNUM_MAPPINGS& && && && && && && && && && && && && &NUMBERTIM_SCN_MAP& && && && && && && && && && && && && & RAW(1200)SCN& && && && && && && && && && && && && && && && &NUMBERORIG_THREAD& && && && && && && && && && && && && & NUMBER 每隔5分钟,系统产生一次系统时间标记与scn的匹配并存入sys.smon_scn_time 表,该表中记录了最近1440个系统时间标记与scn的匹配记录,由于该表只维护了最近的1440条记录,因此如果使用as of timestamp的方式则只能flashback最近5天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。查看SCN 和 timestamp 之间的对应关系:SELECT SCN, TO_CHAR(TIME_DP, 'YYYY-MM-DD HH24:MI:SS') TIME_DP&&FROM SYS.SMON_SCN_TIME T ORDER BY T.SCN DESC; 有关表SMON_SCN_TIME的更多内容可以参考我的BLOG:2126291/,David大神写的,非常全面,我就不画蛇添足了。 3.8&&实例恢复(INSTANCE RECOVERY)和介质恢复(MEDIA RECOVERY)REDO LOG是Oracle为确保已经提交的事务不会丢失而建立的一个机制。实际上REDO LOG的存在是为两种场景准备的,一种我们称之为实例恢复(INSTANCE RECOVERY),一种我们称之为介质恢复(MEDIA RECOVERY)。REDO LOG的数据是按照THREAD来组织的,对于单实例系统来说,只有一个THREAD,对于RAC系统来说,可能存在多个THREAD,每个数据库实例拥有一组独立的REDO LOG文件,拥有独立的LOG BUFFER,某个实例的变化会被独立的记录到一个THREAD的REDO LOG文件中。 3.8.1&&实例恢复对于单实例的系统,实例恢复一般是在数据库实例异常故障后数据库重启时进行,当数据库执行了SHUTDOWN ABORT或者由于操作系统、主机等原因宕机重启后,在执行ALTER DATABASE OPEN的时候,就会自动做实例恢复。而在RAC环境中,如果某个实例宕机了,那么剩下的实例将会代替宕掉的实例做实例恢复。除非是所有的实例都宕机了,这样的话,第一个执行ALTER DATABASE OPEN的实例将会做实例恢复。这也是在RAC环境中,REDO LOG是实例私有的组件,但是REDO LOG的文件必须存放在共享存储上的原因。一、 RAC中的实例恢复一个单实例数据库或者RAC数据库所有实例失败之后,第一个打开数据库的实例会自动执行实例恢复。这种形式的实例恢复称为Crash恢复。一个RAC数据库的一部分但不是所有实例失败后,在RAC中幸存的实例自动执行失败实例的恢复称为实例恢复。一般而言,在崩溃或关机退出之后第一个打开数据库的实例将自动执行崩溃恢复。根据Crash恢复和实例恢复的不同,由幸存实例或者第一个重启的实例读取失败实例生成的联机Redo日志和UNDO表空间数据,使用这些信息确保只有已提交的事务被写到数据库中,回滚在失败时候活动的事务,并释放事务使用的资源。[ZFZHLHRDB1racle]:/oracle&crsctl stat res -t--------------------------------------------------------------------------------NAME& && && &&&TARGET&&STATE& && &&&SERVER& && && && && && & STATE_DETAILS& && &--------------------------------------------------------------------------------Local Resources--------------------------------------------------------------------------------ora.DATA.dg& && && && && &ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & & && && && && &ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && && && && && && && & ora.LISTENER.lsnr& && && && && &ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & & && && && && &ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && && && && && && && & ora.LISTENER_LHRDG.lsnr& && && && && &ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & & && && && && &ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && && && && && && && & ora.asm& && && && && &ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && &Started& && && && && && && && && &ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && &Started& && && && &ora.gsd& && && && && &OFFLINE OFFLINE& && &zfzhlhrdb1& && && && && && && && && && && & & && && && && &OFFLINE OFFLINE& && &zfzhlhrdb2& && && && && && && && && && && & ora.net1.network& && && && && &ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & & && && && && &ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && && && && && && && & ora.ons& && && && && &ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & & && && && && &ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && && && && && && && & ora.registry.acfs& && && && && &ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & & && && && && &ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && && && && && && && & --------------------------------------------------------------------------------Cluster Resources--------------------------------------------------------------------------------ora.LISTENER_SCAN1.lsnr& && &1& && &&&ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & ora.cvu& && &1& && &&&ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & ora.lhrdb.db& && &1& && &&&ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && &Open& && && && && &ora.oc4j& && &1& && &&&ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & ora.raclhr.db& && &1& && &&&ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && &Open& && && && && && && &2& && &&&ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && &Open& && && && && &ora.scan1.vip& && &1& && &&&ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & ora.zfzhlhrdb1.vip& && &1& && &&&ONLINE&&ONLINE& && & zfzhlhrdb1& && && && && && && && && && && & ora.zfzhlhrdb2.vip& && &1& && &&&ONLINE&&ONLINE& && & zfzhlhrdb2& && && && && && && && && && && & [ZFZHLHRDB1racle]:/oracle&srvctl stop instance -d raclhr -i raclhr1 -o abort[ZFZHLHRDB1racle]:/oracle&srvctl status db -d raclhrInstance raclhr1 is not running on node zfzhlhrdb1Instance raclhr2 is running on node zfzhlhrdb2abort掉实例1后:实例一的告警日志:Thu Oct 13 15:51:30 2016Shutting down instance (abort)License high water mark = 60USER (ospid: 4194780): terminating the instanceInstance terminated by USER, pid = 4194780Thu Oct 13 15:51:32 2016Instance shutdown complete实例二的告警日志:Thu Oct 13 15:51:31 2016Reconfiguration started (old inc 4, new inc 6)List of instances:2 (myinst: 2)Global Resource Directory frozen* dead instance detected - domain 0 invalid = TRUECommunication channels reestablishedMaster broadcasted resource hash value bitmapsNon-local Process blocks cleaned outThu Oct 13 15:51:31 2016LMS 0: 0 GCS shadows cancelled, 0 closed, 0 Xw survivedThu Oct 13 15:51:31 2016LMS 1: 0 GCS shadows cancelled, 0 closed, 0 Xw survivedSet master node infoSubmitted all remote-enqueue requestsDwn-cvts replayed, VALBLKs dubiousAll grantable enqueues grantedPost SMON to start 1st pass IRThu Oct 13 15:51:31 2016Instance recovery: looking for dead threadsSubmitted all GCS remote-cache requestsPost SMON to start 1st pass IRFix write in gcs resourcesReconfiguration completeBeginning instance recovery of 1 threadsparallel recovery started with 7 processesStarted redo scanCompleted redo scanread 18 KB redo, 14 data blocks need recoveryStarted redo application atThread 1: logseq 235, block 68352Recovery of Online Redo Log: Thread 1 Group 1 Seq 235 Reading mem 0&&Mem# 0: +DATA/raclhr/onlinelog/group_1.362.&&Mem# 1: +DATA/raclhr/onlinelog/group_1.361.Completed redo application of 0.01MBCompleted instance recovery atThread 1: logseq 235, block 68389, scn 972552714 data blocks read, 14 data blocks written, 18 redo k-bytes readThu Oct 13 15:51:33 2016minact-scn: Inst 2 is now the master inc#:6 mmon proc-id: status:0x7minact-scn status: grec-scn:0x0 gmin-scn:0xd9 gcalc-scn:0xe3minact-scn: master found reconf/inst-rec before recscn scan old-inc#:6 new-inc#:6Thread 1 advanced to log sequence 236 (thread recovery)Redo thread 1 internally disabled at seq 236 (SMON)Thu Oct 13 15:51:34 2016Thread 2 advanced to log sequence 265 (LGWR switch)&&Current log# 4 seq# 265 mem# 0: +DATA/raclhr/onlinelog/group_4.349.&&Current log# 4 seq# 265 mem# 1: +DATA/raclhr/onlinelog/group_4.348.Thu Oct 13 15:51:35 2016Archived Log entry 493 added for thread 1 sequence 235 ID 0x441b1480 dest 1:Thu Oct 13 15:51:35 2016ARC0: Archiving disabled thread 1 sequence 236Archived Log entry 494 added for thread 1 sequence 236 ID 0x441b1480 dest 1:Thu Oct 13 15:51:35 2016Archived Log entry 495 added for thread 2 sequence 264 ID 0x441b1480 dest 1:minact-scn: master continuing after IR
认证徽章论坛徽章:10
3.8.2&&介质恢复介质恢复是基于物理备份恢复数据,它是Oracle数据库出现介质故障时恢复的重要保障。介质恢复包括块恢复、数据文件恢复、表空间恢复和整个数据库的恢复。介质恢复主要是针对错误类型中的介质失败,如果是少量的块失败,那么可以使用介质恢复中的块恢复来快速修复;但如果是其它情况的丢失,那么需要根据具体情况,可使用数据文件恢复、表空间恢复甚至全库恢复,可以参考如下的表格: 错误分类恢复解决方案介质失败如果是少量的块损坏,使用块介质恢复;如果是大量的块、数据文件、表空间的损坏,可能需要对损坏的数据文件或者表空间执行完全恢复;如果是归档REDO日志文件或者联机REDO日志文件的丢失,那么只需要不完全恢复方式。逻辑损坏如果是程序员错误导致出现的问题,可通过补丁应用修复问题。对于无法修复的问题,也可采用介质恢复手段来恢复数据。用户错误根据不同用户错误,选择不同的FLASHBACK技术恢复,使用FLASHBACK技术恢复用户错误是首选方案。如果FLASHBACK不能很好的恢复数据再考虑使用介质恢复或者表空间时间点恢复。Oracle数据库的介质恢复实际上包含了两个过程:数据库还原(RESTORE)与数据库恢复(RECOVER)。数据库还原(RESTORE)是指利用备份的数据库文件来替换已经损坏的数据库文件或者将其恢复到一个新的位置。RMAN在进行还原操作时,会利用恢复目录(有建立恢复目录的话就使用目标数据库的控制文件)来获取备份信息,并从中选择最合适的备份进行修复操作。选择备份时有两个原则:1、选择距离恢复目录时刻最近;2、优先选择镜像复制,其次才是备份集。数据库恢复(RECOVER)是指数据文件的介质恢复,即为修复后的数据文件应用联机或归档日志,从而将修复的数据库文件更新到当前时刻或指定时刻下的状态。在执行恢复数据库时,需要使用RECOVER命令。还原是将某个时间点数据文件的拷贝再拷贝回去,还原后的数据库处于不一致性的状态,或不是最新的状态,还需要执行恢复操作。恢复就是使用归档REDO日志文件和联机REDO日志文件将不一致的数据库应用到一致性状态。需要注意的是,还原只是建立在数据库备份的基础版本上,例如,如果数据库备份包括0级备份和很多1级备份,还原只是应用0级备份,恢复过程会根据情况自动应用1级备份或REDO日志将数据库恢复到一致性的状态。数据库的恢复过程根据恢复数据的程度又分为完全恢复(Complete Recovery)和不完全恢复(Incomplete Recovery)。完全恢复是一种没有数据丢失的恢复方式,能够恢复到最新的联机REDO日志中已提交的数据。在传统恢复方式中,因介质失败破坏了数据文件之后,可以在数据库、表空间和数据文件上执行完全介质恢复。不完全恢复是一种与完全恢复相反的恢复方式,是一种丢失数据的恢复方式,也称为数据库基于时间点恢复(Point-in-Time Recovery),是将整个数据库恢复到之前的某个时间点、日志序列号或者SCN号。通常情况下,若FLASHBACK DATABASE没有启用或者变得无效,可以执行不完全恢复撤销一个用户错误。不完全恢复不一定在原有的数据库环境执行,可以在测试环境下执行不完全恢复,将找回的数据再重新导入生产库中。不完全恢复根据备份情况恢复到与指定时间、日志序列号和SCN具有一致性的数据,之后的数据都将丢失。执行不完全恢复一方面是因为归档REDO日志、联机REDO日志的丢失不得不执行不完全恢复,另一方面可能是因为在某个时刻错误地操作了数据,过了一段时间之后才发现问题,而其它的恢复手段都无法恢复数据,这时也不得不使用不完全恢复来找回数据。执行不完全恢复必须从备份中还原所有的数据文件,备份文件必须是要恢复的时间点之前创建的。当恢复完成,使用RESTLOGS选项打开数据库,将重新初始化联机Redo日志,创建一个新的日志序列号流,日志序列号从1开始,RESETLOGS之后的SCN还是在递增。如果是完全恢复,那么数据库就是最新的一致性状态;如果是不完全恢复,那么数据库是非最新的一致性状态。对于非归档模式的数据库来说,不能执行不完全恢复。不完全恢复的选项如下表所示:不完全恢复方式RMAN选项用户管理备份选项恢复到某个时间点UNTIL TIMEUNTIL TIME恢复到某个日志序列号UNTIL SUQUENCEUNTIL CANCEL恢复到某个SCN号UNTIL SCNUNTIL CHANGE不完全恢复的几种类型如下表所示(注意:下图是小麦苗即将出版的书上的一个表格,现在提前分享给大家): 综上所述,恢复的分类大致可以如下图所示的分类(注意:下图也是小麦苗即将出版的书上的一个表格,现在提前分享给大家): 3.8.3&&实例恢复和介质恢复的区别(注意:下图也是小麦苗即将出版的书上的一个表格,现在提前分享给大家)
About Me...............................................................................................................................● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用● 本文在itpub([url=]http://blog.itpub.net/[/url])、博客园([url=]/lhrbest[/url])和个人微信公众号([url=]xiaomaimiaolhr[/url])上有同步更新● 本文itpub地址:[url=]http://blog.itpub.net//viewspace-2126407/[/url]● 本文博客园地址:● 本文pdf版:[url=]/cdEQedhCs2kFz[/url] (提取码:ed9b)● 小麦苗云盘地址:[url=]http://blog.itpub.net//viewspace-1624453/[/url]● QQ群:&&& &微信群:私聊● 联系我请加QQ好友(),注明添加缘由● 于 2016-10-08 15:00~
23:00 在中行完成● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解!● 【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】...............................................................................................................................手机长按下图识别二维码或微信客户端扫描下边的二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,免费学习最实用的数据库技术。
论坛徽章:0
附件下载不了呢。
认证徽章论坛徽章:10
附件下载不了呢。
可以连接到我博客去下载,谢谢
认证徽章论坛徽章:2
已下,写的很不错。
论坛徽章:7
写的不错,可是360云盘下载不了呀
认证徽章论坛徽章:10
写的不错,可是360云盘下载不了呀
360被强制取消了,可以去我的微云下载
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号}

我要回帖

更多关于 酷派大神f2 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信