WWW ON OL72 часть 02 (ORACLE)
ared
По ццц, в наличии следющие пакеты.
php.x86_64                                             5.4.16-36.el7_1
php-pdo.x86_64                                      5.4.16-36.el7_1
php-pear.noarch                                      1:1.9.4-21.el7          

Надо ставить сам Oracle client, версию берем нормальную версию на не коценную (Instant Client)
1. yum install oracle-rdbms-server-11gR2-preinstall

Пакет создал пользователя Oracle, домашняя директория в /home/
1.1 создаем под клиента директорию /opt/oracle
mkdir /opt/oracle
chown oracle:oinstall /opt/oracle/

1.2. Задал пароль пользователю oracle (passwd oracle)
1.3 Пакет почемуто не создает для пользователя Oracle bash script c переменными типа ORACLE_HOME
я взял скрипт со SLES для RDBMS 10.2 и положил в /etc/profile.d/
[oracle.sh]
#
# Set your ORACLE environment variable here
# ORACLE_HOME - Used here and in /etc/init.d/oracle (ora_environment())
# ORACLE_SID - Your Oracle System Identifier
#
ORACLE_BASE=/opt/oracle
ORACLE_HOME=$ORACLE_BASE/11.2
ORACLE_SID=orcl
export ORACLE_BASE ORACLE_HOME ORACLE_SID
# For RAC
export ORA_CRS_HOME=$ORACLE_BASE/product/10gR2/crs
export ORA_ASM_HOME=$ORACLE_BASE/product/10gR2/asm
# For NLS
export NLS_LANG=RUSSIAN_CIS.UTF8
#
# Login environment variable settings for Oracle
# The code below is done ONLY if the user is "oracle":
#
if [ `id -un` == "oracle" ]; then
# Get settings, if file(s) exist(s). If not, we simply use defaults.
if test -f /etc/sysconfig/oracle; then
# new location as of SL 8.0 is directory /etc/sysconfig/
. /etc/sysconfig/oracle
else
if test -f /etc/rc.config.d/oracle.rc.config; then
# location is directory /etc/rc.config.d/
. /etc/rc.config.d/oracle.rc.config
else
if test -f /etc/rc.config; then
# old SuSE location was to have everything in one file
. /etc/rc.config
fi
fi
fi
# Grid Control Agent Home
AGENT_HOME=$ORACLE_BASE/product/10.2/agent
TNS_ADMIN=$ORACLE_HOME/network/admin
# Set ORA_NLSxx depending on 9i or 10g
test -d $ORACLE_HOME/ocommon/nls/admin/data && export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
test -d $ORACLE_HOME/nls/data && export ORA_NLS10=$ORACLE_HOME/nls/data
PATH=$PATH:$ORACLE_HOME/bin
LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$ORACLE_HOME/lib:$ORACLE_HOME/ctx/lib
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export AGENT_HOME PATH LD_LIBRARY_PATH CLASSPATH TNS_ADMIN
# ORACLE_TERM=xterm; export ORACLE_TERM
# NLS_LANG=AMERICAN_AMERICA.UTF8; export NLS_LANG
#
# This requires the limits to have been increased by root
# e.g. at boot time by the /etc/rc.d/oracle script, both
# ulimit and kernel parameters.
#
# RAC (cluster) component GSD commands don't run when this is
# set - which it is if a SuSE Java package is installed.
unset JAVA_BINDIR JAVA_HOME
# Set ulimits:
#
# We suppress any warning messages, so if the hard limits have not been
# increased by root and the commands don't work we keep silent...
# This is because the only one who needs it is the shell that starts
# the DB server processes, and the number of warning messages created
# here is potentially way too much and confusing
# core dump file size
ulimit -c ${MAX_CORE_FILE_SIZE_SHELL:-0} 2>/dev/null
# max number of processes for user
ulimit -u ${PROCESSES_MAX_SHELL:-16384} 2>/dev/null
# max number of open files for user
ulimit -n ${FILE_MAX_SHELL:-65536} 2>/dev/null
# For x86/9iR2 (Not required for Oracle 10gR1 or 10gR2)
# Add package "gcc_old" gcc 2.95.3 to path - FIRST
if test -x /opt/gcc295/bin/gcc; then
export PATH=/opt/gcc295/bin:$PATH
fi
# SLES9 specific (Not required for SLES10)
# Set LD_ASSUME_KERNEL (uncomment for SLES9)
# export LD_ASSUME_KERNEL=2.4.21
# This is needed for Oracle 9iR2 Installer.
test -f /usr/lib/libInternalSymbols.so && export LD_PRELOAD=/usr/lib/libInternalSymbols.so
fi


Далее чтоб установить клиента, нам нужны X11. Т.К. ставить на сервер Иксы это грубо говоря моветон то тупо пробрасываем X11 на Windows установив (Xming) через Putty, вот статья на эту тему. Или на линух воркстайшен выполнить ssh -X ip_server

Но у меня с первого раза на OL не заработало.

Список установленных пакетов:
libX11.x86_64                                            1.6.3-2.el7
libX11-common.noarch                              1.6.3-2.el7
xorg-x11-apps.x86_64                               7.7-6.el7
xorg-x11-utils.x86_64                                 7.5-13.1.el7
xorg-x11-xauth.x86_64                              1:1.0.9-1.el7
xterm.x86_64                                             295-3.el7

В стандарный набор в конфиге /etc/ssh/sshd_config
Всего три заветных строчки:
X11Forwarding yes         #Разрешили форвардинг
#X11DisplayOffset 10      #Задали смешение чтоб не конфликтовать с локальным сервером но у нас его нет поэтому #
X11UseLocalhost yes

Последния очень интересная переменная:
X11UseLocalhost yes      #Использовать localhost ( или 127.0.0.1  ;) ) при форвардинге
вот как выглядит рабочий конфиг
echo $DISPLAY   -> localhost:12.0
netstat -ltn
tcp        0      0 127.0.0.1:6012          0.0.0.0:*               LISTEN
И ошибки в при не рабочем  конфиге в  /var/log/secure
no: sshd[]: error: Can't get IP address for X11 DISPLAY.
проверить: nslookup "ИМЯ хоста из /etc/hostname" и фаирвол порт должен быть открыт

yes:
sshd[]: error: Failed to allocate internet-domain X11 display socket.
Вот тут самый интересный момент localhost согласно /etc/hosts это 127.0.0.1, Что тут может мешать ???
Блокировка ip6 на уровне системы, sshd плевал на /etc/hosts и создает по адресу :::6011.  На что мы в ответ добавляем в конфинг /etc/ssh/sshd_config следующию строку: AddressFamily inet

в итоге рабочий конфиг:
X11Forwarding yes
X11UseLocalhost yes
AddressFamily inet

ИМХО это корявое продавливание ip6 на серверверном ПО.

secvice sshd restart

ssh -X oracle@ol72-www
xclock


Далее стандарно ставим клиента:
unzip linux.x64_11gR2_client.zip
cd client
./runInstaller
Tags: , ,

Oracle Listener
ared
Конфиг: listener.ora

[listener.ora]
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.1.53)(PORT = 1521))
#    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.1.13)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv-tmp10g)(PORT = 2481))
(PROTOCOL_STACK =
  (PRESENTATION = GIOP)
  (SESSION = RAW)
)
)
)

Что говорит: lsnrctl status
[lsnrctl]
LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 25-FEB-2016 09:55:49
Copyright (c) 1991, 2010, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.1.53)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.5.0 - Production
Start Date                22-SEP-2015 16:08:12
Uptime                    155 days 18 hr. 47 min. 37 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/10.2/network/admin/listener.ora
Listener Log File         /opt/oracle/10.2/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.1.53)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=srv-tmp10g.tcsm)(PORT=2481))(PROTOCOL_STACK=(PRESENTATION=GIOP)(SESSION=RAW)))
Services Summary...


И вывод netstat -ltn
[netstat]

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:15879         0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:5801            0.0.0.0:*               LISTEN
tcp        0      0 172.18.1.13:1610        0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:27115         0.0.0.0:*               LISTEN
tcp        0      0 172.18.1.13:427         0.0.0.0:*               LISTEN
tcp        0      0 172.16.1.53:427         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:427           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:5902            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:5903            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:2544          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:2481            0.0.0.0:*               LISTEN
tcp        0      0 172.16.1.53:1521        0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:28312           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:28575         0.0.0.0:*               LISTEN
и вывод lsof -n -i | grep lsnr
[lsof]
tnslsnr 21979 oracle    8u  IPv4 1008046       TCP 172.16.1.53:ncube-lm (LISTEN)
tnslsnr 21979 oracle   10u  IPv4 1008049       TCP *:giop (LISTEN)
tnslsnr 21979 oracle   12u  IPv4 7321595       TCP 172.16.1.53:ncube-lm->172.16.1.53:29275 (ESTABLISHED)
Tags:

MS SQL Ошибка 14274
ared
После переименования сиквел сервера, при операциях с джобами имеем ошибку:
Cannot add,update,Delete a Job that originated from an MSX Server.

Согласно сапорта микрософта данная ошибка возникает из-за того, что в базе сохраняется имя сервера( вместо локал). Сапорт нам предлагает: переименовать обратно, заскриптовать джобы, дропнуть джобы, дать новое имя серверу и накатить скрип с джобами.
Не очень гармоничное решение, намного проще:[SQL]
USE [msdb]
UPDATE [dbo].[sysjobs]
SET [originating_server]='NEW_NAME_SERVER'
Tags:

MS SQL Linked Server to Oracle
ared
Создал в мсскюл линкед сервер, OLE DB провайдер использовал оракловый не из набора мдак.


1. OLE/DB Provider 'OraOLEDB.Oracle' IUnknown::QueryInterface returned 0x80070005:  Access denied.
Если выполнять из под аутентификации видны.
2. Non-interface error:  CoCreate of DSO for OraOLEDB.Oracle returned 0x80040154
Если использовать стандартного пользователя сиквела (например sa)
3. OLE/DB Provider 'OraOLEDB.Oracle' ICommandText::Execute returned 0x80040155


Помогла статья с сапорта микрософт:
How to set up and troubleshoot a linked server to an Oracle database in SQL Server

В ней есть описание ошибки: Error 7302: Could not create an instance of OLE DB provider 'MSDAORA'

В реестре создаем раздел с именем OLE DB провайдера,

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\OraOLEDB.Oracle
В вновь созданном разделе создаем параметр (DWORD) AllowInProcess со значением 1

После наслаждаемся работой.

Web service
ared
Yii framework

Error на клиенте:
DTD not supported by SOAP
или
Error Featching http header
В  лога апачи: http://www.livejournal.ru/index.php/WebSrv/quote/ws/1 HTTP 500 Time out


Если открыть в браузере то error:
SoapServer::SoapServer(http://www.livejournal.ru/index.php/WebSrv/quote): failed to open stream: Connection timed out


Проблема из скрытия apache за НАТом., смотрим
CWebService.php
155: $server=new SoapServer($this->wsdlUrl,$this->getOptions());

Сервер создается по урл, www.livejournal.ru, соотвественно DNS преобразует имя www.livejournal.ru в 8.8.8.8, а наш сервер натирован  его ip 192.168.1.4.

Проблема решается просто:
на сервере в  /etc/hosts
192.168.1.4 www.livejournal.ru livejournal.ru
Tags: ,

Как баги привращаются в фичи.
ared

Столкнулся с проблемой, при тестировании pdo_oci
PHP Warning: PDOStatement::fetchAll() : column 0 data was too large for buffer and was truncated to fit it.

$dbh = new PDO('oci:dbname=orcl;charset=utf8', 'user', 'pass');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$sth=$dbh->prepare('SELECT \'ПРИВЕТ\' FROM DUAL');
$sth->execute();
$result = $sth->fetchAll(2);
var_dump($result);


Ожидаем результат "ПРИВЕТ" однако имеем только "ПРИ" 

проверяем в OCI8

$conn = oci_connect('orcl', 'user', 'pass');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT \'ПРИВЕТ\' FROM DUAL');
oci_execute($stid);
$nrows = oci_fetch_all($stid, $res);
var_dump($res);

Ожидаеммы  и полученный результат "ПРИВЕТ".

Как бы все ясно проблема в PDO пытаемся лечить, одно из достоинств опенсоурс наличие исходников, читаем. И находим удивительную фичу  OCI8 работает потому что в нем бага:
если глянуть OCI8 php_oci_statement_execute
То  там размер буфера для данных с OCI_ATTR_DATA_SIZE,
И далее перед выделением 
памяти ошибочно (а может и на намерено ) умножается на 3
else {
outcol->storage_size4++; /* add one for string terminator */
}
outcol->storage_size4 *= 3;
dynamic = OCI_DEFAULT;
buf = outcol->data = (text *) safe_emalloc(1, outcol->storage_size4, 0);
memset(buf, 0, outcol->storage_size4);
break;

В PDO_OCI oci_stmt_describe Все корректно оркл сказал 6 значить 6+1

else {
S->cols[colno].datalen = col->maxlen;
}
if (dtype == SQLT_BIN) {
S->cols[colno].datalen *= 3;
}
S->cols[colno].data = emalloc(S->cols[colno].datalen + 1);
dtype = SQLT_CHR;



Тобишь OCI8  вместо 6+1 ошибочно выделил 21=(6+1)*3 байта и мы имеем ожидаемый результат, а PDO_OCI сделал все верно выделил 7 байт и ожидаемый результат обрезан был обрезан. Так как строка в уникоде.   Просто функция OCIAttrGet OCI_ATTR_DATA_SIZE возвращает размер данных в байтах без учета локальной кодировки.

?

Log in