使用SQL*Plus生产CSV格式数据

使用SQL*Plus生产CSV格式数据 #工程师培训 #sqlplus# 因为Excel、很多BI工具、甚至一些数据库,都支持直接导入CSV(comma separated value)格式数据,所以一直以来,我们都有将Oracle数据库中表的数据行导出成为CSV格式的需求。从Oracle 12.2.0.1开始,SQL*Plus支持将查询输出为CSV格式。本文对此新特性进行演示。 演示环境 [SQL*Plus] CREATE TABLE BOOKS (
 BOOK_ID NUMBER GENERATED ALWAYS AS IDENTITY,
 TITLE VARCHAR2(250) NOT NULL,
 PAGES NUMBER NOT NULL,
 AUTHOR VARCHAR2(250) NOT NULL,
 CONDITION VARCHAR2(4000),
 CONSTRAINT BOOKS_PK PRIMARY KEY (BOOK_ID),
 CONSTRAINT BOOKS_UQ UNIQUE (TITLE)
);
 
[SQL*Plus] INSERT INTO BOOKS (TITLE, PAGES, AUTHOR, CONDITION) VALUES ('The Hobbit', 322, 'J.

检查Oracle redo log切换频率的SQL

这个SQL的特点是模拟日历(Calendar)形式,显示每小时产生的redo log数量: SELECT * FROM (SELECT A.* FROM (SELECT * FROM (SELECT TO_DATE(b.date_time, 'DD/MM/YYYY') dt,TO_CHAR(TO_DATE(b.date_time, 'DD/MM/YYYY'), 'DAY') DAY,"00", "01", "02", "03", "04", "05", "06", "07", "08", "09","10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", TOTALFROM (SELECT date_time,SUM(DECODE(HOUR,'00',1,NULL)) "00", SUM(DECODE(HOUR,'01',1,NULL)) "01", SUM(DECODE(HOUR,'02',1,NULL)) "02",SUM(DECODE(HOUR,'03',1,NULL)) "03", SUM(DECODE(HOUR,'04',1,NULL)) "04", SUM(DECODE(HOUR,'05',1,NULL)) "05",SUM(DECODE(HOUR,'06',1,NULL)) "06", SUM(DECODE(HOUR,'07',1,NULL))

获取用户User,对象Object的DDL定义

  获取用户、用户权限的DDL语句 [code language="sql"]set feedback off pages 0 long 90000 serveroutput onaccept USERNAME prompt "Enter username :" [/code] 获取对象、相关对象的DDL 特定表的DDL: [code language="sql"]SET LONG 2000000 SET PAGESIZE 0 SELECT DBMS_METADATA.GET_DDL(TABLE,EMP’,’SCOTT’) FROM DUAL; [/code]   获取表相关的授权: [code language="sql"]SET LONG 2000000 SET PAGESIZE 0 SELECT DBMS_METADATA.GET_DEPENDENT_DDL(‘OBJECT_GRANT’,’EMP’,’SCOTT’) FROM DUAL; [/code]   获取指定schema(这里用scott举例)的所有表DDL: [code language="sql"]-- ### Schema all object DDL

VEGA Transform功能

  Vega 学习 #BI/大数据 Transform aggregate 聚合操作,fields 和 ops 两个数组对应,产生的结果在as 属性中指明: [ {“foo”: 1, "bar": 1}, {“foo”: 1, “bar”: 2}, {“foo”: null, “bar”: 3} ] 执行aggregate 转换 { “type”: "aggregate”, “fields”: [“foo”, “bar”, “bar”], “ops”: [“valid”, “sum”, “median”], "as": ["v", "s", "m"] } 结果 [{“v”: 2, "s": 6, "m”: 2}] 以上是对所有数据集进行聚合操作,结果为1行数据,可使用groupby,产生分组数据: [ {“foo”: "a", "bar”:

打开JDK及其他底层API日志接口,诊断程序问题

#Java/JMX 遇到一个问题,使用JMX 连接Tomcat,连接的IP是10.1.0.?,在创建连接的时候,会抛出网络连接超时的Exception,迷茫的是,Exception中提示是10.0.0.?的网络连接超时。 一时各种怀疑,但是都找不到问题;后在stackoverflow 上找到打开JMX日志的方式,觉得此方法具有解决这一类问题的通适性。 创建属性文件(.properties)```handlers= java.util.logging.ConsoleHandler.level=ALL java.util.logging.FileHandler.pattern = jmx.logjava.util.logging.FileHandler.limit = 50000java.util.logging.FileHandler.count = 1java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter java.util.logging.ConsoleHandler.level = FINESTjava.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter // Use FINER or FINEST for javax.management.remote.level - FINEST is// very verbose...//javax.management.level=FINESTjavax.management.remote.level=FINEST java.security.debug=all``` 在调用测试程序时,配置使用上述属性文件:```java -Djava.util.logging.config.file=./logging.properties JMXDemoClient ``` _假设你的测试程序被编译为 JMXDemoClient.class_ 通过这种方式,在我的案例中,日志清楚的显示,是JMX Server(此处是Tomcat)要客户端去跟10.0.0.? 连接;所以一定是Tomcat端的配置有问题,进行检查后,发现服务器IP地址变更后,`java.rmi.server.hostname` 没有做更新,仍然是原来的IP地址。 总结: 通过调整属性文件,可以输出任意底层API的各种级别日志。

使用Logstash JDBC获取Oracle数据的小问题

需要将Oracle中的数据,通过Logstash JDBC input插件,写入到Elasticsearch中,遇到了一个因为时间类型设置不正确导致的性能问题。为了能够不断的将数据增量写入Elasticsearch,做了如下配置: record_last_run => true        tracking_column => "mark_datetime"       tracking_column_type => "timestamp"        use_column_value => true 这里设置tracking_column_type出现了问题,数据库表中mark_datetime字段是Date类型。虽然整个pipline能够运行无误,但是运行效率发现不够好。到Oracle数据库中检查,发现SQL语句变成了 SYS_EXTRACT_UTC("M"."MARK_DATETIME")>TIMESTAMP' 2015-07-19 11:17:03.000000000’ 这就导致了MARK_DATETIME上现有的索引不能使用。Oracle在Date和Timestamp之间自动做了转换。

Run Blessed-contrib on windows

  With blessed-contrib it is easy to create terminal dashboards using ascii-art: blessed-contrib uses Braille fonts which are available by default on Linux and Mac distributions but not on Windows: In order to run such dashboards on windows you need to perform the following steps: 1. Download, open and install the FreeMono font.2. Follow these

Elasticsearch vs. Hadoop For Advanced Analytics

A Tale of Two Platforms Elasticsearch 是卓越的文档索引以及全文检索工具。其基于JSON的DSL(Domain Specific query Language)简单而又强大(我觉得比SQL还差得远,好在近期新的版本发布了Elastic SQL :),使得其成为web app中集成搜索引擎的事实上的标准。那么作为analytics 后端是否胜任呢? 我们是否真的找到了一个“Hadoop”杀手呢? 首先来回忆一下一个高级“分析”系统一般都是如何构建的。开始的时候,你的app可能只需要像“mixpanel”或者“Google Analytics”这样的功能就够了,随着系统发展,产品经理的问题变得越来越难以回答: “What's the completion rate for femail Chinese users in my newly defined cohort X through the revamped user action funnel Y?” 这一问题需要cohort X的用户数据被摄取、标记出来后,再执行自定义查询来回答。为解答此问题,你需要开始收集访问日志数据,构建一个完全的“分析流水线”。经过一番调研后你会发现,有不少已有的解决方案是构建于Hadoop基础之上的,但是越来越多的开发者开始考虑使用Elasticsearch来做这件事情。怎么会这样的?一个搜索引擎真的会适合“分析”工作么? Elasticsearch For Analytics Elastic的ELK分析套件,包括Logstash(负责搜集服务器端日志)、Kibana(可视化窗口)在web分析应用中,得到了很多应用,因为: 1. 首先你非常容易运行起一个Elasticsearch实例 2. Elasticsearch 基于JSON的查询语言比Hadoop的MapReduce要容易操作的多 3. 对于应用开发者,Elasticsearch是工具箱中的一个已有工具,而Hadoop套件可能需要他们去全新的学习 这些原因,导致那些需要快速启动、运行分析需求解决方案的,会更倾向于选择Elasticsearch。但是一个搜索引擎,用他们执行“数据摄取”、数据分析工作,比起像Hadoop这样的具备高度扩展能力的分布式数据处理平台,其表现如何呢? Streaming Ingestion(流式数据摄取) 很多团队,会被Elasticsearch

删除Oracle Undo表空间

近期处理了一次删除、重建Undo表空间的事情,有些细节还是值得记下来备忘。事情的起因是工程师需要将分布在不同ASM磁盘组里的Oracle数据库文件,迁移到新建的ASM磁盘组,操作过程中,错误的删除了Undo磁盘组的所有文件。版本 11.2.0.4, RAC环境——测试、准生产环境;下文操作不保证在“生产环境”无害。 Step 1: 考虑新建Undo Tablespace,然后修改各个实例(Instance)的Undo_Tablespace 参数,使用新的Undo,然后删除老的Undo 表空间。 Step 2: 发现,此时无法新建表空间,报错Undo表空间的数据文件不可访问。 分析:我没有去细究原因,我想原因可能有两个,1是因为使用自动Undo管理,创建表空间的操作也需要获取Undo,所以报错??2是因为新建表空间,会触发类似checkpoint之类操作,有Active Tx还需要访问Undo?? Step 3:   修改undo_management=manual,再重试之前步骤 alter system set undo_management=manual sid=‘*’; Step 4: drop tablespace undotbs1 including contents and datafiles; Step 5: drop tablespace UNDOTBS2 including contents and datafiles * ERROR at line 1: ORA-01548: active rollback segment ‘_SYSSMU1_3780397527$’ found, terminate dropping tablespace

Node.js Step 的使用

## 解决的问题 在Node.js中,绝大多数实际业务操作都是异步调用,比如文件IO,数据库操作,网络IO等等…… 当这些“耗时”操作完成后,会调用特定的操作,进行后续处理(这个后续的操作被称作callback 函数,作为之前的异步操作调用的最后一个参数)。 如果一个后台调用包含如下步骤: 1. 读取数据库,成功后, 2. 调用ERP接口,下生产订单,成功后, 3. 发送Email通知,成功后, 4. 写入数据库 这样的话,第一个调用的最后一个参数是步骤2对应的callback方法,这个方法再调用步骤3方法、再调用步骤4方法…… 整个效果,就是代码缩进后,越来越往右偏。Step就是为了解决这个问题,以一种“非嵌套”的方式,实现之前的这种调用结构。 ## 如何使用 step 库对外提供唯一的函数——Step。这个函数接受多个函数作为输入参数,这些参数对应的函数,其callback函数(*最后一个参数*)如果是 _this_,Step就会把下一个参数对应的函数,作为前一个函数调用的callback方法。 Step ( function readSelf() { fs.readFile(__filename, this); }, function capitalize(err, text) { if (err) throw err; return text.toUpperCase(); }, function showIt(err, newText) { if (err) throw err; console.log(newText); } ); 上例,第一个参数readSelf,包含一个异步调用readFile,我们在该传入callback 函数的位置,传入this。这就保证在异步操作完成后(readFile结束),Step会将读取的文件内容传递到下一个参数对应的函数(这个函数的格式像是普通的callback函数,第一个参数是err,第二个参数表示操作成功后获取的data)。本例中,第二个参数内执行的是“同步”操作,只需要直接return 结果。Step 会将结果,传递到下一个参数对应的函数showIt。