Category Archives: Technical Article

Oracle 10g RAC Versus DataGuard For High Availability

Oracle has two very different technologies, each with it’s own strengths and weaknesses that implement high availability solutions. In choosing between the two technologies, it’s important to factor in the relevant risks, both small and large, to put the entire picture into perspective.

Two Alternatives

RAC or Real Application Clusters, is essentially an always-on solution. You have multiple instances or servers accessing the same database on shared storage in your network. With existing technology limitations, in practical terms, these different servers must be on the same local network, in the same datacenter.

Oracle’s DataGuard technology, formerly called Standby database in previous versions, provides a rolling copy of your production database. The standby database is started in read-only mode, constantly receiving change data, sent over from the production database, keeping it always in sync at all times, and at most only a few minutes behind. Were the production server to fail, that server could take over in less than the time the DNS change or IP swap would take. What’s more the standby copy can be at another datacenter, or on another continent!

Software Failure

Before we compare the strengths and weaknesses, let’s talk about software risks. In the real-world, you can have operator errors, which means someone made a mistake at the keyboard, or someone decided to drop the wrong table, and realized only later their mistake. None of these solutions protect you from that. You would have to recover either point-in-time, or from an export. You could also encounter bugs in software that could cause a crash (downtime) or corruption (data loss and downtime to repair). There are also potential configuration errors, so the more components you have the more potential problems. And then lastly there is the risk of buying into technologies for which experienced help is hard to find.

Hardware Failure

You could have hardware failure of your server, motherboard, memory, nic card, or related problems. You could also have failure of a powersupply in the disk subsystem, failure of one of those boards, or of the fibre channel switch or IP switch. Hence redundancy in these areas is crucial as well. But you can also have power failure on that floor or in the datacenter as a whole, or someone could trip the chord.

Larger Failures

Also in a very real sense, the power grid is at some risk. If the Northeast is any indication, a 24 hours of outage every 20-30 years is not unusual. Beyond power, their is the potential for fires earthquakes, and other natural disasters.

Strengths and Weaknesses

For RAC, it’s strength is it’s always-on aspect. The second instance is always available, so in as much as hardware failure at the server level goes, it protects you very well.

In terms of weaknesses, however, anything outside the server, disk subsystem, power grid failure, or natural disaster that impacts the hosting facility, it does not protect you against. Furthermore there are more software components in the mix, so more software that will have bugs, and hurdles you can stumble over. Lastly, it may be harder to find resources who have experience with RAC, as it certainly is a bigger can of worms to administer.

For DataGuard, it’s strength is that the failover server can be physically remote, even on another continent. This really brings peace of mind, as everything is physically separate. It will survive any failure in the primary system.

In terms of weaknesses, however, there is a slight lag, depending on network latency, amount of change data being generated, and how in-sync you keep the two systems.


In 10g, Oracle really brings to the table world-class High Availability solutions. Both DataGuard and RAC have their strengths and weaknesses. Some sites even use both. Each makes sense in particular circumstances but more often than not, DataGuard will prove to be a robust solution for most enterprises.

Oracle & Open Source Projects – The Interviews

Back in 2000 I recall searching for Open Source projects to cover in the book I wrote Oracle and Open Source. My co-author and I found seven web-based applications, a few with Perl and Tcl, four Java tools, and five GTK applications. A search for the keyword “Oracle” on freshmeat a popular Open Source project indexing page, now yields an incredible 184 projects. Granted some may be libraries, or supporting components, but its a heck of a lot of activity.

This story is really about tinkerers, folks that like to play with technologies, and offer up their creations to everyone. Some

end up with serious projects on their hands, and a large following. When Oracle ported to Linux, it was a moment for the tinkerers to get busy.

We’ve managed to contact the authors of six Oracle Open Source projects, and ask them a few questions about their projects, and how they got started. The authors include:

Ljubomir Buturovic, author of gqlplus

Itzchak Rehberg, author of OraRep

Jeff Horwitz, author of extproc_perl

Paul Vallee, the author of

Tim Strehle, author of the OracleEditor

Clausen Yngve, author of ora2html

In 1998 Oracle released it’s Enterprise database for Linux. Truth be told, there were a few of us out there trying to get Oracle 7 SCO binaries working under a Linux emulator and had some success. Nevertheless rumors were running around on the Oracle DBA email lists that inside Oracle, porting had already been finished, and it was just a matter of time. So October of 1998 was an exciting moment, for it meant that tinkerers could start really getting their hands dirty with Oracle. And that they did. Around that time I started an Open Source project called Karma solely to monitor Oracle databases. It got some attention but further, drew me into Open Source development, where before I had just been an enthusiast who utilized the tools and applications everyday. Then in 2000 I started to collaborate on a book for O’Reilly entitled Oracle and Open Source. This was released in April 2001, and brought my attention to the growing world of Open Source applications and tools for Oracle.

With that introduction, here are the six questions we asked each of the authors.

1. Some people got their start with Open Source at a University, doing development with gcc, or using other GNU tools, and naturally gravited to Linux when the project began. When did you first get involved with open source software, and what were your first experiences?

2. When did you first decide to start your own open source project and what motivated you most?

3. In your own words, what does you application, tool or library do? What are it’s primary or outstanding features?

4. How did you get involved with Oracle? Were you using the Oracle database before Oracle ported to Linux? As a developer or DBA?

5. Where do you see your development efforts with Oracle moving in the future? What would you like to see happen to your project?

6. What might you like to see Oracle doing more of to encourage development of Open Source applications?

Ljubomir Buturovic, author of gqlplus answers the six questions as follows:

1. I first started using Emacs and gcc in 1992, doing research at Boston University. Later on, as a UNIX developer in 1995, a colleague told me about a free UNIX variant you could run on your own home computer. That’s how I got involved with Linux.

2. I wrote this tool (gqlplus) because I needed it to improve my work productivity. Then I decided I should release it for two reasons:

– it is a relatively simple utility which would not be too difficult to maintain

– a couple of colleagues told me that they like it and that other Oracle users may benefit from it

3. In a word, gqlplus is sqlplus with command-line editing, name completion and command history. As most Oracle users know, sqlplus is somewhat inconvenient when it comes to repeating past commands, correcting typing mistakes, issuing slightly different queries etc. gqlplus alleviates this problem by incorporating SQL command editing similar to UNIX shell (bash/tcsh). In addition, it also has table-name and column-name completion, so you don’t have to remember long or cryptic names. And it’s a drop-in replacement for sqlplus, meaning (almost) everything works exactly the same as sqlplus, except that there is the new added functionality.

4. I’ve been using Oracle on various UNIX system since 1996 as a developer. I have only recently – 2004 – tried running Oracle on Linux.

5. I would like to see Oracle incorporate this functionality in sqlplus, which would make my project obsolete 🙂 Not that I don’t want to maintain it, but there are some functions which can only be supported by changing sqlplus internally, so that’s what I would prefer Oracle to do.

6. I would suggest continue improving support for a wider range of Linux distributions, for example Fedora. Right now Oracle installation on Fedora is decidedly non-trivial exercise which may discourage some potential users

Itzchak Rehberg, author of OraRep had this to say:

1/2. That is already about 10 years ago, and I was running OS/2 at that time. I missed some little utilities, so I decided to write them on my own. Since I was using the script language Rexx for this, these utilities became Open Source as a side effect.

After having started developing my own tools this way, I found Open Source very useful: I could take ideas and even routines from other projects easily without any “permission” or license problems. I was using other Open Source programs, and this way could give back something to the community. So I decided to take the GPL for all of my developments, as far as possible.

Meanwhile I switched to Linux some years ago, and mainly develop in PHP. I ran and run multiple projects for different purposes, all of them are using the GPL. A list of programs/scripts and more details on them you can find at:

– (my private and personal site)

– (my business site)

3. Since I had to answer this question for more than one or two applications, please refer to the links quoted for question 1.

4. I was working for a company about 5 years ago, mainly as a developer for PHP based web applications. Since the company was running not only MySQL (I was already used to), but also Oracle databases, I got involved into that. First by writing PHP applications that accessed Oracle databases, together with the problem setting up PHP accordingly. Later on, I became the Oracle DBA for the company by running through the Oracle certification program (becoming an OCP DBA). That was after Oracle was ported to Linux: While the production databases where running under Solaris 8, some of our test databases have been set up under Linux.

5. Not easy to answer globally. For me personally, I would like to see an easier integration of Oracle into PHP, e.g. by providing an appropriate module that would be easy to plug in. At the moment, it is quite tricky to set it up, and you can’t do that easily with an RPM paket or the like but rather have to re-compile everything from the scratch. If the PHP setup for the Oracle connections would be as easy as copy a few files and add a line to the php.ini (i.e. setting up an extension), I would provide Oracle support to more of my applications, which right now only support MySQL and PostgreSQL, which belong to the “shipped” PHP contributions.

6. See above. PHP got quite common for web development. Oracle databases are quite common in commercial environments. To bring both together, and encourage developers to support Oracle databases with their PHP/database driven applications, an easy integration of Oracle into PHP would help a lot!

These answers are from Jeff Horwitz, author of extproc_perl.

1. That’s exactly where I got started. I was a student programmer at the University of Michigan when I was first exposed to open source software. At first I was limited to just downloading, porting, and compiling various packages, but in time I began writing my own software. In 1997 I wrote my first open source package, Authen::Krb4, which provides a Perl API to Kerberos 4.

2. Each project is different, but I assume you want to talk about extproc_perl, which is the only Oracle project on my plate. As a system administrator, I work very closely with our DBA. Knowing my experience with Perl, he commented to me one day, “Gee Jeff, wouldn’t it be nice if I could use regular expressions in my select statement?” Now, this was back in 2001, long before 10g’s regular expression support. I took that as a personal challenge, and that night, extproc_perl was born.

3. extproc_perl embeds a Perl interpeter in an Oracle external procedure, allowing you to write stored procedures in Perl. Among other things, it supports per-session interpreter persistence, the ability to query/update the database within the existing transaction, and automatic type conversion between Oracle and Perl. The most intriguing feature though, is the ability to leverage the vast number of modules in CPAN (the official Perl module archive) for your stored procedures.

4. I’ve been a system administrator at a university and two companies that all happened to use Oracle. I think the first time I actually developed anything for it was back in 1997, well before the Linux port. But I’m still just a sysadmin, and I rely on my friendly DBA for most database tasks. For someone who has done what I’ve done with Oracle, I know surprisingly little about it!

5. As I’m involved with several open source projects, my involvement on each of them, including extproc_perl, tends to ebb and flow like the tides. Development stalled on extproc_perl in mid-2004 as I began work on a new project, but I expect to get back into the swing of things for another release in 2005.

6. Get the word out. Publicize projects that use Oracle in an open source environment. Most people are simply not aware of the quality open source projects that are available to them, and rely on vendors like Oracle to tell them how to do X, Y, and Z. That’s all well and good for what Oracle does best, but as we like to say in the Perl world, there’s more than one way to do it.

We interview Paul Vallee, the author of, and here’s what he had to say.

1. Well, at Pythian we’ve been running Oracle on Linux for our customers since around 1999, so our experience with open source software started primarily as a beneficiary. We really love the cost savings and flexibility it provides, not to mention the dramatic pace of feature improvements all along the stack.

2. When we first wrote, it was in support of a single migration and interfacing project for a client. Our contract with the client had us owning the intellectual property we built, and yet we had no anticipated use for the software once the project was over. What a waste! So we decided to open-source it because we felt that that would allow the work to be reused in other shops.

3. Well, is a very simple tool that does a very simple thing: it takes mysql create syntax and parses it, then outputs it back into Oracle-compatible create syntax.

4. I first worked with Oracle when it was Oracle 5 on… believe it or not… PC-DOS! I was a developer tasked with a statistical macrosimulation analysis of defense human resources data and we had Oracle 5 and SAS to choose from. I’m embarassed now to admit that for this purpose, SAS beat out Oracle handily. However, since then I’ve continuously worked with Oracle primarily as a DBA and DBA manager. In 1997, I co-founded Pythian Remote DBA and to this day our primary support focus is the Oracle database.

5. Honestly, I am amazed at how much interest the project receives and how many hits I get on our website directly related to m2o. However, if there’s one bone of contention or disappointment is the ratio of feature quibbles to patches I get – Most of the feedback I receive sounds a lot more like “your software didn’t handle this correctly” and not a lot like “here’s a patch that fixes this Oracle 10 issue for you”. I believe that the average user of open-source software has become less and less willing to contribute back over the years.

6. Oracle could open-source their legacyware. For instance, Oracle advanced replication has been completely rewritten since the Oracle 7 days when it was delivered in wrapped PL/SQL. However – that replication totally worked! No doubt their new replication is better – so why haven’t they open-sourced the Oracle 7 PL/SQL yet? We could be riffing off that and building fancy new things overlaid on top of it. Replication is just one example of software Oracle has shelved instead of releasing. It would be trivial to come up with more.

The following answers are from Tim Strehle, author of the OracleEditor tool.

1. Back in university, and during my first day job, I got in touch with some commercial Unix flavors – coming from Windows (where I developed Microsoft Access applications), this was a scary world.

So I knew there would be a lot to learn when I started working for Digital Collections. Their first programs had been developed on NeXT computers; later they moved to a client/server model with Unix servers and Mac and Windows clients, all software being written in C. But at the time I joined them, their next major software release was to be a web application written in PHP, running on Unix, Apache and Oracle.

The only thing I knew about PHP 3 was its website, and simply from browsing the online manual, you could tell that PHP would be a good choice for developing web applications. Even at that time it supported so many databases, had lots of useful-looking extensions – and the best online language and function reference I had seen so far.

I was able to learn PHP incredibly fast, and while the PHP manual contributed to that success, it helped even more that my boss, Thies C. Arntzen, was one of the core PHP developers and an Apache Software Foundation member. He taught me the foundations and the tricks of the language, and it was fascinating to see how a PHP feature request or bug discussed with Thies resulted in a solution implemented in the next official PHP release. I really appreciate the privilege of having learned PHP directly from a PHP genius. It has been a great introduction into the world of open source software…

2. Like probably most software developers, from time to time there’s a need to build a tool for in-house use. We wouldn’t mind giving these tools away for free, but usually they aren’t polished or generic enough to be useful for others.

In early 2003, while building a new in-house tool, I decided to take the time to make it useful for people outside our company as well. While I was curious to find out what kind of feedback I would receive, my main motiviation was that I wanted to give something back: I’m making a living building (closed source) software on open source projects like Linux, Apache and PHP, so it felt right to contribute some free software myself.

3. My company’s (commercial, closed source) software was running on Oracle on Solaris, HPUX, Irix and AIX; I was developing on Oracle 8 on Solaris. The advent of Oracle on Linux was very exciting for us, it made it so much easier to run Oracle on relatively cheap hardware.

4. I hope that my OracleEditor.php script will continue to attract new users, and perhaps new co-developers – and I love getting suggestions for improvement.

Oracle has proven to be a solid foundation to build upon, so there’s a promising future for Oracle-based tools like mine.

5. For years, you felt like a niche developer when building PHP software on Oracle. This feeling has really changed with the advent of Oracle’s Open Source Developer Center, the JDeveloper 10g PHP Extension and the announcement that PHP would be included in Oracle Application Server 10G. That’s been very encouraging, and all I wish for is that the Open Source Developer Center stays alive and keeps getting frequent updates. Good work!

6. I’m looking forward to seeing what you’re making out of these interviews.

The following answers are from Clausen Yngve, author of ora2html.

1. The first time I laid my hands on anything open source, was around ’96, when I attended a course in OS Design at the University of Tromso (In Norway). To provide us with a safe environment for programming (safe as in not ruining things for other people :-), we were provided with laptops running Red Hat linux. The transition from using win* products was eased somewhat by the fact that the univeristy was running UX terminals, and I had been using them for regular work and programming for about a year in advance. But I’m not going to claim the switch was without failures 😉 I was slightly tempted to convert my home-PC to Linux or BSD at the time, but it just seemed a little bit too advanced for me. And I couldn’t play Doom and Quake running Linux 😉

At the time I didn’t really give much thought to what was open source or not – and I guess I didn’t _really_ start using Linux/GNU/Open Source software seriously until ’98 when I started working as a unix sysadmin. From there on I’ve been using open source software on a regular basis.

2. In early 2002 it started to dawn on me that there were a lot of things I didn’t know about configuration, features and possibilities in the oracle database – and I didn’t have a clue where in the database to look for information about all the stuff I didn’t know about 🙂 At the same time, I faced the challenge of keeping track of a growing number of databases in my company. Keeping manual track of a handful of databases isn’t too bad, but after looking up version and options information for 50 databases, you sort of loose interest 😉

I eventually decided to create an automated routine for extraction of general database information to help me in my daily work. Inspired by the cfg2html project (Where a few of my friends were involved), I decided to share my utility just in case somebody else would find it useful.

3. My utlity is a small-ish shell script that collects information about configuration and setup of oracle software and databases installed on a server. It logs on to the available databases and runs checks on different aspects of database operation, including memory config, storage utilization, security, installed options, versions … and so on. The end result is saved as an html file for easy browsing.

It’s mainly a utility geared towards DBAs that want an easy method of getting system information. I’ve found it to be a useful source of reference information in administrative tasks like capacity planning, database upgrade/migration, space management and security auditing. It could probably be useful in disaster/recovery scenarios also.

I recommend running it from cron with automated transfer of the end result to a web server. That makes the info easily accessible. I’ve also found the source code to be a good place for cannibalizing parts for other DBA-related scripts 😉

4. I’ve been working with Oracle since ’98 when I started working as a unix sysadm with part-time DBA responsibility. That was on an HP platform. I’m not sure which Oracle version was the first to be ported to linux, but I did try the 8.0 release. I’ve never done much work on Oracle/Linux combinations, though.

5. My project is really just a small utility that doesn’t require much effort to keep updated. These days it’s just updated as a result of discovered bugs, or upon requests. There are still 10g features I’ve omitted from my utility, but until I see a real use for the info, I’ll delay it.

6. Hm. I don’t think I have any well-founded thoughts on that issue. Yet 😉

MySQL Disaster Recovery

Like all databases, MySQL needs a disaster recovery plan. In this article we discuss some specific experiences at a client site where disk errors began to cause database problems, and how the disk was replaced, and the database recovery process.

MySQL is a great database, and for this client, 2000 subscribers and an average of 200,000 hits per month, it is more than enough. In our case we are using MyISAM tables, which do not support transactions. What that means is that as soon as you insert, update, or delete data, it is immediately reflected in the database files. Discussions of what context this is relevant and sufficient for your application are beyond the scope of our discussions here.
Discovering the problem

The application first starting showing trouble with errors on the website about sessions. My first thought was the database itself could be down, so I checked for running processes:

$ ps auxw | grep mysql

Seeing that the processes were running, I thought one might be hung, so I stopped and started the database just to be sure. This is a quick process, so wouldn’t impact things much. Besides most frontend users were probably experiencing the session problem, since almost every page you view on the site checks your session identifier:

$ /etc/rc.d/init.d/mysql stop

$ /etc/rc.d/init.d/mysql start

The session problem continued to rear it’s ugly head, so I looked into table checking. First I ran myisamchk on the sessions table:

$ cd /var/lib/mysql/my_db_name/

$ myisamchk activesessions.MYI

The name of the table in this case is “activesessions” and the name of the database for my example purpose is “my_db_name”. Checking on the frontend, the site began to work again, so I thought the problem was solved.
Within fifteen minutes, I’m getting paged by the client again, and realize the problem is not solved, and I’m starting to worry a bit. This is not normal behavior, and I’m worrying about corruption. I shutdown the database, and do a thorough repair of all tables:

$ myisamchk -r -s --update-state *.MYI

I startup the database again, and find that there is still intermittent problems. I’m also starting to check the logfiles. /var/log/mysqld.log and find that the database is crashing, and then being restarted every few seconds. Corruption I wonder? I verify that our backups are intact, then start looking further afield. I check /var/log/messages and find something serious:

Mar 12 01:58:51 www kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }

Mar 12 01:58:51 www kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=857785, sector=857712

Mar 12 01:58:51 www kernel: end_request: I/O error, dev 03:01 (hda), sector 857712

Mar 12 01:58:51 www kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }

Mar 12 01:58:51 www kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=857785, sector=857720

Mar 12 01:58:51 www kernel: end_request: I/O error, dev 03:01 (hda), sector 857720

Immediately I call support, and discuss the problem.
Replacing the Disk

Luckily the disk is still working well. That means a “ghost” of the disk can be done to a new disk without errors. If the disk had crashed, it would have been a much more difficult recovery. The support folks go ahead and do the ghost procedure after shutting down the machine completely, which is something roughly akin to:

$ dd if=/dev/hda of=/dev/hdb bs=1024

The unix command “dd” does a device to device copy, and will copy every block without change. The support folks may have a hardware solution which does this.
Repairing the Database

After the machine came back online, I shutdown the database again (it starts automatically at boot).

$ myisamchk -r -s --update-state *.MYI

Once that’s done, I startup the database:

$ /etc/rc.d/init.d/mysql start

Problem solved.

Going forward it couldn’t hurt to write some scripts for Nagios to watch /var/log/messages for errors. Searching for the string “UncorrectableError” would make sense. In addition, a script to monitor the results of myisamchk would also be a good idea.

MySQL recovered fine from this brush with disaster, but one may not always be so lucky to have the disk repair be so straightforward. That’s why the dumps of the database, and regular backups are so important. Be proactive, or learn Murphy’s Law the hard way. One way or the other we all run into these issues sooner or later.

Oracle 9iRAC – Clustering on Linux/Firewire


Ever since the announcement of Oracle 9i, Oracle’s Real Application Clustering feature has created quite a stir. For those not familiar, 9iRAC is a complete overhaul of Oracle Parallel Server (OPS) from previous versions of the database into a workable product.

For many DBA’s, however, this technology is completely out of reach. Without an employer who has already committed to OPS and wants to upgrade, or a client who would like to venture into the unknown, there’s no way to get ahold of an environment on which to test it. The lowest entry option for clustering technology has been Fibre Channel. Unfortunately cost is prohibitive.

Enter Oracle’s new Linux Firewire project. To some, this announcement is as exciting as Oracle’s first announcement of a port of their RDBMS to the Linux platform. Through the release of various Open Source software components, such as a modified ieee1394 driver for sharing external Firewire disks, a clustered filesystem (OCFS), as well as a number of other interesting components, this platform is now within our reach at very low cost.

Part 1 – Introduction

Part 2 – Basic Costs + Hardware Platform Outline

Part 3 – Software Requirements, Versions, etc

Part 4 – Initial Oracle Setup

Part 5 – Firewire + OCFS Setup

Part 6 – Cluster Manager Setup

Part 7 – Cluster Database Setup

Part 8 – Review of Clustered Features + Architecture

Part 9 – A quick 9iRAC example

Part 10 – Summary

Part 2: RAC/Linux/Firewire – Basic Costs + Hardware Platform Outline

Basic Costs + Hardware Platform Outline

In my test environment, I bought the following equipment. Note that although RedHat Advanced Server seems to be required, I worked with the development team to get it working without that distribution, and included RPMs. If you want to get a copy, get the developer release. I listed that as well, though I didn’t use it.

  • 2x emachines T2460 $650 each link
  • 2x Inland Firewire PCI card $25ea from Fry’s (includes 6pin to 4pin cables) link
  • 1 Pyro 1394 Firewire cabinet $150 (includes 2 + 1 6pin to 6pin cable) ** link
  • 1 Maxtor 7200RPM 60GB ADA/EIDE harddisk $80 link
  • 1 2meter 6pin to 6pin 1394 cable ($10)
  • 1 copy of RedHat AS 2.1 Developer Edition $60 link
  • 1 firewire hub (only for 3+ nodes) $40-$80

You can use just about any EIDE HD which is compatible with the cabinet you get, and these are just the ones I got, so there is some flexibility in cost. Also, I got this stuff from a Fry’s store when I was in California. They have an online store at Fry’s. I would also recommend checking Sparco online as they have pretty good prices, and I’ve had a lot of luck with them here.

** Arup Nanda notes that you must use a firewire enclosure which has a chipset that supports multi-user. I would suggest

checking Tom’s Hardware Guide for details.

Part 1 – Introduction

Part 2 – Basic Costs + Hardware Platform Outline

Part 3 – Software Requirements, Versions, etc

Part 4 – Initial Oracle Setup

Part 5 – Firewire + OCFS Setup

Part 6 – Cluster Manager Setup

Part 7 – Cluster Database Setup

Part 8 – Review of Clustered Features + Architecture

Part 9 – A quick 9iRAC example

Part 10 – Summary

Tracking the Wily Proxy Hackers

Recently the server that hosts our business was hacked. This interrupted the service of twelve different websites we host, as well as our corporate mail. Needless to say it caused us plenty of headaches, sleepless nights, and frustrating hours. In retrospect, however it has instilled a greater appreciation for computer security, a greater awareness, and further, a stronger perseverence to keep the systems locked down.
Watching the news these days, and sites like Security Focus can be disheartening to say the least. SPAM is at an all-time high, windows viruses, trojans, and malware are wreaking havoc to corporate intranets, and the internet at large, and the situation only seems to get worse. Running a server on the internet nowadays is like opening shop in New York City back in the days of street crime and daily trouble.
Unfortunately some of us in the Unix and Macintosh world have grown a bit too confident. With all of the vulnerabilities being found in various versions of Windows, IIS and Internet Explorer, folks on the other side of the fence figure they have less to worry about. We may have less to worry about, but that certainly doesn’t mean nothing. So here is the story of what happened to us, and what we did about it.
We upgraded our systems in December of 2004, and figuring Mandrake 9.2 was more stable than 10.x we installed that. We spent the time recovering all of our websites from backups, rsyncing things accross the internet. Each website has it’s own document root as well as specific configuration lines in the Apache httpd.conf file. In addition the mail server had to be configured, as well as DNS changes. Lastly once the system was up and running, we mirrored everything on root for redundancy and protection of loss of a single drive. All told we spent about 30+ hours but we were back up and running soon enough. A lot of the bulk of that time was spent moving data accross the internet, and was unattended.
Around the end of January we started seeing some spikes in hits on some of our sites, but didn’t think much about it. A few weeks went by, but generally the systems were behaving normally, but starting to be a bit slow. By mid-February we were starting to have problems. The network we are hosting on was having trouble with bandwidth, browsing, and experiencing outages of their own. We also showed up on the Composite Blocking List and the Spamhaus List.
When that happened it opened our eyes, if only a bit. We knew something was happening which was originating from that network. So we did two things. First we tested our Postfix mail server for Open Mail Relay. We had experienced this a year earlier with a qmail misconfiguration, and since it is quite common, thought this might be the problem. However, we were setup correctly, and that was not the issue. Next, we scanned all of the windows and Macintosh machines on that network for viruses, trojans, and so on. We found a couple of things, and fixed them. We then removed ourselves from the CBL + spamhaus lists.
Once again our mail was flowing out, but a day later, the problem struck again. Being the Unix folks we our, we starting pointing fingers at the Windows machines. Sometimes Norton, MacAfee et al. don’t catch all the viruses. We suspected those pesky windows machines to be the culprit. Many of the malware programs that Windows users unwittingly install on their machines relay spam so that spammers can send email out anonymously. So your windows machine is coopted as a spam host, sending out thousands of messages a minute.
To get around the problem in the short term, we contacted some associates of ours, to relay mail through them. This is different than an open mail relay, since you are specifically requesting permission to send mail through another agent. So we could once again send mail, and our problem was temporarily solved. However, our server got slower, and so did our websites. It got to the point where the network hosting our server couldn’t send outbound traffic, or visit websites. Quite a problem.
The admin managing that network contacted Verizon, the broadband provider, and discussed the problem with their tech department. They suggested unplugging machines on the network one-by-one, until the traffic spike subsided. He proceeded to do just that, and what do you know but when our server was unplugged, the bandwidth usage dropped to ZERO. The support rep suspected we were streaming audio or video files, which of course we were not, so the only obvious conclusion was spam.
What to do, well first hide your head between your tail, and admit that your unix server has been hacked is a start. Next we rebuilt the server with Mandrake 10.1. There were some vulnerabilities in SSH that we were using, as well as Apache, and PHP, so upgrading to the latest Mandrake distro version upgraded all these packages in one go. We broke our mirrored drives, and installed Mandrake on one of them, and the did a disk to disk copy of all the data from /home to the new drive. Once that was complete we started up again, and things were looking good.
Back on the internet, things started slowing down again, so we started monitoring our Apache logs. We saw some strange activity in there, so blocked HTTP at the router, and found the performance problems, and bandwidth problems eliminated. So we knew there was something wrong with Apache. We searched for bugs, but didn’t find anything too heinous. Upon closer examination of the logs, however, we found strange redirects to port 25 on other machines. How was that happening?
Apache has a facility for acting as a proxy. That is it can get webpages, and in fact make other requests of remote machines, and proxy those requests back to an originating source. Imagine standing on a mountain top. You can see to the other side of the mountain, and are reading smoke signals from a village there. You then send those same smoke signals to the next village over. They can read your smoke signals, but don’t know the identity of the sender, only that you’re sending a message to them. You can understand the message, but can’t determine the sender. Proxying with internet based servers works much the same way. In fact the Open Mail Relay we discussed above is exactly that, which is why it’s so important that it be closed.
So we looked over these logs and found strangely that Apache was doing the same thing! In fact Apache was an open mail relay, and open proxy in general. This mod_proxy module came preinstalled with our apache, and though we did not configure it, it was working none the less. So we researched the issue, and found it was not considered a bug. It was in fact part of the software that when configured correctly can come in quite handy. Of course we didn’t need it, so we spent some time disabling through configuration changes in the httpd.conf. Despite these changes, we were still seeing some traffic, so we decided to play rough. We recompiled apache from scratch with the module completely disabled. Further attempts to configure httpd.conf using that module failed, proving to us that it was indeed no longer present in the software.
We disabled the block at our router, and watched things for a couple of days. We were still seeing funny traffic. Paranoid at this point, we blocked at the router, to analyze the logs some more. We could not figure out how this might still be happening, and checked the PHP forums for bugs related to this. Finding none, and not wanting to just start recompiling modules at random, we looked at the logs again.
We found that our server, when making a failed request, was redirecting the user to our homepage. So the proxy requests were failing, but redirecting the user to our homepage. Checking the stats confirmed this. We received 5000 hits that day, a 1000% above normal. Realizing these scans and attempts to proxy were failing, we began to relax. Knowing we were probably on some spammers top-10 hacked sites in North America list, we also figured that their automated systems would remove us from such a list once our server stopped server proxy requests. And that’s exactly what we found. After a couple days the hits dropped off to 2500, and then back below 1000 before weeks end.

Part 10: RAC/Linux/Firewire – Summary


We covered a lot of ground in this article and it should serve as an introduction to 9iRAC on cheap Linux hardware. There are plenty of other topics to dig into including tuning, backup, SQL*Net setup and Load Balancing, I/O Fencing, NIC Failover and so on.

9iRAC is *NOT* a silver bullet as any good DBA knows. It will protect you from a single instance failure because of memory, kernel panic, or an interconnect failure, but there are still cases where your database could go down, for instance if the cluster manager software fails, or you lose a datafile either from human error, or a storage subsystem problem. Further redundancy can help you, but there are risks associated with an accidentally deleted object, or even and Oracle software bug.

Take a look at some of the documents listed below for further reading.

Other References

Red Hat Linux Advanced Server 2.1 – docs

Oracle Technology Network’s Linux Center

Oracle Cluster Filesystem FAQ

Oracle Cluster File System docs

Internals of Real Application Clusters by Madhu Tumma

Oracle9i Real Application Clusters Concepts

Oracle9i Real Application Clusters Administration

Linux HOWTO Docs – Networking, kernel config, hardware compatability etc

Part 1 – Introduction

Part 2 – Basic Costs + Hardware Platform Outline

Part 3 – Software Requirements, Versions, etc

Part 4 – Initial Oracle Setup

Part 5 – Firewire + OCFS Setup

Part 6 – Cluster Manager Setup

Part 7 – Cluster Database Setup

Part 8 – Review of Clustered Features + Architecture

Part 9 – A quick 9iRAC example

Part 10 – Summary

Oracle 10g Laptop/nodeless RAC Howto



Let me start by saying that this whole article is rather unorthodox.

That’s why I thought the analogy of hitchhiking was so apt. Also

if you are a hitchhiker, and you happen to be carrying your laptop,

well you can bring along an Oracle 10g Real Application Cluster

to show all your friends. Now there’s a road warrior!

Seriously though, this step-by-step guide does not describe any

supported solution by Oracle. So what good is it? Well a lot

actually. By taking the uncommon route, you often see the

colorful streets, the surprising highways, and undiscovered

nooks. What a great analogy because this is also true in software!

In 2002 I went to Open World and was very excited by the discovery

of the Open Source initiative headed up by Wim Coekerts. One of

their most exciting projects to me was this Oracle 9i RAC running

on Linux with a special Firewire driver patched to allow multiple

systems to mount the same filesystem. That was a tremendous learning

experience, and I wrote up an article, and presented that at the

New York Oracle User Group. Afterward, someone from the audience

came to me and asked if I would present at their user group out

in Edison New Jersey. Both presentations were exciting, and I

think well received.

Of late I’ve happened upon some articles floating around the internet

discussing a single-node AKA laptop RAC setup. How could that work,

I wondered? Perhaps they install virtualization software such as

VMWare to allow a single machine to look like more than one. This

would certainly work in theory. Once I started digging a bit more I

discovered Amit Poddar’s excellent article over at, and

I was intrigued. No virtualization seemed to be required other than

some virtual ethernet interfaces.

I decided to dig my heels in and give it a try. After struggling with

the illustrious and very universally beloved installer for a few months

I finally managed to get all the pieces in place, and get Oracle Real

Application Clusters running with no clustering hardware!!!

Here, my fine friends, are all the gory details of that adventure, which

I hope you’ll enjoy as much as I did writing them down.

Oracle’s model of clustering involves multiple instances (software processes)

talking to a single database (physical datafiles). We’re doing the same

thing here, but both instances will reside on the same machine. This

helps you travel light, save on transportation and learn concepts,

commands, and the architecture. Remember this is not an HA solution,

as there is little redundancy, and with a single disk, you will surely get

abysmal performance.

Let’s get started, what will we need to do? Here’s a quick outline of the

steps involved:

1. setup ip addresses of the virtual servers

2. setup ssh and rsh with autologin configured

3. setup the raw devices Oracle’s ASM software will use

4. install the clusterware softare, and then Oracle’s 10g software

5. setup the listener and an ASM instance

6. create an instance, start it, and register with srvctl

7. create a second instance & undo tablespace, & register it

1. Setup IP Addresses


Oracle wants to have a few interfaces available to it. To follow our analogy

of a hitchhiker traveling across America, we’ll name our server route66.

So add that name to your /etc/hosts/ file along with the private and vip

names: route66 route66-priv

# route66-vip

Notice that we’ve commented out route66-vip. We’ll explain more about

this later, but suffice it to say now that the clusterware installer

is very finicky about this.

In order for these two additional names to be reachable, we need

ethernet devices to associate with those IPs. It’s a fairly straightforward

thing to create with ifconfig as follows:

$ /sbin/ifconfig eth0:1 netmask broadcast

$ /sbin/ifconfig eth0:2 netmask broadcast

If your IPs, or network is configured differently, adjust the IP or broadcast

address accordingly.

2. setup ssh and rsh with autologin


Most modern Linux systems do *NOT* come with rsh installed. That’s for

good reason, because it’s completely insecure, and shouldn’t be used at

all. Why Oracle’s installer requires it is beyond me, but you’ll need

it. You can probably disable it once the clusterware is installed.

Head over to and see if you can find a copy for

your distro. You might also have luck using up2date or yumm if you

already have those configured, as they handle dependencies, and always

download the *right* version. With rpm, install this way:

$ rpm Uvh rsh-server-0.17-34.1.i386.rpm

$ rpm Uvh rsh-0.17-34.1.i386.rpm

Next enable autologin by adding names to your /home/oracle/.rhosts file.

After starting rsh, you should be able to login as follows:

$ rsh route66-priv

Once that works, move on the the sshd part. Most likely ssh is already on

your system, so just start it (as root):

$ /etc/rc.d/init.d/sshd start

Next, as the “oracle” user, generate the keys:

$ ssh-keygen -t dsa

Normally you would copy to a remote system, but for us we

just want to login to self. So copy as follows:

$ cd .ssh

$ cp authorized_keys

$ chmod 644 authorized_keys

Verify that you can login now:

$ ssh route66-priv

3. setup the raw devices


Most of the time when you think of files on a Unix system, you’re

thinking of files as represented through a filesystem. A filesystem

provides you a way to interact with the underlying disk hardware

through the use of files. A filesystem provides buffering, to

improve I/O performance automatically. However in the case of a

database like Oracle, it already has a sophisticated mechanism for

buffering which is smart in that it knows everything about it’s

files, and how it wants to read and write to them. So for an

application like Oracle unbuffered I/O is ideal. It bypasses a

whole layer of software, making your overall throughput faster!

You achieve this feat of magic using raw devices. We’re going to

hand them over to Oracle’s Automatic Storage Manager in a minute

but first let’s get to work creating the device files for our

RAC setup.

Create three 2G disks. These will be used as general storage space

for our ASM instance:

$ mkdir /asmdisks

$ dd if=/dev/zero of=/asmdisks/disk1 bs=1024k count=2000

$ dd if=/dev/zero of=/asmdisks/disk2 bs=1024k count=2000

$ dd if=/dev/zero of=/asmdisks/disk3 bs=1024k count=2000

Create two more smaller disks, one for the Oracle Cluster Registry,

and another for the voting disk:

$ dd if=/dev/zero of=/asmdisks/disk4 bs=1024k count=100

$ dd if=/dev/zero of=/asmdisks/disk5 bs=1024k count=20

Now we use a loopback device to make Linux treat these FILES as

raw devices.

$ /sbin/losetup /dev/loop1 /asmdisks/disk1

$ raw /dev/raw/raw1 /dev/loop1

$ chown oracle.dba /dev/raw/raw1

You’ll want to run those same three commands on disk2 through disk5 now.

4. Install the Clusterware & Oracle’s 10g Software


Finally we’re done with the Operating System setup, and we can move on

to Oracle. The first step will be to install the clusterware. I’ll

tell you in advance that this was the most difficult step in the entire

RAC on a laptop saga. Oracle’s installer tries to *HELP* you all along

the way, which really means standing in front of you!

First let’s make a couple of symlinks to our OCR and voting disks:

$ ln -sf /dev/raw/raw4 /home/oracle/product/disk_ocr

$ ln -sf /dev/raw/raw5 /home/oracle/product/disk_vot

As with any Oracle install, you’ll need a user, and group already

created, and you’ll want to set the usual environment variables such

as ORACLE_HOME, ORACLE_SID, etc. Remember that previous to this point

you already have ssh and rsh autologin working. If you’re not sure

go back and test again. That will certainly hold you up here, and

give you all sorts of confusing error messages.

If you’re running on an uncertified version of Linux, you may want

to fire up the clusterware installer as follows:

$ ./runInstaller -ignoreSysPrereqs

If your Linux distro is still giving you trouble, you might try

downloading from where you can find complete ISOs for

RHEL, various versions. You can also safely ignore memory warnings

during startup. If you’re short on memory, it will certainly slow things

down, but we’re hitchhikers right?

You’ll be asked to specify the cluster configuration details. You’ll

want route66-vip to be commented out, so if you haven’t done that and

get an error to the affect of route66-vip already in use go ahead and

edit your /etc/hosts file.

I also got messages saying “route66-priv not reachable”. Check again

that sshd is running, and possibly disable your firewall rules:

$ /etc/rc.d/init.d/iptables stop

Also verify that eth0:1, and eth0:2 are created. Have you rebooted

since you created them? Be sure they’re still there with:

$ /sbin/ifconfig -a

Specify the network interface. This defaults to PRIVATE, just edit

and specify PUBLIC.

The next two steps ask for the OCR disk and voting disk. Be sure to

specify external redundancy. This is your way of telling Oracle that

you’ll take care of mirroring these important disks yourself, as loss

of either of them will get you in deep doodoo. Of course we’re

hitchhikers so we’re not trying to build a system that is never going

to breakdown, but rather we want to get the feeling of the wind blowing

in our hair. Click through to install and you should be in good shape.

At the completion, the installer will ask you to run the

script. I found this worked fine up until the vipca (virtual ip

configuration assistant). I then ran this one manually. You’ll need

to uncomment route66-vip from your /etc/hosts file as well. Once

all configuration assistants have completed successfully, return to

the installer and click continue, and it will do various other sanity

checks of your cluster configuration.

Since the clusterware install is rather testy, you’ll probably be doing

it a few times before you get it right. Here’s the cleanup if you

have to run through it again:

$ rm rf /etc/oracle

$ rm rf /home/oracle/oraInventory

$ rm rf $CRS_HOME

# these two commands cleanup the contents of these disks

$ /bin/dd if=/dev/zero of=/asmdisks/disk4 bs=1024k count=100

$ /bin/dd if=/dev/zero of=/asmdisks/disk5 bs=1024k count=20

$ rm /etc/rc.d/init.d/

$ rm /etc/rc.d/init.d/init.crsd

$ rm /etc/rc.d/init.d/init.cssd

$ rm /etc/rc.d/init.d/init.evmd

$ rm /etc/rc.d/rc3.d/

$ rm /etc/rc.d/rc5.d/

Now reboot the server. This will kill any clusterware processes still running.

If you’ve finished the Oracle Universal Installer at this point, and things

seem to be working, check at the command line with the ps command:

$ ps auxw | grep 10.2.0s

root 3728 0.0 0.3 2172 708 ? S May30 0:00 /bin/su -l oracle -c sh -c ‘ulimit -c unlimited; cd /home/oracle/product/10.2.0s/log/bebel/evmd; exec /home/oracle/product/10.2.0s/bin/evmd ‘

root 3736 0.0 5.0 509608 11240 ? S May30 4:51 /home/oracle/product/10.2.0s/bin/crsd.bin reboot

oracle 4047 0.0 2.8 192136 6284 ? S May30 0:00 /home/oracle/product/10.2.0s/bin/evmd.bin

root 4172 0.0 0.3 2164 708 ? S May30 0:00 /bin/su -l oracle -c /bin/sh -c ‘ulimit -c unlimited; cd /home/oracle/product/10.2.0s/log/bebel/cssd; /home/oracle/product/10.2.0s/bin/ocssd || exit $?’

oracle 4173 0.0 0.4 4180 900 ? S May30 0:00 /bin/sh -c ulimit -c unlimited; cd /home/oracle/product/10.2.0s/log/bebel/cssd; /home/oracle/product/10.2.0s/bin/ocssd || exit $?

oracle 4234 0.0 3.9 180108 8808 ? S May30 0:16 /home/oracle/product/10.2.0s/bin/ocssd.bin

oracle 4476 0.0 2.0 24048 4576 ? S May30 0:00 /home/oracle/product/10.2.0s/bin/evmlogger.bin -o /home/oracle/product/10.2.0s/evm/log/ -l /home/oracle/product/10.2.0s/evm/log/evmlogger.log

oracle 6989 0.0 0.1 2676 404 ? S May30 0:00 /home/oracle/product/10.2.0s/opmn/bin/ons -d

oracle 6990 0.0 1.9 93224 4280 ? S May30 0:00 /home/oracle/product/10.2.0s/opmn/bin/ons -d

oracle 7891 0.0 0.2 3676 660 pts/3 S 23:35 0:00 grep 10.2.0s

Also list the nodes you have available to your clusterware software:

$ olsnodes n

route66 1

The Oracle 10g install itself is very trivial, assuming you’ve installed

Oracle before. Use the -ignoreSysPrereqs flag if necessary to start

up the Oracle Universal Installer, and use the software-only option,

as we’ll be creating our RAC database by hand. Also select Enterprise

Edition and things should proceed smoothly. Oracle will recognize that

you have the clusterware installed, and let you know during the


5. setup the listener and an ASM instance


The listener.ora file is setup as usual, the only difference is you will

include both route66 and route66-vip.





(ORACLE_HOME = /home/oracle/product/10.2.0)

(PROGRAM = extproc)













(ADDRESS = (PROTOCOL=TCP)(HOST=route66-vip)(PORT = 1521)(IP = FIRST))




You may also choose to use the actual IP addresses of these hostnames if

you like. One other difference is that you will use Oracle 10g’s new

srvctl utility to start th listener.

$ srvctl start nodeapps -n route66

Ok, on to the fun stuff. It’s time to configure our ASM instance.

Our instance name will be +ASM1, and we’ll set the ORACLE_SID as usual.

In the init+ASM1.ora file specify:






asm_diskstring=’/dev/raw/raw1′, ‘/dev/raw/raw2′,’/dev/raw/raw3’

Then in sqlplus startup the ASM instance:

SQL> startup nomount

Next tell ASM how we want to utilize the space we have by creating disk


SQL> create diskgroup DBDATA external redundancy disk


SQL> create diskgroup DBRECO external redundancy disk ‘/dev/raw/raw3’;

Now that you have diskgroups, you want to make a note of it in your


SQL> !echo “asm_diskgroups=’DBDATA’,’DBRECO'” >> init+ASM1.ora

Now startup your ASM instance:

SQL> startup force

Exit sqlplus and let srvctl know about the new ASM instance:

$ srvctl add asm -n route66 -i +ASM1 -o /home/oracle/product/

Now you can shutdown in sqlplus, and startup with srvctl:

SQL> shutdown immediate

$ srvctl start asm -n route66

And lastly use the ps command to check for your new instance.

6. create an instance, start it, and register with srvctl


We’re getting to our clustered database slowly but surely. We’re

just getting over the mountains now, and the open road is ahead of


We’re going to create the first of our two instances and call it

BEATNIK. Edit your initBEATNIK.ora as follows:


















You’ll also have to create the /home/oracle/admin/BEATNIK/* and

/home/oracle/admin/HIPPY/* directories.

Now edit the file crKEROUAC.sql as follows:








GROUP 2 size 10240k,

GROUP 3 size 10240k;

There are other parameters you can specify in this create statement, such as

maxinstances, maxlogmembers, and the sys password. However I’ve tried to

simplify it, to make it easier to review and understand. Check the Oracle

docs for details.

Now startup sqlplus and issue:

SQL> startup nomount pfile=/home/oracle/admin/BEATNIK/pfile/initBEATNIK.ora


Now get the names of your controlfiles from v$parameter and add them to

the initBEATNIK.ora file.

Now add a couple more parameters to your initBEATNIK.ora file:



Use sqlplus to stop and start the db again:

SQL> shutdown immediate

SQL> startup force

Now register our new database:

$ srvctl add database d KEROUAC -o /home/oracle/product/

$ srvctl add instance -d KEROUAC -i BEATNIK -n route66

Now one more time, shutdown with sqlplus, and then use srvctl to

start the db. From now on srvctl can stop + start the db.

$ srvctl start instance -d KEROUAC -i BEATNIK

7. create a second instance & undo tablespace, & register it


Since the database is already created, you don’t have to do that step

again. At this point all you have to do is create another instance.

First fire up sqlplus and create another undo tablespace:

SQL> create undo tablespace hippyundo datafile ‘+DBDATA’ size 100m;

Make a copy of your init.ora for the hippy instance like this:

$ cp initBEATNIK.ora initHIPPY.ora

Then set your ORACLE_SID and use sqlplus to startup:

SQL> startup

Finally register with srvctl:

$ srvctl add instance -i HIPPY -d KEROUAC -n route66

8. create data dictionary




10. Some Things to Understand


Automatic Storage Management

Global Cache Services

Global Enqueue Services

Clusterware procs crsd, evmd, ocssd,oprocd

RAC processes lms, lmd, lmon, lck0

GV$ data dictionary

11. Further Reading


Clusterware & RAC Install & Configuration Guide for Linux

Clusterware & RAC Administration Deployment Guide

Oracle Technology Network –

Please visit or email me at

Thanks to Amit Poddar &

Apress, Oracle Press books

Asterisk Calling Card Applications

Asterisk is a powerful PBX solution, that we already know. But what else can it do. In this article we’ll explain how to setup Asterisk to handle Call Data Records (CDR data) in MySQL. Once you have that configured, there are a number of calling card applications which can be integrated with Asterisk to provide you with the makings of a serious calling gateway.

Setup Asterisk CDR with MySQL

By default Asterisk pumps all it’s call data information to text-based log files. That’s fine for normal use, but what if you want to put that data to use in a calling card application? First you have to get Asterisk to use a database. Luckily the support is already there, all you have to do is configure it.

Start by editing your cdr_manager.conf file as follows:

enabled = yes

Next edit your modules.conf file, and somewhere in the [modules] section, add:

load =>

We’re going to compile this, don’t worry. Next edit your cdr_mysql.conf file in /etc/asterisk or create it if necessary:












Next install MySQL. Luckily for all you lazy bums out there, this is the simplest of all. You’ll need to download three RPMs and install them. You’ll need the latest version of mysql-server, mysql-client and finally mysql-devel.

Next you’ll create a database called “asteriskcdrdb” with mysqladmin, create a table named “cdr” with the Asterisk provided script, and then set user grants.

Now it’s time to compile the asterisk-addons package. Be sure you have zlib-devel and mysql-devel packages installed on your system or you may get errors. Checkout the source from cvs. I got some strange errors which I had to track down on the email lists, and then edit the makefile as shown below:


Now stop asterisk, and start it up again, and monitor the asterisk logfile for errors as follows:

tail -f /var/log/asterisk/messages

You can finally verify that you are dumping cdr information into mysql as follows:

$ mysql asteriskcdrdb

mysql> select uniqueid, src, calldate from cdr;

There should be one entry for every call. Make some calls to local

extensions and verify that records show up here. New cdr records

will still show up in the /var/log/asterisk/cdr-csv/Master.csv

file. Not sure if this can be disabled.

Calling Card Applications


Though the homepage is just a voip-info wiki page

and the download available through CVS, this calling card application was updated in late December 2004. This application seems to be the winner in terms of popularity on the voip-info wiki. It comes from Digium, it supports MySQL, and setup is pretty straightforward.


With a strange name, it nevertheless seems a pretty complete system. Last updated end of December, 2004, it includes a web interface, though no support for MySQL. That’s fine, but my MySQL setup instructions will need to change slightly as you’ll need to configure Asterisk to dump CDR data into Postgres.

Asterisk Billing – Prepaid application

Last updated in July, I had trouble compiling this application. There is a basic sourceforge download page, but no real homepage. I’m guessing this one is still sort of in the development stages. Also, it doesn’t come with any sound files, so you’ll have to record your own, or *borrow* from some of these other applications.

Your Database – A Long-Haul Truck Or A Sports Car?


Databases, even those running high-powered software like Oracle, can be incredibly touchy, demanding, and even fragile in their own way. For that reason we must take care to optimize and tune them based on characteristic usage.

Data Warehouse vs OLTP

In broad terms, database applications are divided into two large classes, Data Warehouse, and OLTP (online transaction processing – what a mouthful!). For the purposes of this dicussion, let’s call them a heavy lifting truck, and sports car. Now both have powerful engines, but they’re used for very different purposes.

Our Data Warehouse is characterized by large transactions, huge joins, all of which work to produce very large usually one-off reports. The reports may be run a handful of times. These databases do mostly read-only activity, occaisionally performing large dataloads to add to the archive of data.

On the other hand OLTP databases are characterized by thousands or tens of thousands of very small transactions. Web sites for instance, exhibit this characteristic. Each transaction is doing something quite small, but in aggregate, thousands of users put quite a heavy, and repeated load on the database, and they all expect instantaneous response!

We provide these two very different types of databases by laying out the database for its characteristic usage, and then tuning relevant parameters appropriately. We may allocate more memory to sorting, and less to the db cache for a Data Warehouse, whereas a large db cache might help us a lot with an OLTP application. We may enable parallel query, or partition large tables in our Data Warehouse application.

Choose One Or The Other

If you have a database serving a web-based application, and you are trying to do large ad-hoc reports against it, you will run into trouble. All that memory you’ve setup to cache small web transactions, will get wiped out with the first large report you run. What’s more the heavy disk I/O you perform reading huge tables, and then sorting and aggregating large datasets will put a huge load on your database which you setup specifically for your web application.


There are lots and lots of parameters and features in Oracle best suited to one or the other type of application, to the point where your database really will look like a sports car or a long-haul truck when you’re done tuning it. For that reason it is really essential that these types of applications be divided up into separate instances of Oracle preferrably on separate servers.