Category Archives: systemd

Building an Oracle 26ai Database Server from Scratch #JoelKallmanDay

In 2014, while teaching Oracle Database Administration courses at Austin Community College, I wrote a series of blog posts on how to create an Oracle Database server: Oracle Database 12c on Oracle Linux 6, so my students could build their own practice database servers.

Now, as the Director of Consulting Services in the Oracle Technologies division of Talan, I was recognized as an Oracle ACE. Part of the ACE program is promoting Oracle at Conferences (I presented two sessions at ODTUG’s Kscope26 conference in Colorado this year) and doing things like blogging. Blogging helps me maintain my ACE status (although I’ll have more than enough points from presenting at conferences this year).

Since I’ve been a bit sporadic about blogging lately, I thought I’d get back into the swing of things by putting out my complete step-by-step instructions for building an Oracle Database server on your own machine. Note that these days, you no longer really have to do this. You can simply go to Oracle Cloud and obtain a pre-configured database server. If you just need “the database” and don’t want to do anything at the operating system level, then an Oracle Autonomous Database is for you. However, there are several limitations associated with an Autonomous Database (which is essentially a pluggable database within a database maintained by Oracle for you) that are completely removed if you opt for an Oracle Base Database instead. With an Oracle Base Database, you get direct access to the operating system, and you could, for example, potentially attempt to do all of the examples within Tom & Darl’s incredibly awesome book Expert Oracle Database Architecture. (One of my presentations at Kscope this year was basically “Read this book, do all the examples while understanding what’s happening, and you’ll be a much better Oracle Database developer.”) That said, messing around with an Oracle Base Database on Oracle Cloud could possibly get you into a state where the automated patching tools and other things that Oracle does for you might not work. If you are just playing around, you could always blow away the database and create a new one if you mess it up too much.

However, if you would like to build a practice database server from scratch on your own machine, and along the way, learn much more about how an Oracle Database server is built, then this series of blog posts is for you.

A note about my philosophy when it comes to Oracle Database servers and the rules I like to follow.

  1. Ease of understanding, especially during a crisis, is important
  2. Less configuration is, almost certainly, better configuration
  3. The more you understand how, and why, and where the Oracle database does its things, the better you can respond in an emergency situation

As an example, when I make my post about the systemd services that I create for Oracle backups, you’ll notice that the entirety of the RMAN backup configuration is entirely within the system command. This means that if there are changes to be made, I go to the one place where my backup is configured and just address changes there. The ‘traditional’ approach of a cron job (1) that calls a script (2) that calls RMAN (3) with another file for the RMAN commands (4) spreads “How are backups done?” all across your OS in different files in different directories.

As I get time, I’ll be adding posts for each of the items below (almost certainly in order as I do these steps on my own new Talan laptop) and linking them from here.

Building an Oracle 26ai Database Server

  1. Install Oracle VirtualBox & VirtualBox Extension Pack
  2. Download Oracle Linux ISO
  3. Create Linux Virtual Machine
  4. Log in as root & Improve Quality of Life
  5. Disable selinux
  6. Disable firewalld
  7. Update /etc/hosts
  8. Install Guest Additions Into Virtual Machine
  9. Install Oracle Linux 9 EPEL & Oracle Software Repos
  10. Install rlwrap
  11. Install Oracle Database Preinstall RPM
  12. Install Oracle JDK
  13. Install Nginx (optional)
  14. Set oracle OS user password
  15. Create Oracle directories
  16. Initial Oracle login and quality of life improvements
  17. Install autoupgrade
  18. Create autoupgrade download keystore
  19. Download Oracle Database with autoupgrade
  20. Download Oracle APEX with patch (if available)
  21. Download ORDS
  22. Create Oracle software home with autoupgrade
  23. Configure read only home (poorly named)
  24. Create Oracle container database with pluggable
  25. Create listener
  26. Install ORDS
  27. Install & Patch Oracle APEX
  28. Set APEX internal workspace password
  29. Enable APEX network services
  30. Create and enable an APEX resource manager plan
  31. Turn on database flashback
  32. Create systemd services for database and ORDS
  33. Create systemd backup service
  34. Configure APEX static images (CDN or local)
  35. Install mkcert for signed certificates
  36. Configure Nginx
  37. Disable annoying password stuff in APEX

A note about the Joel Kallman Day tag on this post:

Joel was a really nice person who dedicated his life to being a good and kind person. He did so much for the Oracle APEX community and for his family. Those of us who knew him still really miss him.

My last correspondence with Joel was this:

                Got a few minutes to chat? Trying to help a CIO find a good APEX hire? - me
                          
Sorry, on medical leave. - Joel

                No problem at all. Sorry, I didn't know. Here's to a speedy recovery! - me                          

That speedy recovery never came, and the world is at a loss because of it.

Technician servicing Oracle server rack with labeled equipment and hardware
A technician services an Oracle server rack beside components prepared for deployment.

APEX & ORDS for DBAs and System Admins is now live on YouTube

I’ve mentioned this presentation before on my blog and now I’ve recorded the entire thing including the bonus content. At the various user groups like RMOUG and Kscope, I was only given an hour and just told folks to “Read the rest of the presentation.” The media team at Insum (thanks Marc and Lauren!) and I bounced back and forth on doing multiple 1-hour events or jamming everything into a single presentation. Eventually, we decided to get it done in one go. It’s long… 2 hours and 6 minutes long. Apparently, I was enjoying myself so much that I didn’t even realize that, and if you do watch until the end you’ll notice that I thought it was actually 1 hour long, not 2.

I’m pretty pleased with the presentation and I’ve got a lot of good feedback from folks. If you want to use APEX and/or ORDS and your DBAs and/or System Admins don’t want to implement it, this presentation is my gift to you. Any DBA or System Admin should be able to learn exactly what they need to know to run APEX and ORDS in a production-ready configuration.

I’ve linked to this before and the link is in the description on YouTube, but here’s another direct link to all the code on every slide: https://github.com/RichardSoule/APEXandORDSforDBASandSysadmins


Starting Oracle Database on Linux 7 using systemd and making OEM start only after the database is up

Recently I created a new virtual machine for the Oracle Database Admin, Install and Upgrade class that I teach at ACC. Previously I’d used Oracle Virtual Box on my local machine and then uploaded the image to Oracle Cloud and used Ravello to give each of my students their own server.

It was actually pretty straight forward:

  1. Upload the latest Oracle Linux (7.6) ISO that I got from eDelivery.oracle.com.
  2. Create a new blank machine with the following:
    1. 4 CPUs
    2. 24 GB of RAM
    3. 200 GB of disk
    4. Mout the uploaded ISO as a CD-ROM
    5. An elastic IP
    6. Services as follows:
      1. SSH (port 22)
      2. HTTPS (port 443)
      3. VNC (port 5901)
      4. HTTPS (port 7803 for Cloud Control)
  3. Start the image, configuring Oracle Linux 7 with the following:
    1. Server with GUI for software
    2. A static IP address (I used 10.0.0.15, but you could use anything).
    3. IP filtering so my ACC students could access the servers while they are in the labs at ACC and I could access the machines from home
    4. Partition the disk into a 16 GB swap partition, a 10 GB /home partition and then the rest of the disk as the root partition.
    5. When it came time to reboot the server, remove the CD-ROM image and update the configuration before rebooting so the image boots up using the disk.
  4. Install Oracle 12c and create an emrep repository database for OEM 13.3.
  5. Install OEM 13.3.
  6. Install Oracle 11g and create a database that will be upgraded during the course.

At this point everything was great, but since I teach 3-hour classes on Mondays and Wednesdays and shut the servers down between classes, my databases and OEM need to come up cleanly. Oracle has documentation on creating services to automatically start up databases on Linux/Unix, but it uses the old System V method for starting services (which, to be fair does still work on Linux 7). Since this was a Linux 7 server, I wanted to use the new systemd method. Tim’s rather fantastic site had the basic framework, but where he used scripts that he called from the service, I wanted to use dbstart and dbshut so that we could maintain startup and shutdown from a single file (/etc/oratab) rather than modifying a script.

I created the following file:

[root@dba ~]# vim /usr/lib/systemd/system/oracle-database.service
[Unit]
Description=The Oracle Database Service
After=syslog.target network.target

[Service]
# systemd ignores PAM limits, so set any necessary limits in the service.
# Not really a bug, but a feature.
# https://bugzilla.redhat.com/show_bug.cgi?id=754285
LimitMEMLOCK=infinity
LimitNOFILE=65535

Type=oneshot
RemainAfterExit=yes
User=oracle
Group=oinstall
Restart=no

ExecStart=/usr/bin/echo 'Starting Oracle Databases with Y in /etc/oratab'
ExecStart=/u01/app/oracle/product/12.2.0/dbhome_1/bin/dbstart /u01/app/oracle/product/12.2.0/dbhome_1
ExecStart=/usr/bin/echo 'dbstart has completed'

ExecStop=/usr/bin/echo 'Stopping Oracle Databases'
ExecStop=/u01/app/oracle/product/12.2.0/dbhome_1/bin/dbshut /u01/app/oracle/product/12.2.0/dbhome_1
ExecStop=/usr/bin/echo 'dbshut has completed'

[Install]
WantedBy=multi-user.target

I then enabled the service using the following:

[root@dba ~]# systemctl daemon-reload
[root@dba ~]# systemctl enable oracle-database

While the above worked great to start the database (tested with a reboot of the server), it didn’t address another issue. Unlike the database, Oracle Enterprise Manager comes with ‘out of the box’ scripts to start and stop OEM. They are the old style System V scripts that run out of /etc/init.d, and it didn’t really seem worth going through the trouble of converting them to the new systemd format. Unfortunately, the OEM scripts always assume that the database is already up and running. If your repository database is running on the same server as your OMS (which isn’t really that big of a deal if your hardware can handle it) that can be fixed by modifying the OEM startup script and adding in a ‘check to make sure your database is up and running before you start OEM’ section. The content in bold below was added to the out of the box OEM script after the initial comments in the file.

[root@dba ~]# vim /etc/init.d/gcstartup
# 2019-03-05 Rich Soule
# OEM should only startup if the emrep database is already up and running
# on the local machine so the below was added to make sure that happens.
#################### Begin Rich Soule Added Lines #######################
if [ "$1" = "start" ]
then
  counter=0
  while [ $counter -le 24 ]
  do
    ((counter++))
    if ! /usr/bin/ps -e | /usr/bin/grep -q ora_pmon_emrep
    then
      echo 'OEM is waiting on Oracle database to start'
      sleep 10
    else
      break
    fi
   done
   if [ $counter -ge 24 ]
   then
     echo 'Oracle database did not start in time, exiting OEM startup'
     exit 1
   fi
   echo 'Oracle database started, waiting 20 more seconds for database to open'
   sleep 20
  echo 'OMS will now attempt to start as per remainer of the /etc/init.d/gcstartup script'
fi
####################  End Rich Soule Added Lines ########################

The above first checks to make sure that gcstartup was called with the start argument. If so then we’ll check if there is an ora_pmon_emrep process running (emrep is the name of my OEM repository database). If it isn’t running, we’ll wait 10 seconds and check again, but only for 240 seconds total. Once that process is found, we break out of our while do loop. If we did hit our 240-second limit, then we exit out of the gcstartup script totally, otherwise, we wait 20 seconds for the database to open and then continue along with the rest of the gcstartup script.

So far this has been working like a charm.

Note that you could do the same type of thing with OEM and instead have the script make a connection to a remote server every 10 seconds to make sure that the remote OEM repository was up before attempting to start OEM.

Happy Linux-ing and Oracle-ing!