Showing posts with label 19c. Show all posts
Showing posts with label 19c. Show all posts

Oracle database client installation "The java.library.path system variable is missing or invalid"

As I heard it more than once in the last months, it is the right time to write a blog post about it. I still don't know, why it happens so often at the moment (except of a lack of reading the documentation), but I know, how it will (hopefully) work for you, if you run in this problem (without reading the documentation).

The typical environment where this happen is a Red Hat Linux (mostly 8.x and 9.x), but it can happen on any Linux distribution.

The customers of mine all tried to install a 19c 64-bit Client on a Red Hat Linux system as the installer stopped somewhere with this message:

Preparing to launch Oracle Universal Installer from /tmp/OraInstall20XX-XX-XX_XX-XX-XXPM. Please wait ... The java.library.path system variable is missing or invalid. Please set java.library.path with a correct value and retry the operation.

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.oiipg.OiipgPropertyLoader

First to check is always, if the java environment is set up/available correctly, but typically, it is. Second is to check the documentation for the operating systems requirements of the product you want to install - in case of 19c clients on Linux, the documentation can be found here.

In the above case, the error message  "The java.library.path system variable is missing or invalid" is just wrong. Java is fine and available and the java.library.path is correct.

In this case and with the documentation you can then check the supported (kernel) version and afterwards the Linux system for the required packages, this is e.g. the list for Red Hat Linux 8.x:
bc, binutils, elfutils-libelf, elfutils-libelf-devel, fontconfig-devel, glibc, glibc-devel, ksh, libaio, libaio-devel, libXrender, libX11, libXau, libXi, libXtst, libgcc, libnsl, librdmacm, libstdc++, libstdc++-devel, libxcb, libibverbs, make, policycoreutils, policycoreutils-python-utils, smartmontools, sysstat.

There is also a section in the documentation which allows to check the optional packages required for some products, e.g. ipmiutil (for Intelligent Platform Management Interface), libnsl2 (for Oracle Database Client only), libnsl2-devel (for Oracle Database Client only), net-tools (for Oracle RAC and Oracle Clusterware), nfs-utils (for Oracle ACFS).

Now, what happend to all the customers with the above error message while installing the client? As we found out step by step, one of the required packages were not installed as X86 64bit version: The libnsl. But this isn't told by the installer - it complains about the java.library.path system variable.

All customers just installed libnsl.x86_64 as newest version using 

yum install libnsl.x86_64

and then they retried the installation of the client succesfully. All other packages, except libnsl, were setup with the Red Hat installation, only libnsl was missing.

If you run an Oracle Enterprise Linux you can use the preinstall-rpm for the database (oracle-database-preinstall-19c) - by the way even if you only want to install the client - to get all the libs installed automatically. If you are on Red Hat, you really should check the libraries according to the documentation.

Yes, it is a (mostly) stupid work to compare libs, but if it prevents from a whole day searching for an error with a misleading error message... 



ORA-12520: TNS: Listener could not find available handler for requested type of server

We got the above error running an Oracle Standard Edition Database with a Standby DB protected by Dbvisit Standby, where we have added a special service for the application that registered the service at a remote listener. 

The configuration a little bit more detailed:

  • a database Prod with the db_unique_name Prod_DC1 (datacenter 1) and a standby database with the db_unique_name Prod_DC2 (datacenter 2) - version 19c
  • the Prod database is a CDB with a pluggable database PDB1
  • an additional service was created called PDB1app on the PDB1
  • a Windows VM is used where an application server was running on for the application, "VMAppl1" 
  • A remote listener is configured at the "VMAppl1" for the database services running on both machines that should be used high available with Standard Edition 2 (as the Connection Manager (CMAN) is part of the Enterprise Edition license only)
  • Therefore, the spfile of Prod_DC1 and Prod_DC2 had an entry "remote_listener" which points to the VMAppl1 remote listener

Everything worked well, but after a while the customer complained about random ORA-12520 errors when he tries to connect to the PDB1app service using the remote listener, sometime it worked in one second and the next two seconds he got an error. 

If he used the local listener of the oracle database machine the service was running/started on, the ORA-12520 errors where gone. The error was raised not only with the application, it was reproducible also with SQL*Plus.

Due to high availability constraints in the case of a switchover or failover, the application server and the end users should not work with the both hosts, but with a central remote listener. The application itself can not use tnsnames or the failover technology from a jdbc driver e.g.. 

At the listener log we only found a lot of "service registration" entries, but nothing that pointed directly to an error. After some more tests and some configuration checks we have found the root cause for this issue. Someone has set the "local_listener" entry on the PDB1 to "localhost:1521". We have resetted the value and the issue was gone. This is/was a misconfiguration done while the application in the database was upgraded. 

Nevertheless - in my opinion all "listener" parameters (like remote_listener, local_listener and listener_networks) should be bound to the root container, regardless what is configured in a pluggable database. 

So, if you do run into an ORA-12520 with a container database - in additon to the official support notes (regarding number of processes,...), please check if the listener_* parameters at PDB level are all empty. If not, reset them.


Sync PDB failed with ORA-40365 while performing 'alter user sys account lock password expire' - How to get rid of it.

As so often, a customer was asking for the solution of an error they have seen at the database. After creating a new Oracle 19c database with a fresh PDB in it, they found the error "Sync PDB failed with ORA-40365 while performing 'alter user sys account lock password expire'" in the view PDB_PLUG_IN_VIOLATIONS.

The Oracle Support Note "Sync PDB failed with ORA-40365 while performing 'alter user sys' (Doc ID 2777162.1)" told him that this error can happen when upgrading a database to a newer version.

Doc ID 2777162.1

You know how it is. Things that go differently than they are described demand analysis and don't give you a moment's peace. So I started to recreate the whole thing...

While the customer is working with version 19.8, I installed version 19.13 on my MS Windows laptop and created a new database there with the DBCA. I was (not) surprised when I saw the error on my end as well.

This means that something fundamentally different is going on here than what was described at Oracle Support. 

Log me, find me, SR me

Well - this error shouldn't happen if you create a new database, isn't it? So first I checked the version of the password file on my laptop for the new created CDB. This can be done with "orapwd" and the parameter describe.

Hm, the password file was created with version 12. But the support note told us, that a fresh created CDB should have password file format 12.2 - if not, we can upgrade the file manually to 12.2 using orapwd (more to come later in this blog post). 

So it looks like the DBCA is creating the wrong password file version in some way. But can this be? Maybe it depends on the password complexity? No, also another attempt with a very complex password ended with the same password file version: 12. 

Well, if the DBCA is doing it wrong, maybe it's recorded in the log file of the creation? And yes, it is.
 
 
As you can see at the highlighted line, the DBCA actually creates the password file fix with version 12 - instead of the version 12.2 we expected.
 
In my opinion, this is a bug - so I opened a service request with Oracle about it.
 
Long story short: This isn't a bug. At least not a bug at the DBCA. It is a bug at the documentation resp. the support note. Based on communication with Oracle Support, a new note has now been created:

Oracle Support Document 2663482.1 (19c DB Does Not Make Password File Default Format As 12.2)

can be found at: https://support.oracle.com/epmos/faces/DocumentDisplay?id=2663482.1
This new note now tells us, that we need to pass "-skipPasswordComplexityCheck false" to the DBCA (one has to ensure, that the password set is passing the password complexity function) to get a 12.2 password file. Also, an enhancement request was created to make the 12.2 password file version as the default one when creating a 19c database.
In the original support note (Doc ID 2777162.1), Oracle also has changed things now. First is, they have put in that his can also happen with a newly created database. Also they tell us, why they haven't changed the behavior. This is mainly because, in addition to password complexity, things like "Password Lifetime" for SYSDBA, SYSBACKUP,... users are turned on with password file version 12.2.
So it should be exciting to see if the behavior will then change fundamentally in a newer database version or if will remain as default 12.

How to get rid of it

Well, first step is to recreate your password file with version 12.2 - you use orapwd with a input file and the version you want the new file created as I did: 
 
Don't forget to rename the fresh created file that it has the same filename as the original one had (and check all topics that a change of the password file version does influence). Afterwards, you can fix the error in PDB_PLUG_IN_VIOLATIONS.
I tried to re-open the PDB as well as using "exec dbms_pdb.sync_pdb" - but the error never was set to resolved - it stayed in PENDING state and I weren't able to use "exec dbms_pdb.clear_plugin_violations".

To have the entry removed, I needed to do something I really DON'T like to do - to delete manually from the data dictionary with a "delete from pdb_plug_in_violations where error=40365;"  statement. Be aware that changing things at the Data Dictionary manually can cause a lot of trouble - you should only do it, if you have a sufficient backup and you are sure you do the right thing.






Deinstallation of 19c Database Home with 19.11 and 19.12 error: oracle/rat/tfa/util/ManageTFA

Oracle likes you to run Oracle databases on your servers. This is maybe the reason, why you can't uninstall Oracle database version 19.11 (and 19.12) anymore. 

No, obviously, this isn't the reason, I personally do think it is a bug. 

We hit this bug at a customers environment who was upgrading a test database from 19.11 to 19.12 on his Linux server by migrating it into a new 19.12 Oracle software home. After that he wanted to uninstall the existing 19.11 Oracle database home. 

He went to /u01/app/oracle/product/19.11.0/dbhome_1/deinstall and started the deinstallation by running ./deinstall.sh.

When the deinstallation procedure has started, it soon has hit an error:

ERROR: oracle/rat/tfa/util/ManageTfa
Exited from program. 

We then thought we can detach the Oracle Home from the inventory and remove the folder manually aftwerwards. Therefore we tried to use

./runInstaller -silent -detachHome ORACLE_HOME=$ORACLE_HOME

to remove the home from the inventory. Unfortunately, we got another error. As we were a little bit under time pressure, we decided to rollback the 19.11 RU from the Oracle Home and try to deinstall the software again. This worked without any error. 

If you hit this bug and you want to uninstall the home, just rollback the 19.11 or 19.12 RU with opatch:

- change the location to the OPatch folder and run opatch with lsinventory to see the installed patches:

cd $ORACLE_HOME/OPatch
./opatch lsinventory

The output will look like:

Unique Patch ID: 24175065
Patch description: “Database Release Update : 19.11.0.0.210420 (32545013)

To rollback the 19.11 datbase Release Update you need to run opatch with the id of the patch. The id is marked at the upper output with the green background. Don't use the Unique Patch ID, it's a different ID and the rollback will not work (I just add this because 99% of the DBAs never needed to uninstall a patch 😇). 

$ORACLE_HOME/OPatch/opatch rollback -id 32545013

 After the RU is successfully removed, just start ./deinstall.sh again - it will work like designed. 

I don't know if this bug also hits other operating systems like AIX, Solaris or MS Windows. If you got this error there, it would be nice to leave a comment. As 19.13 isn't released yet, I don' know, if this bug exists there also.


GIS/spatial throws errors on update/delete with base "ORA-00904: SDO_RTREE_READ_ONLY: Invalid identifier"

After migrating a spatial / gis database from standard edition 12.2 to 19c we run into a strange error. The product (in our case it was "Luxdata", but it could be any GIS/Spatial application) stopped working with the new database and throwed a number of errors. The database itself was set up like any other Standard Edition database before (as 19.6) and upgraded to a newer version (in our case Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production Version 19.10.0.0.0.). The database was also migrated to pdb, so it was plugged into as a new container. Operating system is Linux, but the error can happen at every OS.

The application was only reconfigured to use the new database version, but updates to different tables all got an error in "commit method" - leading to a problem with the "ORCDINDEX".

Figuring out the problem we have seen, that the "ORA-00904: SDO_RTREE_READ_ONLY: Invalid identifier" was raised while updating or deleting rows.

The error stack we found is:

ORA-29400: data cartridge error
ORA-00904: "SDO_RTREE_READ_ONLY": invalid identifier
ORA-00904: ORA-00904: "SDO_RTREE_READ_ONLY": invalid identifier: invalid identifier
ORA-06512: at "MDSYS.SDO_RTREE_ADMIN", line 173
ORA-06512: at line 1

Searching a while, we were sure that this happens with any newer Oracle database Standard Edition version, and, as we concluded, it also can be found at Oracle database Enterprise Edition and Oracle Database Cloud Services.

What happened? As you may know, Oracle has changed its Spatial licence to be free of cost (it was an Enterprise Edition option before) end of 2019. Now it seems with Oracle database version 19.8 (and later), Oracle has changed the installation mode. At the "spatial oracle blog" (where the licence change was released) it was mentionend that one must maybe install an update to use the free spatial licence at a later point in time.

After searching at Oracle Support with different criterias we stumbled upon Spatial Query Fails with ORA-00904: "SDO_RTREE_READ_ONLY": invalid identifier (Doc ID 2740852.1) where Oracle tells us "With the inclusion of Spatial in the database license, Oracle Locator only installations are no longer supported." The solution is "install spatial".

What you have to do now is to install spatial (mdinst.sql) completely new into the CDB, the PDB$SEED and (all of) your application pdb(s). This is not very complicated and is done in half an hour to an hour. Unfortunately one has to change the session to be recognized as "Oracle script" session - this is, why I don't post the solution directly herein. Please follow the note I have linked above. You may run into this problem not only while upgrading from 12c, but also if you do have installed e.g. a 19.3 database and upgrade it later on to 19.8 or higher.

Beside of the installation, don't forget to set the pfile parameter SPATIAL_VECTOR_ACCELERATION to true as it will speed up your spatial installation.

ora-00600, ora-44303 and ora-44775 after cloning a remote pdb

These days we had an incident with a 19.6 Oracle database on MS Windows. We have cloned a PDB like we have done it a lot times before using a database link. I already have written some blog posts about that (and you can download the scripts there). 

The "create pluggable database XXXY from XXXX@clone_source refresh mode manual;" succeded, but when we tried to open the pdb, it failed with

ERROR at line 1:
ORA-44303: service name exists
ORA-44775: Pluggable database service cannot be created

The crazy thing is, this is the first time we tried to clone the database to this fresh and empty CDB. 

The alert.log had an additional entry:

ORA-00600: internal error code, arguments: [kpdbIdToTenantKey1], [4099], [], [], [], [], [], [], [], [], [], []

While querying sys.cdb_service$ we have analyzed that the service name was in lowercase letters, while all other service names can be found there in uppercase. 

With this information we have found a bug at MOS - there are different operating system where you can find a patch for - unfortunately not for MS Windows:

Patch 31143870: CORE DUMP DURING DBMS_SERVICE.START_SERVICE USING CASE SENSITIVE NAME FOR PDB

It seems that this is fixed not so long ago as it can be downloaded as one-time fix for 19.10.0.0.0 DBRU (which was released 2 weeks ago).

If you run into this, please try first to install the patch - we weren't able to test it, but it seems it could fix this problem also. 

If this does not fix this problem or if you are on a platform (like MS Windows) where the patch isn't available yet, you may try the workaround that helped us:

delete the wrong (lowercase) service name from sys.cdb_service$ (and if it exists also from sys.service$). Don't forget to commit. 

Afterwards unplug, drop and plugin the PDB again - for us this was working well. The PDB was cloned successfully and we were able to open it without any error. 

Comment: Feb., 22nd, 2021. The 19.10 Bundle is now available also for MS Windows.

Autoupgrade.jar throws error at analyze phase - UPG-1316

While testing the newest versions of autoupgrade.jar, I was running in an error (on my MS Windows environment, I haven't tested that for Linux, etc. yet). 

The error itself is shown as upg-1316, unexpected exception error:



I have seen two different causes, one is for checking disk space without using a Fast Recovery Area. Then you get this "Min_Archive_Dest_Size" error:

 
The same problem arises, when autoupgrade is doing a check for the FRA size - "Disk_Space_For_Recovery_Area".

Versions that are affected are 19.9.2 and 19.10.0, the issue does not happen with 19.7.3, 19.7.5 and 19.8.1 at the same database / server.

After investigating the issue with the Development, the issue was fixed within 4 days at the newest development version, which I have tested successfully. I don't know, when this version will be released and with which version number. If you do hit the problem, stay at 19.8.1 or go for a newer version than 19.10.0, as soon as it is released.
 
@Dev: Thank you for the quick fix!

Oracle In-Memory Base-Level (Part 1: How to setup a test environment with example data)

As everyone is now (hopefully) upgrading their Oracle database to 19c as long term release, most of you gain new functionality. I don't want to mention everything new from 11.2.0.4 or twelve-something to 19c, but there is something that was added, not quietly, but really surprisingly to 19c. 

The In-Memory Base-Level was first announced with the Oracle 20c database beta, which was made available at the Oracle cloud at the beginning of this year. Later on Oracle promulgated that this new feature is available in all Enterprise Edition licenses, starting with version 19.8 (there are some exceptions, e.g. this feature is not allowed at 3rd-party clouds, so there is no availability e.g. at AWS or Azure and some Operating Systems will follow later).

The In-Memory feature is nothing new for Enterprise Edition customers which have bought the In-Memory option. It is available since 12.1, was enhanced and developed with a lot new features since then, and was now released with some restrictions (like the 16 GB maximum size of the In-Memory Column Store, more about the features and restrictions I will post at the second part of this In-Memory Base-Level series).

Before we can start to test the In-Memory Base-Level, we do need to setup an environment. For me as consultant, I can't take a dump from an existing database. It would contain most sensitive data on the one hand, on the other hand I would burst the size of the SSD of my laptop. Therefore, I need to setup something, where I can test things, made especially for my test case scenarios. 

As you may want to do that by yourself, I will tell you, how you can setup a simple environment to test the In-Memory Base-Level using the sample HR schema from Oracle. 

The how-to: 

A) Setup the Example Schemas

1.) Setup a 19.8 database on Linux or Windows with your preferred architecture and customize everything, that one can connect with sqlplus to the database (or pluggable database).

2.) Download the sample schema creation scripts from Github

3.) Copy the scripts to a working directory on your test machine, from which you can run them, and extract them.

4.) Unfortunately, the scripts do have "__SUB__CWD__" folder names inside the sqls and dat files. One needs to change that to the working directory. This is possible e.g. with the following perl command at Linux:

perl -p -i.bak -e 's#__SUB__CWD__#'$(pwd)'#g' *.sql */*.sql */*.dat

If you are on Windows, you can either try to use the perl.exe from your %ORACLE_HOME%/perl/bin and replace $(pwd) at the command with your working directory (but don't kill me, if it does not work, I haven't tested that yet) or you can use e.g. Notepad++ (my preferred tool). With Notepad++ you can use "find in files", specify your working directory and what you want to replace inside of the files of the working directory and it's subdirectories. Once the scripts are ready, you can proceed with

5.) the creation of a tablespace for the sample schemas, e.g. example. If you have setup db_create_file_dest it is a simple 

SQL> create tablespace example;

If you don't know, if this parameter is set, you should check that before:

SQL> show parameter db_create_file_dest

N
AME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest             string     +DATA

6.) I prefer to set this new tablespace as default, because as I do not only run the script but do a lot more, it could otherwise happen that things may be stored accidently at the SYSTEM tablespace or somewhere else.

SQL> alter database default tablespace example;

Remark: The script which is used to create the sample schemas can also create a tablespace with datafiles, but with PDBs there may be an error and personally, I like to do it before and pass only the tablespace name to the script.

7.) Now one can create the sample schemas (please read the readme.txt about the parameters) by running the mksample script. In my environment (I set all passwords to "oracle") I do run the following:

SQL> @/home/oracle/Downloads/db-sample-schemas-19c/mksample oracle oracle oracle oracle oracle oracle oracle oracle example temp $ORACLE_HOME/demo/schema/log pdb1

After the script was running succesful, one now has the example schemas installed, but the number of rows in there does not allow to test any In-Memory functionality, as everything is far to small.

B) Add data into example schemas

Now we can start to add data into the example schemas. We can do this either manually or by script. E.g. I used the HR schema for my tests, so I begin with adding additional rows into the look-up tables Jobs, Locations and Departments. 

1.) Let's do it with jobs:

SQL> insert into jobs values ('IM_TEST','In-Memory-Tester',14000,240000);
        1 row created.
SQL> insert into jobs values ('GG','Good Guys',14,2400);
        1 row created.
SQL> commit;
        Commit complete.
 
Now we do need some more locations (at my sample there are only 23 rows in it). 

2.) Locations:
First we change the LOCATION_ID and the corresponding sequence to fill the table up a little bit more.

SQL> alter sequence locations_seq maxvalue 1000000000 increment by 1;
SQL> alter table locations modify location_id number(9);

As Locations does not have an index on "STREET_ADDRESS" we want to add the STREET_ADDRESS of the already existing rows and add some random data to the other fields. Logically, this does not make any sense, but for testing purposes that's quite ok.

 declare
  i number;

  begin

    for i in 1..200000 loop

    begin

    insert into locations (location_id, street_address, postal_code, city, state_province, country_id)

          values (locations_seq.nextval,

          (select street_address from (select * from locations order by dbms_random.random) where rownum=1),

          trunc(dbms_random.value(1000,999999)),

          (select city from (select * from locations order by dbms_random.random) where rownum=1),

          '',

         (select country_id from (select * from countries order by dbms_random.random) where rownum=1)

          );

    exception when dup_val_on_index then null;

    end;

  end loop;

end;

/
commit;

One ends up with 200'023 rows, but STREET_ADDRESS does have 23 different entries only and it is not evenly distributed.
 

 
 
3.) Departments
For all these locations, we now need some departments:

SQL> alter sequence departments_seq maxvalue 1000000000 increment by 1;
SQL> alter table departments modify department_id number(9);
SQL> alter table departments modify location_id number(9);
SQL> alter table departments modify department_name varchar(100);

As I want to test the In-Memory function with "like XXX%" values, I just add more departments by insert into as select and add the sequence to the DEPARTMENT_NAME.

 You can run something like this, to get also different location_ids and manager_ids per department:

declare
  i number;
begin
   for i in 1..500 loop
      insert into departments
         select departments_seq.nextval,
                substr(department_name,1,20)||'-'||(to_char(trunc(departments_seq.currval))),
                (select manager_id from (select * from departments order by dbms_random.random) where rownum=1),
                (select location_id from (select * from locations order by dbms_random.random) where rownum=1)
                from departments
                where rownum < 30;
   end loop;
end;

After I have run this (and changed some values also) some times, I have now 560'000 different departments in the table, which looks like:

 

4.)  And last, we add some more employees. To test the compression of the In-Memory store, I have created roundabout 750'000 rows with senseless data (because I just use the dbms_random package to create character strings). One can run this several times to blow up the database even more than I did (due to limited resources on my notebook):

SQL> alter table employees modify department_id number(9);
SQL> alter table employees modify email varchar2(50);

declare
  cursor c1 is select department_id from departments where rownum < 20000;
  begin
    for c1_rec in c1 loop
    begin
  insert into employees (employee_id, first_name, last_name, email, hire_date, job_id, salary, department_id)
          values (employees_seq.nextval,
                  dbms_random.string('a',TRUNC(DBMS_RANDOM.value(5,20))),
                  dbms_random.string('a',TRUNC(DBMS_RANDOM.value(5,20))),
                  dbms_random.string('a',TRUNC(DBMS_RANDOM.value(5,20)))||'@mycompany.com',
                  TRUNC(SYSDATE + DBMS_RANDOM.value(0,366)),
                  'IN-MEM',
                  TRUNC(DBMS_RANDOM.value(1000,100000)),
          c1_rec.department_id);
      exception when dup_val_on_index then null;
      end;
  end loop;
end;
/
 
Like I said, the data itself is really senseless, a sample: 
 

 
One of the test scenarios which is mentionend in the In-Memory documentation is a performance improvement when "selecting only some rows of a table with a higher number of columns".
To allow to do some tests with that, I enhance employees by additional columns and add the data from the original columns (but without creating indexes or constraints) by an update. 
 
SQL> alter table employees add (employee_id_1 number(6), first_name_1 varchar2(20),
 last_name_1 varchar2(25), email_1 varchar2(50), phone_number_1 varchar2(20),
 hire_date_1 date, job_id_1 varchar2(10), salary_1 number(8,2), commission_pct_1 number(2,2),
 manager_id_1 number(6), department_id_1 number(9),
 employee_id_2 number(6), first_name_2 varchar2(20), last_name_2 varchar2(25),
 email_2 varchar2(50), phone_number_2 varchar2(20), hire_date_2 date,
 job_id_2 varchar2(10), salary_2 number(8,2), commission_pct_2 number(2,2),
 manager_id_2 number(6), department_id_2 number(9),
 employee_id_3 number(6), first_name_3 varchar2(20), last_name_3 varchar2(25),
 email_3 varchar2(50), phone_number_3 varchar2(20), hire_date_3 date,
 job_id_3 varchar2(10), salary_3 number(8,2), commission_pct_3 number(2,2),
 manager_id_3 number(6), department_id_3 number(9),
 employee_id_4 number(6), first_name_4 varchar2(20), last_name_4 varchar2(25),
 email_4 varchar2(50), phone_number_4 varchar2(20), hire_date_4 date,
 job_id_4 varchar2(10), salary_4 number(8,2), commission_pct_4 number(2,2),
 manager_id_4 number(6), department_id_4 number(9));

SQL> update employees set
        employee_id_1=employee_id, employee_id_2=employee_id, employee_id_3=employee_id, employee_id_4=employee_id,
        first_name_1=first_name, first_name_2=first_name, first_name_3=first_name, first_name_4=first_name,
        last_name_1=last_name, last_name_2=last_name, last_name_3=last_name, last_name_4=last_name,
        email_1=email, email_2=email, email_3=email, email_4=email,
        hire_date_1=hire_date, hire_date_2=hire_date, hire_date_3=hire_date, hire_date_4=hire_date,
        job_id_1=job_id, job_id_2=job_id, job_id_3=job_id, job_id_4=job_id,
        salary_1=salary, salary_2=salary, salary_3=salary, salary_4=salary,
        department_id_1=department_id, department_id_2=department_id, department_id_3=department_id, department_id_4=department_id;

SQL> commit;

 
That's it. With this data in place we can implement the In-Memory Base level and test some SQLs. I will write a second blog post about that soon.