A new HowTo and FAQ Portal for WinCC OA, Oracle and more is now online: http://www.winccoa.net/
WinCC OA history data replication (RDBSyncForward) HowTo…
It is possible to use the RDBSyncForward feature to replicate history data to a second Oracle database.
WinCC OA primarily writes the history data to the first database. Values are replicated from the first database to the second database by Oracle-Packages (part of WinCC OA). When the first database goes down then WinCC OA will continue to write history data to the second database. When the first database gets up and running again then WinCC OA will switch back to the first database and the history data which was written to the second database will be replicated from the second database to the first database.
The bi-directional replication is done asynchronously (periodically)! If one database crashes some history data may be lost.
Prepare two RDB configuration files
RDB_config_DB1.sql and RDB_config_DB2.sql.
Use RDB_config_template.sql: C:\Siemens\Automation\WinCC_OA\3.12\data\RDBSetup\ora\RDB_config_template.sql
Example configuration file with ASM is shown at the end.
The following lines are important for the data replication.
RDB_config_DB1.sql:
define whatpackage = 'fwd'
define connect_first = '&connect_identifier'
define connect_second = 'DB2'
define whatinstall = '3'
define syncjob_intval = 1
RDB_config_DB2.sql:
define whatpackage = 'fwd'
define connect_first = '&connect_identifier'
define connect_second = 'DB1'
define whatinstall = '3'
define syncjob_intval = 1
Prepare the TNSNAMES.ORA
It must contain both databases and must be deployed to the WinCC OA server(s) and to the database servers!
An TNSNAMES.ORA example you will find below.
Change to RDBSetup directory
C:\Siemens\Automation\WinCC_OA\3.12\data\RDBSetup\ora
Execute the RDB-Manager-Setup-Script for the first Oracle-Database.
> win_install.bat/unix_intall.sh _DB1
Execute the RDB-Manager-Setup-Scriptfor the second Oracle-Database.
> win_install.bat/unix_intall.sh _DB2
Change to sync subdirectory C:\Siemens\Automation\WinCC_OA\3.12\data\RDBSetup\ora\sync
Execute the sync setup for database 1
> sync_setup _DB1 ..\
Execute the sync setup for database 2
> sync_setup _DB2 ..\
Check arc_log table for (error)messages
select * from arc_log order by arc_log_id desc
Adapt WinCC OA config file
Important for the data replication is the following configuration:
[ValueArchiveRDB]
Db = “DB1,DB2”
RDB archive group configuration
In WinCC OA go to system management / database / RDB archive groups and set the check box “forwarding” for the archive groups you wanna sync.
WinCC OA config file
[general]
useRDBArchive = 1
useRDBGroups = 1
[ValueArchiveRDB]
DbUser = "RDBSYNC"
DbPass = "manager"
DbType = "ORACLE"
Db = "DB1,DB2"
writeWithBulk = 1
[ctrl]
queryRDBdirect = 1
CtrlDLL = "CtrlADO"
CtrlDLL = "CtrlRDBArchive"
CtrlDLL = "CtrlRDBCompr"
[ui]
queryRDBdirect = 1
CtrlDLL = "CtrlADO"
CtrlDLL = "CtrlRDBArchive"
CtrlDLL = "CtrlRDBCompr"
TNSNAMES.ORA
DB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Linux-DB-01)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = DB1))
)
DB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Linux-DB-02)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = DB2))
)
RDB_config_DB1.sql
define connect_identifier = 'DB1'
define sysdba_user = 'SYS'
define yesno_newuser = 'yes'
define schema_user = 'RDBSYNC'
define app_user = 'RDBSYNCAPP'
define use_rman = 'rman'
define os_sys = 'unix'
define zip_backup = 'no'
define sequence_start = 100000
define sequence_maxvalue = 199999
define path_dbfile = '+DATA/WINCCOA/RDBSYNC/'
define path_tempdbfile = '+DATA/WINCCOA/RDBSYNC/'
define path_oraclebin = '/u01/app/oracle/product/12.1.0/dbhome_1/bin/'
define instance_name = 'DB1'
define host_name = 'linux-db-01'
define path_backup = '/u01/app/oracle/fast_recovery_area/DB1/winccoa/'
define path_alert = '+DATA/WINCCOA/RDBSYNC/'
define path_event = '+DATA/WINCCOA/RDBSYNC/'
define mytimezone = 'Europe/Vienna'
define asm_instance = '+ASM'
define service_name = 'DB1'
define number_db_storage = 1
define whatpackage = 'fwd'
define connect_first = '&connect_identifier'
define connect_second = 'DB2'
define whatinstall = '3'
define syncjob_intval = 1
RDB_config_DB2.sql
define connect_identifier = 'DB2'
define sysdba_user = 'SYS'
define yesno_newuser = 'yes'
define schema_user = 'RDBSYNC'
define app_user = 'RDBSYNCAPP'
define use_rman = 'rman'
define os_sys = 'unix'
define zip_backup = 'no'
define sequence_start = 100000
define sequence_maxvalue = 199999
define path_dbfile = '+DATA/WINCCOA/RDBSYNC/'
define path_tempdbfile = '+DATA/WINCCOA/RDBSYNC/'
define path_oraclebin = '/u01/app/oracle/product/12.1.0/dbhome_1/bin/'
define instance_name = 'DB2'
define host_name = 'linux-db-02'
define path_backup = '/u01/app/oracle/fast_recovery_area/DB1/winccoa/'
define path_alert = '+DATA/WINCCOA/RDBSYNC/'
define path_event = '+DATA/WINCCOA/RDBSYNC/'
define mytimezone = 'Europe/Vienna'
define asm_instance = '+ASM'
define service_name = 'DB2'
define number_db_storage = 1
define whatpackage = 'fwd'
define connect_first = '&connect_identifier'
define connect_second = 'DB1'
define whatinstall = '3'
define syncjob_intval = 1
Disable IPV6 on Solaris 11.2…
ipadm
ipadm disable-addr -t net0/v6
Oracle Startup Pluggable Database with Container Database…
With 12.1.0.2 the state of pluggable databases can be saved:
ALTER PLUGGABLE DATABASE xxx SAVE STATE;
Oracle Listener disable connect logging…
Disable logging of every connect request:
listener.ora:
LOGGING_
otherwise the listener will log every connect and fill up the listener.log
[oracle@Database trace]$ ls -la
total 30696
drwxr-xr-x 2 oracle oinstall 4096 Aug 24 20:19 .
drwxr-xr-x 14 oracle oinstall 4096 May 4 09:18 ..
-rw-r—– 1 oracle oinstall 31393482 Aug 25 17:28 listener.log
Install VMWare-Tools on Debian…
apt-get install build-essential
apt-get install linux-headers-$(uname -r)
aftwards install the VMWare tools…
Flashback Database ….
It is pretty cool to create a restore point for the database before doing some upgrades. If upgrade fails the database can be set back to the restore point by a single statement.
CREATE RESTORE POINT before_upgrade GUARANTEE FLASHBACK DATABASE;
SELECT NAME, SCN, TIME, DATABASE_INCARNATION#, GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE FROM V$RESTORE_POINT;
FLASHBACK DATABASE TO RESTORE POINT before_upgrade;
DROP RESTORE POINT before_upgrade;
WinCC OA pivot query to combine history values with same timestamp in one row…
This example combines the WinCC OA audit trail datapoint elements to a single row for one audit trail entry.
select “TS”,”TIME”,”USERNAME”,”UINUM”,”BATCHID”,”ITEM”,”ITEMTYPE”,”ACTION”,”OLDVAL”,”NEWVAL”,”REASON”,”HOST” from (
select h.ts, e.ELEMENT_NAME, NVL(to_char(h.VALUE_NUMBER),h.VALUE_STRING) val
from eventhistory h
join elements e on e.ELEMENT_ID = h.ELEMENT_ID
where e.ELEMENT_NAME in (
‘System1:_AuditTrail.time’,
‘System1:_AuditTrail.username’,
‘System1:_AuditTrail.uinum’,
‘System1:_AuditTrail.batchid’,
‘System1:_AuditTrail.item’,
‘System1:_AuditTrail.itemtype’,
‘System1:_AuditTrail.action’,
‘System1:_AuditTrail.oldval’,
‘System1:_AuditTrail.newval’,
‘System1:_AuditTrail.reason’,
‘System1:_AuditTrail.host’
)
) a
pivot (listagg(val) within group (order by element_name)
for element_name in (
‘System1:_AuditTrail.time’ as time,
‘System1:_AuditTrail.username’ as username,
‘System1:_AuditTrail.uinum’ as uinum,
‘System1:_AuditTrail.batchid’ as batchid,
‘System1:_AuditTrail.item’ as item,
‘System1:_AuditTrail.itemtype’ as itemtype,
‘System1:_AuditTrail.action’ as action,
‘System1:_AuditTrail.oldval’ as oldval,
‘System1:_AuditTrail.newval’ as newval,
‘System1:_AuditTrail.reason’ as reason,
‘System1:_AuditTrail.host’ as host
));
Simple Windows Phone App to get Push Notifications from WinCC OA…
WinCC OA read csv file…
A simple code how to read/import a CSV file into an array (dyn_dyn_string).
main()
{
string content;
fileToString(DATA_PATH+"/csvtest.txt", content); // read file into a string variable
dyn_dyn_string result;
dyn_string lines = strsplit(content, "\n"); // split the string into lines
for ( int i=1; i<=dynlen(lines); i++ ) {
result[i]=strsplit(lines[i], ";"); // delimiter ";"
}
DebugTN(result);
}
Limitations:
* Don’t do it in that way with very big files because it is read from the file into memory
* The delimiter “;” cannot be inside of a cell value
With oracle you can use external tables to access CSV files. After creating an external table it is possible to access the file by SQL:
select * from ext_tab
CREATE DIRECTORY EXT_DIR AS '/home/oracle/data';
-- Create table
create table ext_tab
(
Col1 VARCHAR2(30),
Col2 VARCHAR2(30),
Col3 VARCHAR2(30)
)
organization external
(
type ORACLE_LOADER
default directory EXT_DIR
access parameters
(
RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY ";"
)
location (EXT_DIR:csvtest.csv')
)
reject limit UNLIMITED;