RMAN> backup as copy datafile 5 format'/u01/oracle/10g/oradata/gt10g/gtlions01.dbf';
Starting backup at 25-FEB-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile fno=00005 name=+DATA01/gt10g/datafile/gtlions.258.808326729
outputfilename=/u01/oracle/10g/oradata/gt10g/gtlions01.dbf tag=TAG20130225T152239recid=121 stamp=808327359
channel ORA_DISK_1: datafile copy complete,elapsed time: 00:00:01
Finished backup at 25-FEB-13
RMAN> backup as copy datafile 6 format'/u01/oracle/10g/oradata/gt10g/gtlions02.dbf';
Starting backup at 25-FEB-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile fno=00006name=+DATA01/gt10g/datafile/gtlions.265.808326737
outputfilename=/u01/oracle/10g/oradata/gt10g/gtlions02.dbf tag=TAG20130225T152247recid=122 stamp=808327367
channel ORA_DISK_1: datafile copy complete,elapsed time: 00:00:01
Finished backup at 25-FEB-13
RMAN> switch datafile 5 to copy;
datafile 5 switched to datafile copy"/u01/oracle/10g/oradata/gt10g/gtlions01.dbf"
RMAN> switch datafile 6 to copy;
datafile 6 switched to datafile copy"/u01/oracle/10g/oradata/gt10g/gtlions02.dbf"
RMAN> sql 'alter tablespace gtlions online';
sql statement: alter tablespace gtlions online
RMAN> report schema;
Report of database schema
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- -------------------------------
1 440 SYSTEM *** /u01/oracle/10g/oradata/gt10g/system01.dbf
2 25 UNDOTBS1 *** /u01/oracle/10g/oradata/gt10g/undotbs1.dbf
3 250 SYSAUX *** /u01/oracle/10g/oradata/gt10g/sysaux01.dbf
4 5 USERS *** /u01/oracle/10g/oradata/gt10g/users01.dbf
5 10 GTLIONS *** /u01/oracle/10g/oradata/gt10g/gtlions01.dbf
6 10 GTLIONS *** /u01/oracle/10g/oradata/gt10g/gtlions02.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- -------------------------------
1 100 TEMP 100 /u01/oracle/10g/oradata/gt10g/temp01.dbf
4 100 GTLIONSTEMP 100 /u01/oracle/10g/oradata/gt10g/gtlionstemp01.dbf
SQL> Select ts#,Name From v$tablespace WhereName='GTLIONS'
2 Union All
3 Select file#,Name From v$datafile Wherets#=7;
TS# NAME
--- --------------------------------------------------
7 GTLIONS
5/u01/oracle/10g/oradata/gt10g/gtlions01.dbf
6/u01/oracle/10g/oradata/gt10g/gtlions02.dbf
-The End-
author:skate
time:2013/02/25
mysql监控管理工具--innotop
INNOTOP是一个通过文本模式显示MySQL和InnoDB的监测工具。INNOTOP是用PERL语言写成的,这使它能更加灵活的使用在各种操作平台之上,它能详细的的监控出当前MYSQL和INNODB运行的状态,以DBA根据结果,可以合理的优化MYSQL,让MYSQL更稳定更高效的运行。
1.innotop安装
参考官网:http://innotop.googlecode.com/svn/html/installing.html
# wget http://innotop.googlecode.com/files/innotop-1.9.0.tar.gz
# tar -zxvf innotop-1.9.0.tar.gz
# cd innotop-1.9.0
安装INNOTOP工具非常简单,其是由PERL写的,当然需要PERL环境和相关的工具包。在安装之前先要确定你的系统安装了Time::HiRes,Term::ReadKey,DBI,DBD::mysql这四个包
# perl -MCPAN -eshell
CPAN> install Time::HiRes
CPAN> install Term::ReadKey
CPAN> install DBI
CPAN> install DBD::mysql
在解压缩后的源码路径下有安装帮助文件,如下:
# perl Makefile.PL
如果没有报错,然后,使用
# make install
这样就安装 innotop,安装之后系统就会多出一个命令,innotop
得到帮助
# innptop --help
2.使用方法
参考官网:http://innotop.googlecode.com/svn/html/manual.html
使用方法:
# innotop -uroot -proot -h127.0.0.1
[root@racdb2 innotop-1.9.0]# innotop -uroot -proot -h127.0.0.1
[RO] Dashboard (? for help) 127.0.0.1, 3h, 0.06 QPS, 2/1/0 con/run/cac thds, 5.1.67-log
Uptime MaxSQL ReplLag Cxns Lock QPS QPS Run Run Tbls Repl SQL
3h 2 0 0.06 13 Off
输入“?”得到帮助
Switch to a different mode:
A Dashboard I InnoDB I/O Info Q Query List
B InnoDB Buffers K InnoDB Lock Waits R InnoDB Row Ops
C Command Summary L Locks S Variables & Status
D InnoDB Deadlocks M Replication Status T InnoDB Txns
F InnoDB FK Err O Open Tables U User Statistics
Actions:
d Change refresh interval p Pause innotop
k Kill a query's connection q Quit innotop
n Switch to the next connection x Kill a query
Other:
TAB Switch to the next server group / Quickly filter what you see
! Show license and warranty = Toggle aggregation
# Select/create server groups @ Select/create server connections
$ Edit configuration settings \ Clear quick-filters
Press any key to continue
可以用innotop监控mysql,例如可以看当前正在运行的sql,并查看执行计划,如下:
进入innotop时,按shift+q进入sql查询列表,
When Load Cxns QPS Slow Se/In/Up/De% QCacheHit KCacheHit BpsIn BpsOut
Now 0.10 2 0.46 0 0/ 0/ 0/ 0 0.00% 100.00% 19.79 1.11k
Total 0.00 151 0.08 5 2/ 0/ 0/ 0 4.17% 100.00% 3.29 223.67
Cmd ID State User Host DB Time Query
Query 1 Sending data root localhost test 03:20 insert into user select * from user
Query 21 Locked root localhost test 00:04 insert into user select * from user
Select a thread to analyze: 21
然后按e并输入thread ID显示执行计划或者按f显示完整sql语句,或者按o显示系统优化过的语句(需要MySQL的版本支持EXPLAIN EXTENDED)
EXPLAIN PARTITIONS
select * from user
____ Sub-Part 1 _____
Select Type: SIMPLE
Table: user
Partitions:
Type: ALL
Poss. Keys:
Index:
Key Length:
Index Ref:
Row Count: 41943040
Special:
[This query has been re-written to be explainable]
Press e to explain, f for full query, o for optimized query
innotop是通过information_schema.processlist来获得完整的sql语句,并且根据COMMAND来过滤掉空闲线程的
---end---
现代应用程序再也不会从第一个字节写起了。 使用现有的开发框架和组件,能够充分利用软件的杠杆效应, 以更小的代价更快地构建应用程序,这诚然值得鼓舞,但也有一些注意事项:
1. 使用开发框架, 并不是没有代价的。只是将开发和测试基础设施的成本转移到学习、使用和维护成本上。为了使学习和使用成本远低于开发和测试基础设施的成本,最大化复用框架和组件的益处, 这就要求, 尽可能选择优质、可靠的组件和框架,适应项目的需求, 而不要随意拍板,结果中途更换,导致大量中期或后期成本,得不偿失; 此外, 选择的框架和组件的学习和使用成本应该尽可能低一点;
2. 使用开发框架通常是“所得”远超出预期,本来只需要一个轮胎, 却给了一辆完整的车。 虽然依靠经过仔细测试的框架比手工重新开发要强一些, 但往往框架也带来了一些意料之外的复杂性。 当框架相关的部分出问题时,调试是一件很棘手的事情。
如何调试框架交互的问题呢? ( 关于软件调试的基本方法和技巧, 详见 《谈点软件调试》 )
我最近遇到一两例,初步总结的方法是: 源码 + 关键断点 + 单步调试 + 大胆猜测和定位 + 验证 + 耐心。
我遇到的问题是这样的。项目使用 Spring + Hibernate + proxool 实现数据库连接管理和访问。 需求是实现多数据源的动态配置和加载使用。 思路是:
1. 用一个类 AdvancedDataSourceInitizer 实现 ApplicationContextAware 接口,当发布 ContextRefreshEvent 事件时, 从数据库中读取数据库配置,转化为 ProxoolDataSource 对象,并存入到一个 Map<dataSourceName, ProxoolDataSource> 中;
2. 用一个类 SpringEventPublisher 实现 ApplicationListener 当应用启动时,以及增删更新数据库配置时, 发布 ContextRefreshEvent 事件, 触发动态加载数据源的行为;
3. 用一个类MapDataSource 继承 AbstractRoutingDataSource 来定位和切换数据源。
上述三个类的BEAN实例都可以直接配置在Spring 文件中。
可是在实际使用中,却无法正确切换数据源,总是只能切换到第一个使用的数据源。 后经查证, 发现必须设置 Proxool 别名,及连接数。
public static ProxoolDataSource cluconfig2DataSource(ClusterConfig cc) {
ProxoolDataSource pds = new ProxoolDataSource();
pds.setDriverUrl(/blog_article/index.html);
...
pds.setAlias(cc.getDataSource()); // 必须有这一行及下面几行, 否则难以起作用。
pds.setMinimumConnectionCount(5);
pds.setMaximumConnectionCount(50);
pds.setPrototypeCount(10);
}
整个调试过程如下:
首先,前提是准备好源码,可以使用 Eclipse 的 MAVEN 插件下载。选中指定的JAR包,右键 Maven ---> Download sources ,放在指定 \.m2\repository 目录下。 Windows 下一般放在 Documents and settings\用户目录\.m2\repository\ ; Linux 下一般放在 ~/.m2/repository/ 。 当单步调试时,若缺乏相应类的源码包, 会出现 Source Look up 界面及按钮, 点击添加源码包之后,该界面就会变成相应类的源码界面。建议使用项目构建工具 Maven 等,而不是手工从官网上搜索下载。
由于框架交互的代码很多地方都可能出问题,因此, 只能采用单步调试; 但一行行执行太慢, 因此, 需要根据出错特征进行分析,设置一些关键断点。比如,这里的关键点有: 设置 dataSourceName 的地方(验证确实传入了正确的数据源的 key ), 获取 DataSource的地方(验证确实定位得到了相对应的数据源对象),获取 Connection 的地方(验证确实获得了正确的数据库连接)等。注意,使用 Debug 模式运行,就是有小虫的那个图标,而不是右箭头图标。 通过单步调试,可以知道获取 proxool 数据库连接的具体过程如下(画成UML序列图更佳):
DataSourceHolder.setDataSource(dataSourceName) ---> AbstractRoutingDataSource.determineTargetDataSource(dataSourceName) ---> ProxoolDataSource ---> ProxoolDataSource.getConnection() ---> ConnectionPool.getConnection() ---> proxyConnections.getConnection(nextAvailableConnection)
发现在这里抛出了 IndexOutOfBoundsException 异常。 proxyConnections 中并未含有刚刚切换的数据源的连接,而我假定的是, 应该由 Proxool 自动预先创建若干个连接放在相应连接池里面的。 在代码里设置了连接数后,成功了; 其后还出现一次类似错误, 是通过设置别名而解决的。
因为假定Proxool 会预先自动创建默认连接数的(静态配置文件中没有设置连接数是可用的,网上诸多文章也讲到存在默认连接数的),并且以为别名是无关紧要的, 没想到在这里出了错。 所以说,不能随便作假设,但 Proxool 切换数据源依赖于别名,这一点也挺让人吃惊。
调试框架交互的问题还需要耐心。 因为出错的具体地方可能分布在任何意料之外的位置, 有可能在认为不相关的地方直接跳过了, 需要返回去再定位之前的位置,反复如此,直到一步步接近出错的位置。比如,开始在定位问题的时候, 并没有做很详细的分析,而是较随意地单步加跳跃执行,从 Spring 源码跳转到 Proxool 的源码 跳转到 Hibernate 的源码再跳回到 Spring , 不亦乐乎, 后来终于发现了一点小线索,逐步缩小范围,最终定位到问题所在。 今天一整天的功夫就用来调试切换数据源所出现的这两个问题。这多少说明, 使用开发框架会增大调试的难度, 增加一些维护的成本。
主要收获是: 终于成功调试了一个关于框架交互的问题,有一种“跨越框架”的感觉,:) —— 调试业务逻辑代码的 BUG 都不在话下了。
如何选用合适的框架呢?
1. 项目需求是最关键的考虑。 当然, 有时候, 不一定能很容易根据需求确定该使用哪种开发框架;
2. 选择主流、优质、可靠的开发框架,学习和使用都更有益处;
3. 阅读关于开发框架优缺点对比的文章,一方面了解特定的框架作出决定,另一方面亦可增加关于技术选型方面的知识;
4. 可能暂时使用何种框架区别不大, 但公司内部出于统一框架的使用和维护成本的考虑;
5. 最后,依然需要丰富的实际经验作为指导。