Wednesday, October 9, 2024

Oracle Connection to Docker Container Failed on Ubuntu 24.04

What Was the Problem?

After upgrading to Ubuntu 24.04, connections to an Oracle database in a Docker container failed.  These connections were working before the upgrade.

  • SQL*Plus: ORA-12637: Packet receive failed
  • "sqlnet.ora" (TRACE_LEVEL_CLIENT=user): Fatal NI connect error 12170
  • Oracle SQL Developer Extension for VSCode: Failed to connect

It Was Not AppArmor

I found many entries about Docker not starting after an Ubuntu upgrade.  While I don't know the root cause of this problem, no changes to AppArmor are needed to solve this problem.

What is the Interim Fix?

I found several fixes. I included links to websites.

SQL*Plus/SQL*Net:

Update "sqlnet.ora" File - Add "DISABLE_OOB=ON" to disable Out-of-Band communication.  Note: The location of the "sqlnet.ora" file can be based on the environment settings of ORACLE_HOME or TNS_ADMIN.

Oracle SQL Developer Extension for VSCode

Update "Advanced" Tab in "Update Connection" - Add a new name "oracle.net.disableOob" with a value of "true" to disable Out-of-Band communication.

What is the Root Cause?

I don't know.  I have not found it.  I assume there is a loss of functionality when Out-of-Band communication is not available for an Oracle client.  I will continue to follow this and add updates as I find them.

Friday, October 4, 2024

Unloading/Loading NLS (National Language Support) Data in Oracle

What is the problem?

Every Oracle database has 2 different character sets for "string" data types.  These character sets are defined whenever a database is created.

  • CHARACTER SET - This is the main character set for the database. It is set for specific environment and application needs.  This character set is normally used to store and handle all string data.
  • NATIONAL CHARACTER SET - This is the NLS (National Language Support) character set and is available for multi-lingual string data storage on all Oracle databases.  It can be set to one of these UNICODE character sets: "AL16UTF16" or "UTF8".
Oracle's DB Sample Schemas use the NLS character set for multi-lingual string data.  This data is loaded with SQL INSERT statements.  However, we have a need to unload and load this data to/from text files.

The problem is that text files will generally have string data for the database's main character set.  A different technique is needed to unload and load the NLS string data.  Oracle's DB Sample Schemas uses the UNISTR format to segregate NLS string data from string data that uses the database's main character set.

We will be using the UNISTR format as well.

How to Unload NLS String Data to a Text File?

The US7ASCII character set is a common subset of almost all main character sets for an Oracle database.  This is important because any NLS string data saved to a text file needs a common format with the database's main character set.  Also note the US7ASCII character set only uses the 7 LSBs (least significant bits) for each character.  Characters in this range can be found when Oracle's ASCII function returns decimal values between 0 and 127.  Additionally, the "\" character needs to be "escaped" with another "\" character.

We used the following function to encode database NLS string data to UNISTR format.  The resulting string data from this function will only contain US7ASCII characters and can be safely stored in a text file.

Monday, September 23, 2024

SQL*Plus Stopped Working in Ubuntu 24 (Noble Numbat)

After the upgrade to Ubuntu 24 (Noble Numbat), Oracle's SQL*Plus stopped working and started throwing this error:

sqlplus: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

Many thanks to https://askubuntu.com/users/367548/user3032965 for solving this problem in the comment at https://askubuntu.com/a/1526423.  For ubuntu 24.04 and later, the name for libaio1 has changed!  The solution is to create a symbolic link from the new name to the old name:

sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/libaio.so.1

In my situation, "libaio1t64" was already installed.  SQL*Plus started working again after I created the symbolic link.

Friday, August 30, 2024

Native PL/SQL Application to Capture Source Code and Configuration Data

I recently completed development and testing on the open source project ODBCapture.

ODBCapture is a native PL/SQL application that can be used to capture self-building scripts (source code and configuration data) for a database.

Existing tools like TOAD, PL/SQL Developer, and SQL*Developer can create “source code” scripts from an Oracle database. They can also create data load scripts from an Oracle database. What they cannot do is create a cohesive set of installation scripts that execute from a single “install.sql” script.

Existing database source code is handled by Liquibase and Flyway which are “diff” engines. These “diff” engines simply track changes to a database. Rarely is the source code from these “diff” engines ever used to create a database from nothing. Typically, the database source code from these “diff” engines require some existing database to get started.

ODBCapture is not a “diff” engine. ODBCapture is unique in its ability to create Oracle database installation scripts that can create different “flavors” of Oracle databases from a common set of source code. This installation occurs after an initialization to an empty database or PDB, such as:

  • Create Database …
  • Create Pluggable Database …
  • Drop Schema …

The published website is https://odbcapture.org

ODBCapture has been successfully tested on these platforms (Click the link).

ODBCapture has been successfully tested on these database object types:

  • Advanced Queue
  • Advanced Queue Table
  • Context
  • Database Link
  • Database Trigger
  • Directory
  • Foreign Key (psuedo-object)
  • Grant, Database Object (psuedo-object)
  • Grant, System Privilege (psuedo-object)
  • Host ACL (psuedo object)
  • PL/SQL Function
  • Java Source
  • Index
  • Materialized View
  • Materialized View Index
  • Materialized View Foreign Key
  • Materialized View Trigger
  • Package Body
  • Package Specification
  • PL/SQL Procedure
  • RAS ACL (psuedo-object)
  • Role
  • Scheduler Job
  • Scheduler Program
  • Scheduler Schedule
  • Sequence
  • Schema Trigger
  • Synonym
  • Table
  • Table Index
  • Table Foreign Key
  • Table Trigger
  • Type Body
  • Type Specification
  • User
  • View
  • View Foreign Key
  • View Trigger
  • Wallet ACL (psuedo-object)
  • XDB ACL (psuedo-object)

ODBCapture has been successfully tested on these database data types:

    • BLOB
    • CHAR
    • CLOB
    • DATE
    • INTERVAL_DAY_TO_SECOND
    • JSON
    • NUMBER
    • RAW
    • TIMESTAMP
    • TIMESTAMP_WITH_LOCAL_TZ
    • TIMESTAMP_WITH_TZ
    • VARCHAR2
    • XMLTYPE


    Monday, August 19, 2024

    GitHub Pages Jekyll Theme Google Analytics Update

     Let's breakdown that title:

    • GitHub Pages - a website hosting feature in GitHub
    • Jekyll Theme - a static site generator with built-in support for GitHub Pages.
    • Google Analytics Update - Google Analytics 4 is the next generation of Analytics which collects event-based data from both websites and apps
    If you are using Jekyll Themed GitHub Pages with Google Analytics and haven't found the simplest way to convert it from Universal Analytics to GA4, this is your "how to"...

    Jekyll Themes


    Universal Analytics was a simple setup before GA4.  The "_config.yml" included a "google_analytics:" location where the Universal Analytics ID would activate the needed website changes to begin data collection.  With GA4 the new Measurement ID replaces the Universal Analytics ID.  However, the website activation is different for GA4.  Fortunately, the creators of Jekyll Themes included a place to update this new website activation.

    Head Custom Google Analytics


    GutHub Pages has several supported Jekyll Themes.  Each of these themes has an "_includes/head-custom-google-analytics.html" file.

    Within the "_includes/head-custom-google-analytics.html" file is the website activation code:
    {% if site.google_analytics %}
      <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
                m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
            })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
        ga('create', '{{ site.google_analytics }}', 'auto');
        ga('send', 'pageview');
      </script>
    {% endif %}
        
    That code needs to be changed to the new data collection script:
    {% if site.google_analytics %}
      <!-- Google tag (gtag.js) -->
      <script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
      <script>
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());
        gtag('config', '{{ site.google_analytics }}');
      </script>
    {% endif %}
        

    Call Tree


    The "_includes/head-custom-google-analytics.html" file is called from the "_includes/head-custom.html" file by this line:
    {% include head-custom-google-analytics.html %}
    The "_includes/head-custom.html" file is called from the "_layouts/default.html" file by this line:
        {% include head-custom.html %}
    The "_layouts/default.html" file is the top level template in each Jekyll Theme.

    Procedure

    1. Create an "_includes" folder in the same folder as the "_config.yml" file.
    2. Copy the "_includes/head-custom-google-analytics.html" file for the correct theme from the list above.
    3. Paste the "_includes/head-custom-google-analytics.html" file into the new "_includes" folder.
    4. Modify the contents of the new "_includes/head-custom-google-analytics.html" file as described above.
    5. Push the changes and wait for GitHub to refresh the website.
    6. Confirm the new Google Analytics code in the header of the HTML source.

    Friday, July 5, 2024

    Oracle Cloud Autonomous Database File Not Found for TLS Connection


    The Attempt:

    I created an Autonomous Database on Oracle Cloud.  I used TLS (protocol=tcps) to successfully connect from a Windows SQL*Plus Instant Client to the database on Oracle Cloud.  However, I was unable to connect from an Ubuntu (Gnome) SQL*Plus Instant Client to the database on Oracle Cloud.


    The Error:

    Each connection attempt from Ubuntu SQL*Plus Instant Client to the Autonomous Database on Oracle Cloud threw a "file not found" error.


    Troubleshooting:

    I ran a "trace" in "sqlnet.ora" and found many "file not found" errors, all seemed to be related to Wallet, SSL, and Certificate Store.  In the trace file, I found SQL*Net was looking for the Certificate Store in "/etc/pki/tls/cert.pem".


    The Solution:

    I did not configure a wallet.  TLS uses CA Certificates instead of PKI certificates.

    I found a single file (PEM bundle) in "/etc/ssl/certs/ca-certificates.crt".  This was confirmed at Ubuntu's Website: Ubuntu root CA certificate trust store location

    I could not find a configuration in SQL*Net to change the location of the Certificate Store from "/etc/pki/tls/cert.pem" to "/etc/ssl/certs/ca-certficiates.crt".

    I did find moscicki at GitHub had a Symbolic Link that I was missing.  After I created the symbolic link, I was able to make the TLS connection from Oracle Instant Client for Linux x86-64 Version 23.4.0.0.0 to an Autonomous Database on Oracle Cloud without a wallet.

    Run these as root in Ubuntu:

    mkdir /etc/pki/tls
    ln -s /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/cert.pem

    Tuesday, July 2, 2024

    Git Clone GLIBCXX_3.4.29 Not Found on Xubuntu


    The Attempt:


    This was my first attempt to clone a Github repository on Xubuntu (XFCE Desktop) using VSCode. I did not have this problem with Ubuntu (Gnome Desktop).
    • VSCode Version
      Version: 1.90.2
      Commit: 5437499feb04f7a586f677b155b039bc2b3669eb
      Date: 2024-06-18T22:33:48.698Z
      Electron: 29.4.0
      ElectronBuildId: 9728852
      Chromium: 122.0.6261.156
      Node.js: 20.9.0
      V8: 12.2.281.27-electron.0
      OS: Linux x64 5.15.0-113-generic snap
    • Git Version
      root# git --version
      git version 2.34.1
    • XUbuntu Version
      root# lsb_release -a
      No LSB modules are available.
      Distributor ID: Ubuntu
      Description: Ubuntu 22.04.4 LTS
      Release: 22.04
      Codename: jammy

      root# dpkg -l '*-desktop' | grep ^ii | grep 'ubuntu-'
      ii xubuntu-desktop 2.241 amd64 Xubuntu desktop system

    The Error Message:


    I received an error that included the following:
    git clone https://github.com/USER/REPO.git /home/USER/github/REPO --progress
    /snap/core20/current/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib/x86_64-linux-gnu/libproxy.so.1)
    (USER is my username and REPO is the repository name.)

    Troubleshooting:


    I searched Google and found a myriad of solutions that included:
    • Update from "snap20" to "snap22"
    • Remove/Reinstall VSCode
    • Modify "snapcraft.yaml"
    I confirmed my "snap22" library contained the needed GLIBCXX_3.4.29 module. However, I didn't like any of those solutions because they required some underlying "tweeking" that has caused trouble in the past.

    The Solution:


    I stumbled onto this solution accidentally, and I don't know why it works. Run these commands using the "Git Bash Terminal" in VSCode
    cd /home/USER/github
    git clone https://github.com/USER/REPO.git REPO --progress