2015-03-24

ThunerBird для корпоратива

В ПРОЦЕССЕ НАПИСАНИЯ!!!! НЕ ЗАКОНЧЕНО!!!

В предыдущей теме мы пытались, как оказалось, перекопать огород зубочисткой, а хотели от нас совсем другого. А хотели от нас... Тут заинтригую и не скажу.

А пока задача вот такая. Вся контора сидит на thunderbird версии от 2 до 31. Есть адресная книга на ldap, и ко всем клиентам она привязана. Нужно чтобы ко всем письмам прикреплялась подпись, в содержании которой будет ФИО, контакты, должность, компания, адрес и логотип. На данный момент есть 4 почтовых сервера, из которых 3 для пользователей. Везде postfix, на 2-х dovecot, на одном cyrus-imapd. В будущем эти три объединим в один cyrus-imapd. Общее количество ящиков - порядка 500. Те что на dovecot сидят на POP, cyrus-imapd - на IMAP.

Карочи, заапарк йурскага периада.

Конечно, будет все приводится в порядок, а пока цель - подпись, благо есть адресная книга и при должном напильнике thunderbird можно превратить в классный корпоративный клиент. По крайней мере так в инете пишуть :) А чо, а мы попробуем...

Во первых, пока говорить будем о версии 31.5. За старичков возможно отдельно что-то скажем, а может и нет.

Файл который нас интересует - omni.ja. Файл являетс jar архивом. В нем есть файлы greprefs.js и default/prefs/all-thunderbird.js. Сие есть файл с глобальными настройками, которые, насколько я понял, менее приоритетные, чем настройки из файла prefs.js, который лежит в профиле.
Есть у меня такое впечатление, что default/prefs/all-thunderbird.js это тот же greprefs/all.js из знаменитой статьи на хабре(http://habrahabr.ru/post/101905/). Кстати, спасибо автору, статья была одним из источников для сего творения.

Редактируем default/prefs/all-thunderbird.js, добавляем туда строку

pref("general.config.filename", "thunderbird.cfg");

После чего создаем файл thunderbird.cfg, и располагаем его возле файла omni.ja

Настроим в нем, например, нашу адресную книгу:



Читать далее

2015-03-18

Корпоративная подпись в почте. Add A Disclaimer To Outgoing Emails With alterMIME

Выполнено на базе статьи http://habrahabr.ru/post/242185/

Предполагается, что необходимые пакеты находятся в /u02/install/ (addAttachFilter.pl, altermime-0.3.10.tar.gz)

antares:~ # cd /u02/install/
antares:/u02/install # tar -xvzf altermime-0.3.10.tar.gz
antares:/u02/install # cd altermime-0.3.10/

Дальше моя инициатива. При компиляции получаем ошибку:

cc1: warnings being treated as errors
qpe.c: In function ‘qp_encode’:
qpe.c:94: error: format ‘%d’ expects type ‘int’, but argument 5 has type ‘size_t’
make: *** [qpe.o] Error 1

Основываясь на подсказке компилятора, в файлах qpe.c и qpe.h меняем size_t на int.

ВНИМАНИЕ!!! Если у вас ошибки нет(версия компилятора старенькая), то менять исходники не надо!!!

Компилим и ставим:

antares:/u02/install/altermime-0.3.10 # make
cc -Wall -Werror -g -I. -O2  -c qpe.c
cc -Wall -Werror -g -I. -O2  altermime.c strstack.o mime_alter.o ffget.o pldstr.o filename-filters.o logger.o MIME_headers.o libmime-decoders.o boundary-stack.o qpe.o -o altermime
antares:/u02/install/altermime-0.3.10 # make install
strip altermime
cp altermime /usr/local/bin
chmod a+rx /usr/local/bin/altermime

Вроде без ошибок.
Дальше в соответствии с документацией (брал из deb пакетов, ибо с сайта ее не дернешь - ссылки не работают:

antares:/u02/install/altermime-0.3.10 # useradd -r -c "Postfix Filters" -d /var/spool/filter filter
antares:/u02/install/altermime-0.3.10 # mkdir /var/spool/filter
antares:/u02/install/altermime-0.3.10 # chown filter /var/spool/filter
antares:/u02/install/altermime-0.3.10 # chmod 750 /var/spool/filter


postfix_filter.sh берем также из deb пакета и копируем в

antares:/u02/install/altermime-0.3.10 # cp /u02/install/postfix_filter.sh /etc/postfix/disclaimer
antares:/u02/install/altermime-0.3.10 # chown filter /etc/postfix/disclaimer
antares:/u02/install/altermime-0.3.10 # chmod 750 /etc/postfix/disclaimer

antares:/u02/install/altermime-0.3.10 # touch /etc/postfix/disclaimer_addresses
 

Вносим в disclaimer_addresses какие-нибудь адреса из тех, к которым нужно цеплять подпись, так что файл будет иметь вид:


mail1@domain.com
khsdkfh@domain.com
jdjdj@domain.com

Файле /etc/postfix/disclaimer приводим к виду:

#!/bin/sh
# Localize these.
INSPECT_DIR=/var/spool/filter
SENDMAIL=/usr/sbin/sendmail
DISCLAIMER_ADDRESSES=/etc/postfix/disclaimer_addresses

# Exit codes from
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit
$EX_TEMPFAIL; }

cat >in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }

####### Changed From Original Script #######
# obtain From address
from_address=`grep -m 1 "From:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1`

if [ `grep -wi ^${from_address}$ ${DISCLAIMER_ADDRESSES}` ]; then
    /usr/local/bin/altermime --input=in.$$ \
        --disclaimer=/etc/postfix/disclaimer.txt \
        --disclaimer-html=/etc/postfix/disclaimer.txt \
        --xheader="X-Copyrighted-Material: Please visit http://www.company.com/privacy.htm" || \
            { echo Message content rejected; exit $EX_UNAVAILABLE; }
fi
####### Changed From Original Script END #######

$SENDMAIL -oi "$@"
exit $?


Создаем файл с подписью:

antares:/u02/install/altermime-0.3.10 # touch /etc/postfix/disclaimer.txt

Собственно в нем будет текст подписи. Например такой:

Пусть всегда будет солнце!
Пусть всегда будет небо!!
Пусть всегда будем мама!!!
Пусть всегда буду я!!!!

В файле /etc/postfix/master.cf меняем

smtp      inet  n       -       n       -       -       smtpd

на

smtp      inet  n       -       n       -       -       smtpd
        -o content_filter=dfilt:


и в конце добавляем:

dfilt     unix    -       n       n       -       -       pipe
    flags=Rq user=filter argv=/etc/postfix/disclaimer -f ${sender} -- ${recipient} 


Ну и рестартуем постфикс после этого.

Ну и что не маловажно - после этого имеем маленькую радость - письма адресатов из файла disclaimer.txt автоматически дописываются веселым жизнейтверждающим лозунгом ;)

То есть прилепить принудительно текстуху при прохождении письма через MTA - это мы сделали.

Но нам этого мало.

Обновление от 23.03.2015 - нам этого оказалось вообще не так надо. Руководство промеж собой перетерло и решилось на кровавый вариант. Он будет описан отдельно. Так что данную тему пока закрываем.


Читать далее

2015-02-11

Автологин windows server

В некоторых случаях надо, чтобы был автологин по админом на виндозный сервер. Склероз не позволяет зхапомнить, поэтому каждый раз приходится гуглить или спрашивать. Так вот, чтоб не спрашивать:

control userpasswords2

замечательная мегаутилита запускается из командной строки и позволяет решить проблему :)

Читать далее

2015-01-26

VMWare vSphere ESXi 5.5 update process

===========================================
Current Version:
===========================================
VMWare vSphere ESXi 5.5.0 1623387 (5.5 Update 1, Release date: 2014-03-11, KB 2065832)
Image Profile: ESXi-5.5.0-20140302001-standard
===========================================
Updates Available (ESXi 5.5 all):
===========================================
ESXi550-201312001 Build Number: 1474528 KB 2063795 Release Date: 2013-12-22
update-from-esxi5.5-5.5_update01 Build Number: 1623387 KB 2065832 Release Date: 2014-03-11
ESXi550-201404001 Build Number: 1746018 KB 2076120 Release Date: 2014-04-19
ESXi550-201404020 Build Number: 1746974 KB 2076586 Release Date: 2014-04-19
ESXi550-201406001 Build Number: 1881737 KB 2077359 Release Date: 2014-06-10
ESXi550-201407001 Build Number: 1892794 KB 2077405 Release Date: 2014-07-01
update-from-esxi5.5-5.5_update02 Build Number: 2068190 KB 2079725 Release Date: 2014-09-09
ESXi550-201410001 Build Number: 2143827 KB 2087358 Release Date: 2014-10-15
ESXi550-201412001 Build Number: 2302651 KB 2096281 Release Date: 2014-12-02
===========================================
Install process:
===========================================
#mkdir patches on local storage root
#download patches in same directory
#poweroff all vm on esxi host
#connect to ssh esxi
vim-cmd hostsvc/maintenance_mode_enter
cd /vmfs/volumes/datastore1/patches/
esxcli software vib update -d "/vmfs/volumes/datastore1/patches/ESXi550-201404001.zip"
esxcli software vib list
reboot
vim-cmd hostsvc/maintenance_mode_exit
#poweron all vm on esxi host
#upgrade vmware-tools if needed

Читать далее

2015-01-23

Oracle 8.1.7.4 битые блоки продолжение

Имеем следующее:

. . exporting table                   TGROUPSCHEMA          8 rows exported
. . exporting table                          THEAD
EXP-00056: ORACLE error 1578 encountered
ORA-01578: ORACLE data block corrupted (file # 66, block # 107197)
ORA-01110: data file 66: '/u02/oradata/main/umc_data01.ora'
. . exporting table                     TMATHERIAL     156757 rows exported

Действия:

adonis:~ # su - oracle
oracle@adonis:~> dbv file=/u02/oradata/main/umc_data01.ora blocksize=8192

DBVERIFY: Release 8.1.7.4.0 - Production on Fri Jan 23 10:38:07 2015

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

DBVERIFY - Verification starting : FILE = /u02/oradata/main/umc_data01.ora
Block Checking: DBA = 276931261, Block Type = KTB-managed data block
Found block already marked corrupted


DBVERIFY - Verification complete

Total Pages Examined         : 128000
Total Pages Processed (Data) : 45601
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 70514
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 460
Total Pages Empty            : 11425
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0

oracle@adonis:~> export ORACLE_SID=main                                                     
oracle@adonis:~> sqlplus /nolog                                                                                               
                                                                                                                              
SQL*Plus: Release 8.1.7.0.0 - Production on Fri Jan 23 10:45:14 2015                                                          
                                                                                                                              
(c) Copyright 2000 Oracle Corporation.  All rights reserved.                                                                  

SQL> connect sys as sysdba
Enter password:
Connected.
SQL> select owner, segment_name, segment_type from dba_extents
where file_id=dbms_utility.data_block_address_file(276931261)
and dbms_utility.data_block_address_block(276931261) between block_id and block_id+blocks-1  2    3 
  4  ;

OWNER
------------------------------
SEGMENT_NAME
--------------------------------------------------------------------------------
SEGMENT_TYPE
------------------
UMC_DBA
THEAD
TABLE

Ну это и так было понятно.

SQL> SET serveroutput on
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
     SCHEMA_NAME => 'UMC_DBA',
     OBJECT_NAME => 'THEAD',
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     corrupt_count =>  num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;
SQL>   2    3    4    5    6    7    8    9   10   11 
 12  /
number corrupt: 2

PL/SQL procedure successfully completed.

SQL> SELECT object_name, block_id, corrupt_type, marked_corrupt,
corrupt_description, repair_description
FROM repair_table;  2    3 

OBJECT_NAME                      BLOCK_ID CORRUPT_TYPE MARKED_COR
------------------------------ ---------- ------------ ----------
CORRUPT_DESCRIPTION
--------------------------------------------------------------------------------
REPAIR_DESCRIPTION
--------------------------------------------------------------------------------
FOR_AUDIT                           98250         6148 TRUE

mark block software corrupt

THEAD                               19130         6148 TRUE

mark block software corrupt

OBJECT_NAME                      BLOCK_ID CORRUPT_TYPE MARKED_COR
------------------------------ ---------- ------------ ----------
CORRUPT_DESCRIPTION
--------------------------------------------------------------------------------
REPAIR_DESCRIPTION
--------------------------------------------------------------------------------

THEAD                              107197         6148 TRUE

mark block software corrupt

SQL> SET serveroutput on
DECLARE num_fix INT;
BEGIN
num_fix := 0;
DBMS_REPAIR.FIX_CORRUPT_BLOCKS (
     SCHEMA_NAME => 'UMC_DBA',
     OBJECT_NAME=> 'THEAD',
     OBJECT_TYPE => dbms_repair.table_object,
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     FIX_COUNT=> num_fix);
DBMS_OUTPUT.PUT_LINE('num fix: ' || to_char(num_fix));
END;
/SQL>   2    3    4    5    6    7    8    9   10   11   12 
num fix: 0

PL/SQL procedure successfully completed.

SQL> SELECT object_name, block_id, marked_corrupt
     FROM repair_table;  2 

OBJECT_NAME                      BLOCK_ID MARKED_COR
------------------------------ ---------- ----------
FOR_AUDIT                           98250 TRUE
THEAD                               19130 TRUE
THEAD                              107197 TRUE

SQL> select index_name from dba_indexes
where table_name = 'THEAD'
  and owner = 'UMC_DBA';
/  2    3 
INDEX_NAME
------------------------------
I_HD_ACCEPTOR
I_HD_AGREE_PARTNER_LINK
I_HD_CORRECTION
I_HD_CORRECTOR
I_HD_CREATION
I_HD_CREATOR
I_HD_DIVCODE
I_HD_DOC_DATE
I_HD_DOC_NUM
I_HD_DRAFT_HEAD_ID
I_HD_OP_DT_SENDER

INDEX_NAME
------------------------------
I_HD_OP_KIND_ID
I_HD_OWNERID
I_HD_PARENT_ID
I_HD_PARTNER_ID
I_HD_PARTNER_TYPE
I_HD_SENDER
PK_HEAD

18 rows selected.

Теперь проверяем все индексы.

SQL> SET serveroutput on
DECLARE num_orphans INT;
BEGIN
num_orphans := 0;
DBMS_REPAIR.DUMP_ORPHAN_KEYS (
     SCHEMA_NAME => 'UMC_DBA',
     OBJECT_NAME => 'PK_HEAD',
     OBJECT_TYPE => dbms_repair.index_object,
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',
     KEY_COUNT => num_orphans);
DBMS_OUTPUT.PUT_LINE('orphan key count: ' || to_char(num_orphans));
END;
/SQL>   2    3    4    5    6    7    8    9   10   11   12   13 
orphan key count: 46

PL/SQL procedure successfully completed.

orphan key count д.б. = 0. Как видим, тут 46. Это жопа.
По остальным:
I_HD_SENDER 46
I_HD_PARTNER_TYPE 46
I_HD_PARTNER_ID 1
I_HD_PARENT_ID 15
I_HD_OWNERID 46
I_HD_OP_KIND_ID 46
I_HD_OP_DT_SENDER 46
I_HD_DRAFT_HEAD_ID 0
I_HD_DOC_NUM 46
I_HD_DOC_DATE 46
I_HD_DIVCODE 46
I_HD_CREATOR 46
I_HD_CREATION 46
I_HD_CORRECTOR 46
I_HD_CORRECTION 46
I_HD_AGREE_PARTNER_LINK 1
I_HD_ACCEPTOR 46

Теперь у нас  в ORPHAN_KEY_TABLE куча данных :)

SQL> BEGIN
DBMS_REPAIR.REBUILD_FREELISTS (
     SCHEMA_NAME => 'UMC_DBA',
     OBJECT_NAME => 'THEAD',
     OBJECT_TYPE => dbms_repair.table_object);
END;  2    3    4    5    6 
  7  /

PL/SQL procedure successfully completed.


SQL> BEGIN
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
     SCHEMA_NAME => 'UMC_DBA',
     OBJECT_NAME => 'THEAD',
     OBJECT_TYPE => dbms_repair.table_object,
     FLAGS => dbms_repair.skip_flag);
END;
/
  2    3    4    5    6    7    8 
PL/SQL procedure successfully completed.

SQL> SELECT owner, table_name, skip_corrupt
FROM dba_tables
WHERE owner = 'UMC_DBA'
AND skip_corrupt = 'ENABLED';  2    3    4 

OWNER                          TABLE_NAME                     SKIP_COR
------------------------------ ------------------------------ --------
UMC_DBA                        THEAD                          ENABLED

alter index I_HD_ACCEPTOR rebuild;
alter index I_HD_AGREE_PARTNER_LINK rebuild;
alter index I_HD_CORRECTION rebuild;
alter index I_HD_CORRECTOR rebuild;
alter index I_HD_CREATION rebuild;
alter index I_HD_CREATOR rebuild;
alter index I_HD_DIVCODE rebuild;
alter index I_HD_DOC_DATE rebuild;
alter index I_HD_DOC_NUM rebuild;
alter index I_HD_DRAFT_HEAD_ID rebuild;
alter index I_HD_OP_DT_SENDER rebuild;
alter index I_HD_OP_KIND_ID rebuild;
alter index I_HD_OWNERID rebuild;
alter index I_HD_PARENT_ID rebuild;
alter index I_HD_PARTNER_ID rebuild;
alter index I_HD_PARTNER_TYPE rebuild;
alter index I_HD_SENDER rebuild;
alter index PK_HEAD rebuild;



Читать далее

2015-01-21

Склерозник. MySQL, PHPMyAdmin, MediaWiki

Ставим SLES11 SP3, в нем ставим все компоненты из названия темы, нехитрым путем добавления репозиториев.

MySQL

f01:~ # chkconfig mysql on
f01:~ # /etc/init/d/mysql start
f01:~ # mysqladmin -u root password 'root'

Apache2

f01:~ # chkconfig apache2 on
f01:~ # /etc/init.d/apache2 start

После этого можемзайти на http://url/phpmyadmin под root с паролем root.



Читать далее

2015-01-17

Риторически - замена Jira + Confluence от Atlassian

В свое время заворотили мы в конторе офигительную связку - Atlassian Jira + Atlassian Confluence + Subversion. Подсадили на нее всех и вся, настроили мегакучу плагинов. Юзеры теперь знают, что для того, чтоб к ним прибежал ситовец можно просто отправить письмо на ящик сит, получить уведомление о создании задания, увидеть, кому оно назначено и т.д. Программеры кучу доки в конфу зарядили, хрен разгребешь. Начальник наглядно видит загрузку персонала и все существующие работы... В общем все неплохо, кроме одного  - цен на продукцию Atlassian.

Соответственно есть такой вопрос. Ни к кому - к себе, ибо надо разбираться. А вопрос в следующем - можно ли Jira + Confluence заменить на Redmine + MediaWiki (или что-то другое) с сохранением связки с остальными продуктами и сохранением функционала по получению информации и работе с пользователями через email

А????



Читать далее

2015-01-13

PostgreSQL Streaming replication config files example

Server 1 - master (111.111.111.22)

postgresql.conf

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

listen_addresses = '*'
max_connections = 3000

#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------

shared_buffers = 40000MB
max_prepared_transactions = 2000
work_mem = 360MB
maintenance_work_mem = 1024MB

#------------------------------------------------------------------------------
# WRITE AHEAD LOG
#------------------------------------------------------------------------------

synchronous_commit = off
checkpoint_segments = 20

#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------                                               

max_wal_senders = 5                                                                                                           
wal_level = hot_standby                                                                                                       
wal_keep_segments = 100                                                                                                       
archive_mode = on                                                                                                             
archive_command = 'test ! -f /u04/pgarch/%f && cp %p  /u04/pgarch/%f'

#------------------------------------------------------------------------------                                               
# QUERY TUNING                                                                                                                
#------------------------------------------------------------------------------                                               

join_collapse_limit = 100                                                                                                     
seq_page_cost = 0.0000001                                                                                                     
random_page_cost = 2.0
cpu_operator_cost = 0.0000001
constraint_exclusion = on

#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------

log_destination = 'stderr'
logging_collector = on
log_line_prefix = '%d %u %h %a %s %t %p '
log_min_duration_statement = 15000
log_statement = ddl
log_hostname = on
log_temp_files = 0
log_lock_waits = on

#------------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#------------------------------------------------------------------------------

autovacuum = off

#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------

datestyle = 'iso, dmy'
lc_messages = 'ru_RU.UTF-8'
lc_monetary = 'ru_RU.UTF-8'
lc_numeric = 'ru_RU.UTF-8'
lc_time = 'ru_RU.UTF-8'
default_text_search_config = 'pg_catalog.russian'

#------------------------------------------------------------------------------
# LOCK MANAGEMENT
#------------------------------------------------------------------------------

max_locks_per_transaction = 250
max_pred_locks_per_transaction = 250

pg_hba.conf

local   all         all                               trust
host    all         all         127.0.0.1/32          trust
host    all         all         0.0.0.0/0             password
host    replication replicator  111.111.111.29/32        md5

Server 2 - slave (111.111.111.29)

postgresql.conf

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

listen_addresses = '*'
max_connections = 3000

#------------------------------------------------------------------------------                                               
# RESOURCE USAGE (except WAL)                                                                                                 
#------------------------------------------------------------------------------                                               

shared_buffers = 10000MB                                                                                                      
max_prepared_transactions = 2000                                                                                              
work_mem = 100MB                                                                                                              
maintenance_work_mem = 1024MB                                                                                                 

#------------------------------------------------------------------------------                                               
# WRITE AHEAD LOG                                                                                                             
#------------------------------------------------------------------------------                                               

synchronous_commit = off                                                                                                      
checkpoint_segments = 20                                                                                                      

#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------

hot_standby = on
max_wal_senders = 5
wal_level = hot_standby
wal_keep_segments = 100
archive_mode = on
archive_command = 'test ! -f /u04/pgarch/%f && cp %p /u04/pgarch/%f'

#------------------------------------------------------------------------------
# QUERY TUNING
#------------------------------------------------------------------------------

join_collapse_limit = 100
seq_page_cost = 0.0000001
random_page_cost = 2.0
cpu_operator_cost = 0.0000001
constraint_exclusion = on

#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------

log_destination = 'stderr'
logging_collector = on
log_line_prefix = '%d %u %h %a %s %t %p '
log_min_duration_statement = 15000
log_statement = ddl
log_hostname = on
log_temp_files = 0
log_lock_waits = on
log_checkpoints = on

#------------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#------------------------------------------------------------------------------

autovacuum = off

#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------

datestyle = 'iso, dmy'
lc_messages = 'ru_RU.UTF-8'
lc_monetary = 'ru_RU.UTF-8'
lc_numeric = 'ru_RU.UTF-8'
lc_time = 'ru_RU.UTF-8'
default_text_search_config = 'pg_catalog.russian'

#------------------------------------------------------------------------------
# LOCK MANAGEMENT
#------------------------------------------------------------------------------

max_locks_per_transaction = 250
max_pred_locks_per_transaction = 250



Читать далее

2014-12-12

Быстренька миграция с openldap2-2.3.19 на openldap2-2.4.26

0. ssh root@openldap2319
1. slapcat -v -l antares.ldif
2. scp antares.ldif root@openldap2426:/root/ldap/
3. ssh root@openldap2426
4. /etc/init.d/ldap stop
5. slapadd -v -l ldap/antares.ldif
6. /etc/init/d/ldap start
Читать далее

2014-12-08

Oracle 8i: Corrupt block relative dba

И вечный бой, покой нам только снится.

Oracle 8.1.7.4 на SLES8 SP3. В alert логе найдена вот такая запись:

***
Corrupt block relative dba: 0x1281748b (file 74, block 95371)
Fractured block found during buffer read
Data in bad block -
type: 6 format: 2 rdba: 0x1281748b
last change scn: 0x0000.0004ef13 seq: 0x1 flg: 0x02
consistency value in tail: 0x49e90601
check value in block header: 0x0, block checksum disabled
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of rdba: 0x1281748b (file 74, block 95371) found same corrupted data

Ишем объект, в котором битый блок:

select tablespace_name, segment_type, owner, segment_name
from dba_extents
where file_id =74
and 95371 between block_id and block_id + blocks - 1;

и видим, что это таблица.

Первое что делаем - верификацию файлов данных.

alexsf@24412fa: ssh alexsf@adonis
alexsf@adonis's password:
alexsf@adonis: sudo -s
Password:
adonis:/home/alexsf # su - root
adonis:~ # su - oracle
oracle@adonis: export ORACLE_SID=main
oracle@adonis: sqlplus /nolog
SQL*Plus: Release 8.1.7.0.0 - Production on Mon Dec 8 08:16:56 2014
(c) Copyright 2000 Oracle Corporation.  All rights reserved.
SQL> connect system
Enter password:
Connected.
SQL> select tablespace_name, segment_type, owner, segment_name
from dba_extents
where file_id =74
and 95371 between block_id and block_id + blocks - 1;

TABLESPACE_NAME                SEGMENT_TYPE       OWNER
------------------------------ ------------------ ------------------------------
SEGMENT_NAME
--------------------------------------------------------------------------------
ZARPLATA                       TABLE              ZARPHERSON
FOR_AUDIT

SQL> select file_name from dba_data_files
where tablespace_name ='ZARPLATA';

FILE_NAME
--------------------------------------------------------------------------------
/u02/oradata/main/zarplata01.ora
/u03/oradata/main/zarplata02.ora

SQL> exit
Disconnected from Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
With the Partitioning option
JServer Release 8.1.7.4.0 - Production

oracle@adonis:~> dbv file=/u02/oradata/main/zarplata01.ora  blocksize=8192

DBVERIFY: Release 8.1.7.4.0 - Production on Mon Dec 8 08:25:00 2014

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

DBVERIFY - Verification starting : FILE = /u02/oradata/main/zarplata01.ora


DBVERIFY - Verification complete

Total Pages Examined         : 196608
Total Pages Processed (Data) : 80699
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 57324
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 418
Total Pages Empty            : 58166
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
oracle@adonis:~> dbv file=/u03/oradata/main/zarplata02.ora blocksize=8192

DBVERIFY: Release 8.1.7.4.0 - Production on Mon Dec 8 08:25:44 2014

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

DBVERIFY - Verification starting : FILE = /u03/oradata/main/zarplata02.ora


DBVERIFY - Verification complete

Total Pages Examined         : 196608
Total Pages Processed (Data) : 77223
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 63612
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 540
Total Pages Empty            : 55233
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0

И наблюдаем чудо - все у нас хорошо :)
Дальше делаем валидацию структуры таблицы:

oracle@adonis:~> sqlplus /nolog

SQL*Plus: Release 8.1.7.0.0 - Production on Mon Dec 8 08:34:29 2014

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

SQL> connect system
Enter password:
Connected.
SQL> ANALYZE TABLE zarpherson.for_audit VALIDATE STRUCTURE CASCADE;
ANALYZE TABLE zarpherson.for_audit VALIDATE STRUCTURE CASCADE
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 74, block # 95371)
ORA-01110: data file 74: '/u02/oradata/main/zarplata01.ora'

О, це вже шо то...

Создаем системные таблицы для проведения работ по починке:

SQL> conn sys as sysdba
Enter password:
Connected.
SQL> BEGIN
DBMS_REPAIR.ADMIN_TABLES (
     TABLE_NAME => 'REPAIR_TABLE',
     TABLE_TYPE => dbms_repair.repair_table,
     ACTION     => dbms_repair.create_action,
     TABLESPACE => 'USERS');
END;
/  2    3    4    5    6    7    8 

PL/SQL procedure successfully completed.

SQL> BEGIN
DBMS_REPAIR.ADMIN_TABLES (
     TABLE_NAME => 'ORPHAN_KEY_TABLE',
     TABLE_TYPE => dbms_repair.orphan_table,
     ACTION     => dbms_repair.create_action,
     TABLESPACE => 'USERS');
END;
/  2    3    4    5    6    7    8

PL/SQL procedure successfully completed.

Проверяем битые блоки:

SQL> SET serveroutput on
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
     SCHEMA_NAME => 'ZARPHERSON',
     OBJECT_NAME => 'FOR_AUDIT',
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     corrupt_count =>  num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;
/
SQL>   2    3    4    5    6    7    8    9   10   11  number corrupt: 1

PL/SQL procedure successfully completed.

SQL> SELECT object_name, block_id, corrupt_type, marked_corrupt,
corrupt_description, repair_description
FROM repair_table;  2    3 

OBJECT_NAME                      BLOCK_ID CORRUPT_TYPE MARKED_COR
------------------------------ ---------- ------------ ----------
CORRUPT_DESCRIPTION
--------------------------------------------------------------------------------
REPAIR_DESCRIPTION
--------------------------------------------------------------------------------
FOR_AUDIT                           95371         6148 TRUE

mark block software corrupt

Фиксим найденные битые блоки. Насколько я понял, в реальности ничего не фиксится, только помечается как поврежденное:

SQL> SET serveroutput on
DECLARE num_fix INT;
BEGIN
num_fix := 0;
DBMS_REPAIR.FIX_CORRUPT_BLOCKS (
     SCHEMA_NAME => 'ZARPHERSON',
     OBJECT_NAME=> 'FOR_AUDIT',
     OBJECT_TYPE => dbms_repair.table_object,
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     FIX_COUNT=> num_fix);
DBMS_OUTPUT.PUT_LINE('num fix: ' || to_char(num_fix));
END;
/
SQL>   2    3    4    5    6    7    8    9   10   11   12  num fix: 0

PL/SQL procedure successfully completed.

SQL> SELECT object_name, block_id, marked_corrupt
     FROM repair_table;  2 

OBJECT_NAME                      BLOCK_ID MARKED_COR
------------------------------ ---------- ----------
FOR_AUDIT                           95371 TRUE

Теперь надо найти индексы, ссылающиеся на битый блок:

SQL> select index_name from dba_indexes
where table_name = 'FOR_AUDIT'
  and owner = 'ZARPHERSON';
/
  2    3 
INDEX_NAME
------------------------------
I_FOR_AUDIT_AUDIT_TABLES_ID
I_FOR_AUDIT_AUDIT_USERS_ID
I_FOR_AUDIT_IDKADRY
I_FOR_AUDIT_TIMESTAMP
PK_FOR_AUDIT

SQL> SET serveroutput on
DECLARE num_orphans INT;
BEGIN
num_orphans := 0;
DBMS_REPAIR.DUMP_ORPHAN_KEYS (
     SCHEMA_NAME => 'ZARPHERSON',
     OBJECT_NAME => 'PK_FOR_AUDIT',
     OBJECT_TYPE => dbms_repair.index_object,
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',
     KEY_COUNT => num_orphans);
DBMS_OUTPUT.PUT_LINE('orphan key count: ' || to_char(num_orphans));
END;
/
SQL>   2    3    4    5    6    7    8    9   10   11   12   13  orphan key count: 0

PL/SQL procedure successfully completed.

И так по очереди со всеми. Если "orphan key count: 0", значит все хорошо.
В нашем случае везде был 0.
Однако, если бы что-то было найдено - не беда. Надо просто перестроить индексы.

Ребилдим фрилист таблицы. По сути исключаем битые блоки из доступных:

SQL> BEGIN
DBMS_REPAIR.REBUILD_FREELISTS (
     SCHEMA_NAME => 'ZARPHERSON',
     OBJECT_NAME => 'FOR_AUDIT',
     OBJECT_TYPE => dbms_repair.table_object);
END;
/
  2    3    4    5    6    7 
PL/SQL procedure successfully completed.

Ну и делаем блоки невидимыми для DML операций:

SQL> BEGIN
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
     SCHEMA_NAME => 'ZARPHERSON',
     OBJECT_NAME => 'FOR_AUDIT',
     OBJECT_TYPE => dbms_repair.table_object,
     FLAGS => dbms_repair.skip_flag);
END;
/
  2    3    4    5    6    7    8 
PL/SQL procedure successfully completed.


Проверяем, что для данной таблицы битые блоки будут исключаться из операций:

SQL> SELECT owner, table_name, skip_corrupt
FROM dba_tables
WHERE owner = 'ZARPHERSON'
AND skip_corrupt = 'ENABLED';  2    3    4 

OWNER                          TABLE_NAME                     SKIP_COR
------------------------------ ------------------------------ --------
ZARPHERSON                     FOR_AUDIT                      ENABLED

Что имеем в итоге - таблицу можно использовать, но проблема не устранена. Блок то битый остался, мы просто наворотили для него механизм невидимости. Но при этом если повторно сделать валидацию структуры - ничего не поменялось. Нам повезло в одном - это таблица аудита. Со всеми вытекающими. В нашем случае делаем так:

connect zarpherson@main

create table for_audit_tmp
as select * from for_audit;

truncate table for_audit;

insert into for_audit
select * from for_audit_tmp;

truncate table for_audit_tmp;

commit;

Делаем анализ структуры и видим:

SQL> ANALYZE TABLE zarpherson.for_audit VALIDATE STRUCTURE CASCADE;

Table analyzed.

То есть битый блок исчез. Ну а теперь же надо вернуть все в зад, чтоб битые блоки не пропускались при DML операциях... Дальше учитывайте, что в REPAIR_TABLE у нас только одна запись!!!

SQL> truncate table repair_table;

Table truncated.

SQL> SET serveroutput on
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
     SCHEMA_NAME => 'ZARPHERSON',
     OBJECT_NAME => 'FOR_AUDIT',
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     corrupt_count =>  num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;SQL>   2    3    4    5    6    7    8    9   10 
 11  /
number corrupt: 1

PL/SQL procedure successfully completed.

SQL> SELECT object_name, block_id, corrupt_type, marked_corrupt,
corrupt_description, repair_description
FROM repair_table;  2    3 

OBJECT_NAME                      BLOCK_ID CORRUPT_TYPE MARKED_COR
------------------------------ ---------- ------------ ----------
CORRUPT_DESCRIPTION
--------------------------------------------------------------------------------
REPAIR_DESCRIPTION
--------------------------------------------------------------------------------
FOR_AUDIT                           98250         6148 TRUE

mark block software corrupt

АЧЧЧЧЧПУЕЕЕЕЕТЬ!!!!!

Откуда, мля, я же только проверил, НИЧЕГО НЕ БЫЛО!!!!!

SQL> ANALYZE TABLE zarpherson.for_audit VALIDATE STRUCTURE CASCADE;

Table analyzed.

А-а-а-а-а-а!!! АЧПУЕТЬ АЧПУЕННЕЕ ЧЕМ АЧПУЕЛ!!! КАК???!!!

Та-а-а-ак...


INSERT INTO for_audit_tmp SELECT * FROM for_audit;

DROP TABLE for_audit
/

CREATE TABLE for_audit
    (timestamp                      DATE,
    user_name                      VARCHAR2(30),
    table_name                     VARCHAR2(30),
    action                         VARCHAR2(1),
    data_values                    VARCHAR2(2000),
    id                             NUMBER ,
    audit_tables_id                NUMBER,
    audit_users_id                 NUMBER,
    idkadry                        NUMBER)
  PCTFREE     10
  PCTUSED     40
  INITRANS    1
  MAXTRANS    255
  TABLESPACE  zarplata
  STORAGE   (
    INITIAL     223846400
    NEXT        262144
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
  NOCACHE
  NOMONITORING
  NOPARALLEL
  LOGGING
/

-- Grants for Table
GRANT SELECT ON for_audit TO zp_zarpherson_buh_bez_prop
/
GRANT SELECT ON for_audit TO zp_zarpherson_operator
/
GRANT SELECT ON for_audit TO zp_zarpherson_buhdostup
/
GRANT SELECT ON for_audit TO zp_zarpherson_buhgalter
/
GRANT SELECT ON for_audit TO zp_zarpherson_read_only
/
GRANT SELECT ON for_audit TO zp_zarpherson_read_by_podr
/
GRANT SELECT ON for_audit TO zp_zarpherson_buh_bp_by_podr
/
GRANT SELECT ON for_audit TO plan_1
/
GRANT SELECT ON for_audit TO zp_zarpherson_admin
/
GRANT SELECT ON for_audit TO zp_zarpherson_read_only_dostup
/




-- Indexes for FOR_AUDIT

CREATE INDEX i_for_audit_audit_users_id ON for_audit
  (
    audit_users_id                  ASC
  )
  PCTFREE     5
  INITRANS    2
  MAXTRANS    255
  TABLESPACE  zarplata
  STORAGE   (
    INITIAL     1048576
    NEXT        262144
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
NOPARALLEL
LOGGING
/

CREATE INDEX i_for_audit_idkadry ON for_audit
  (
    idkadry                         ASC
  )
  PCTFREE     5
  INITRANS    2
  MAXTRANS    255
  TABLESPACE  zarplata
  STORAGE   (
    INITIAL     1048576
    NEXT        262144
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
NOPARALLEL
LOGGING
/

CREATE INDEX i_for_audit_timestamp ON for_audit
  (
    timestamp                       ASC
  )
  PCTFREE     5
  INITRANS    2
  MAXTRANS    255
  TABLESPACE  zarplata
  STORAGE   (
    INITIAL     1048576
    NEXT        262144
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
NOPARALLEL
LOGGING
/

CREATE INDEX i_for_audit_audit_tables_id ON for_audit
  (
    audit_tables_id                 ASC
  )
  PCTFREE     5
  INITRANS    2
  MAXTRANS    255
  TABLESPACE  zarplata
  STORAGE   (
    INITIAL     1048576
    NEXT        262144
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
NOPARALLEL
LOGGING
/



-- Constraints for FOR_AUDIT


ALTER TABLE for_audit
ADD CONSTRAINT nn_for_audit_action CHECK (ACTION IS NOT NULL)
/

ALTER TABLE for_audit
ADD CONSTRAINT nn_for_audit_audit_tables_id CHECK (audit_tables_id IS NOT NULL)
/

ALTER TABLE for_audit
ADD CONSTRAINT nn_for_audit_data_values CHECK (DATA_VALUES IS NOT NULL)
/

ALTER TABLE for_audit
ADD CONSTRAINT nn_for_audit_table_name CHECK (TABLE_NAME IS NOT NULL)
/

ALTER TABLE for_audit
ADD CONSTRAINT nn_for_audit_timestamp CHECK (TIMESTAMP IS NOT NULL)
/

ALTER TABLE for_audit
ADD CONSTRAINT nn_for_audit_user_name CHECK (USER_NAME IS NOT NULL)
/

ALTER TABLE for_audit
ADD CONSTRAINT pk_for_audit PRIMARY KEY (id)
USING INDEX
  PCTFREE     5
  INITRANS    2
  MAXTRANS    255
  TABLESPACE  zarplata
  STORAGE   (
    INITIAL     2097152
    NEXT        262144
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
/


-- Triggers for FOR_AUDIT

CREATE OR REPLACE TRIGGER tr_for_audit_bi
 BEFORE
  INSERT
 ON for_audit
REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
BEGIN
  :new.timestamp := SYSDATE;
  :new.user_name := USER;
  BEGIN
    SELECT id
      INTO :new.audit_users_id
      FROM audit_users
     WHERE user_name = user;
  EXCEPTION
  WHEN no_data_found THEN
    INSERT INTO audit_users(user_name)
    VALUES(USER)
    RETURNING id INTO :new.audit_users_id;
  END;
  BEGIN
    SELECT id
      INTO :new.audit_tables_id
      FROM audit_tables
     WHERE table_name = :new.table_name;
  EXCEPTION
  WHEN no_data_found THEN
    INSERT INTO audit_tables(date_start, date_end, table_name)
    VALUES(trunc(sysdate), to_date('01013000', 'ddmmyyyy'), :new.table_name)
    RETURNING id INTO :new.audit_tables_id;
  END;
  SELECT sq_for_audit.nextval
    INTO :new.id
    FROM dual;
END;
/


-- Comments for FOR_AUDIT

COMMENT ON TABLE for_audit IS 'Таблица с информацией о действиях пользователя над данными'
/
COMMENT ON COLUMN for_audit.action IS 'Действие:
                                               U - UPDATE
                                               I - INSERT
                                               D - DELETE'
/
COMMENT ON COLUMN for_audit.audit_tables_id IS 'Идентификатор таблицы из AUDIT_TABLES'
/
COMMENT ON COLUMN for_audit.audit_users_id IS 'Идентификатор пользователя из AUDIT_USERS'
/
COMMENT ON COLUMN for_audit.data_values IS 'Значение до действия над данными и после'
/
COMMENT ON COLUMN for_audit.id IS 'Идентификатор записи'
/
COMMENT ON COLUMN for_audit.idkadry IS 'Идентификатор работника из T_KADRY'
/
COMMENT ON COLUMN for_audit.table_name IS 'Наименование таблицы'
/
COMMENT ON COLUMN for_audit.timestamp IS 'Дата '
/
COMMENT ON COLUMN for_audit.user_name IS 'Имя пользователя'
/

-- End of DDL Script for Table ZARPHERSON.FOR_AUDIT

-- Foreign Key
ALTER TABLE for_audit
ADD CONSTRAINT fk_for_audit_audit_tables_id FOREIGN KEY (audit_tables_id)
REFERENCES audit_tables (id)
/
-- End of DDL script for Foreign Key(s)

Проверяем, кто тут поц:

SQL> truncate table repair_table;

Table truncated.

SQL> SET serveroutput on
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
     SCHEMA_NAME => 'ZARPHERSON',
     OBJECT_NAME => 'FOR_AUDIT',
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     corrupt_count =>  num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;SQL>   2    3    4    5    6    7    8    9   10 
 11  /
number corrupt: 0
PL/SQL procedure successfully completed.
 
НИКОГО!!! А вот так:

conn zarpherson
insert into for_audit
select * from for_audit_tmp;
commit;

conn sys as sysdba

SQL> SET serveroutput on
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
     SCHEMA_NAME => 'ZARPHERSON',
     OBJECT_NAME => 'FOR_AUDIT',
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     corrupt_count =>  num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;SQL>   2    3    4    5    6    7    8    9   10 
 11  /
number corrupt: 1

PL/SQL procedure successfully completed.


SQL>
SQL> SELECT object_name, block_id, corrupt_type, marked_corrupt,
corrupt_description, repair_description
FROM repair_table;  2    3 

OBJECT_NAME                      BLOCK_ID CORRUPT_TYPE MARKED_COR
------------------------------ ---------- ------------ ----------
CORRUPT_DESCRIPTION
--------------------------------------------------------------------------------
REPAIR_DESCRIPTION
--------------------------------------------------------------------------------
FOR_AUDIT                           98250         6148 TRUE

mark block software corrupt

И хрен его знает, кто тут поц и где тут подлива... Таблица пересоздана, и при этом при внесении в нее данных ломается тот же самый блок... При этом валидация структуры проходит нормально...

Ладно, ждем  перезапуска базы и анализа всех объектов по счедулеру. А пока проверим, а все ли объекты проходят валидацию структуры???:

set trimspool on
set pagesize 0
set heading off
spool _tmp_1.sql

select 'ANALYZE TABLE '||owner||'.'||table_name||' VALIDATE STRUCTURE CASCADE;'
from dba_tables
where owner not in ('SYS','OUTLN','SYSTEM')
order by owner, table_name;

spool off

@_tmp_1.sql

И вот что в результате надыбал:

ANALYZE TABLE COUNTERSREAD.OSTABLE VALIDATE STRUCTURE CASCADE
*
ERROR at line 1:
ORA-01499: table/index cross reference failure - see trace file

Из trace file

** 2014-12-08 12:10:13.037
*** SESSION ID:(44.1327) 2014-12-08 12:10:13.037
row not found in index tsn: 9 rdba: 0x03414909
env: (scn: 0x0000.018348c7  xid: 0x0000.000.00000000  uba: 0x00000000.0000.00)col 0; len 8; (8):  34 37 30 35 35 37 32 37
col 1; len 6; (6):  03 01 90 ef 00 09
Block header dump:  0x030190ef
 Object id on Block? Y
 seg/obj: 0x29ce  csc: 0x00.12365be  itc: 1  flg: -  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

и куча мути дальше, похожей да дамп куска области памяти.
По нескольким объектам валидация не прошла, потому что ORA-00054: resource busy and acquire with NOWAIT specified

Читать далее

2014-11-05

PostgreSQL ERROR: could not access status of transaction

Давича на версии 8.2.23 получили мы такую вот хрень:

postgres@cn:~> psql
psql (9.2.4, сервер 8.2.23)
ПРЕДУПРЕЖДЕНИЕ: psql имеет версию 9.2, а сервер - 8.2.
                Часть функций psql может не работать.
Введите "help", чтобы получить справку.

postgres=# \c cndata
psql (9.2.4, сервер 8.2.23)
ПРЕДУПРЕЖДЕНИЕ: psql имеет версию 9.2, а сервер - 8.2.
                Часть функций psql может не работать.
Вы подключены к базе данных "cndata" как пользователь "postgres".
cndata=# vacuum analyze pp_movement;
ERROR:  relation "pp_movement" does not exist
cndata=# vacuum analyze cn.pp_movement;
ERROR:  could not access status of transaction 655427477
ПОДРОБНОСТИ:  Could not open file "pg_clog/0271": Нет такого файла или каталога.
cndata=# reindex table cn.pp_movement;
ERROR:  could not access status of transaction 655427477
ПОДРОБНОСТИ:  Could not open file "pg_clog/0271": Нет такого файла или каталога.


Предпосылок к возникновению такой фигни на сервере не нашли. Поэтому побродив по просторам интернета полечили таким вот способом:

cn:/opt/pgsql-8.2/data/pg_clog # dd if=/dev/zero of=0271 bs=256K count=1
1+0 records in
1+0 records out
262144 bytes (262 kB) copied, 0.000657219 s, 399 MB/s
cn:/opt/pgsql-8.2/data/pg_clog # chown postgres:postgres 0271

cndata=# select count(*) from cn.pp_movement;
ERROR:  could not access status of transaction 3332701758
ПОДРОБНОСТИ:  Could not open file "pg_clog/0C6A": Нет такого файла или каталога.

cn:/opt/pgsql-8.2/data/pg_clog # dd if=/dev/zero of=0C6A bs=256K count=1; chown postgres:postgres *
1+0 records in
1+0 records out
262144 bytes (262 kB) copied, 0.000499456 s, 525 MB/s

cndata=# select count(*) from cn.pp_movement;
ERROR:  could not access status of transaction 57351653
ПОДРОБНОСТИ:  Could not open file "pg_clog/0036": Нет такого файла или каталога.


cn:/opt/pgsql-8.2/data/pg_clog # dd if=/dev/zero of=0036 bs=256K count=1; chown postgres:postgres *
1+0 records in
1+0 records out
262144 bytes (262 kB) copied, 0.000472071 s, 555 MB/s


cndata=# select count(*) from cn.pp_movement;                                                                       
ERROR:  could not access status of transaction 1653895707                                                           
ПОДРОБНОСТИ:  Could not open file "pg_clog/0629": Нет такого файла или каталога.

cn:/opt/pgsql-8.2/data/pg_clog # dd if=/dev/zero of=0629 bs=256K count=1; chown postgres:postgres *
1+0 records in
1+0 records out
262144 bytes (262 kB) copied, 0.000490669 s, 534 MB/s

cndata=# select count(*) from cn.pp_movement;                                                                       
ERROR:  could not access status of transaction 4102869982                                                           
ПОДРОБНОСТИ:  Could not open file "pg_clog/0F48": Нет такого файла или каталога.

cn:/opt/pgsql-8.2/data/pg_clog # dd if=/dev/zero of=0F48 bs=256K count=1; chown postgres:postgres *
1+0 records in
1+0 records out
262144 bytes (262 kB) copied, 0.000469307 s, 559 MB/s

cndata=# select count(*) from cn.pp_movement;                                                                      
ERROR:  could not access status of transaction 3931397121                                                          
ПОДРОБНОСТИ:  Could not open file "pg_clog/0EA5": Нет такого файла или каталога.

cn:/opt/pgsql-8.2/data/pg_clog # dd if=/dev/zero of=0EA5 bs=256K count=1; chown postgres:postgres *
1+0 records in
1+0 records out
262144 bytes (262 kB) copied, 0.000490203 s, 535 MB/s

cndata=# select count(*) from cn.pp_movement;
ERROR:  could not access status of transaction 309829755
ПОДРОБНОСТИ:  Could not open file "pg_clog/0127": Нет такого файла или каталога.

cn:/opt/pgsql-8.2/data/pg_clog # dd if=/dev/zero of=0127 bs=256K count=1; chown postgres:postgres *
1+0 records in
1+0 records out
262144 bytes (262 kB) copied, 0.000480744 s, 545 MB/s


cndata=# select count(*) from cn.pp_movement;
  count 
---------
 1308439
(1 строка)

Походу потеряли часть транзакций, но все заработало.
Пора валить на 9-ю версию...

Читать далее

2014-10-02

ORA-00354: corrupt redo log block heade

2014.10.02

Техническая информация:
Операционная система: SuSE Linux Enterprise Server 8 Service Pack 3 32bit
БД: Oracle Enterprise Server 8.1.7.4 32bit
Дополнительная информация: Указанная проблема возникала ранее 1 раз - 28.08.2014.

Симптомы проблемы:

1. При подключении к ПО «Финколлекции» выдается ошибка о невозможности подключения в связи с невозможностью произвести архивирование журналов транзакций (Connect Internal Only until freed).
2. В файле /u01/admin/main/bdump/alert_main.log множественные сообщения (аналогичные указанному с учетом того, что могут быть другие даты и имена файлов):

Thu Oct 2 00:04:11 2014
ARC0: Beginning to archive log# 7 seq# 16005
ARC0: Archiving not possible: No primary destinations
ARC0: Failed to archive log# 7 seq# 16005

Описание проблемы:

В журнале транзакций, находящемся в группе 7 обнаружен поврежденный блок данных, в результате чего операции с данным журналом транзакций невозможны.

Причины возникновения проблемы:

Причины возникновения неясны. Предположительно связано с устаревшей версией БД Oracle. При анализе возникновения ошибки была проведена проверка файловой системы сервера, анализ журналов работы системы. Никаких предпосылок к возникновению проблемы обнаружено не было.

Методика решения:

adonis:/u01/admin/main/bdump # su - oracle
oracle@adonis:~> export ORACLE_SID=main
oracle@adonis:~> svrmgrl
SVRMGR> connect internal
Connected.
SVRMGR> shutdown abort
ORACLE instance shut down.
SVRMGR> startup
ORACLE instance started.
Total System Global Area 1726288032 bytes
Fixed Size 73888 bytes
Variable Size 250187776 bytes
Database Buffers 1475198976 bytes
Redo Buffers 827392 bytes
Database mounted.
ORA-16038: log 7 sequence# 16005 cannot be archived
ORA-00354: corrupt redo log block header
ORA-00312: online log 7 thread 1: '/u02/oradata/main/redo07_01.rdo'
ORA-00312: online log 7 thread 1: '/u03/oradata/main/redo07_02.rdo'
SVRMGR> alter database clear unarchived logfile group 7;
Statement processed.
SVRMGR> alter database drop logfile group 7;
Statement processed.
SVRMGR> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SVRMGR> startup
ORACLE instance started.
Total System Global Area 1726288032 bytes
Fixed Size 73888 bytes
Variable Size 250187776 bytes
Database Buffers 1475198976 bytes
Redo Buffers 827392 bytes
Database mounted.
Database opened.
SVRMGR>

Замечания после устранения:

Во время решения проблемы была удалена группа журналов транзакций №7. Восстанавливаем ее. Не покидая консоль, открытую в пункте «Методика решения», выполняем:

SVRMGR> !
oracle@adonis:~> rm -v /u02/oradata/main/redo07_01.rdo
removed `/u02/oradata/main/redo07_01.rdo'
oracle@adonis:~> rm -v /u03/oradata/main/redo07_02.rdo
removed `/u03/oradata/main/redo07_02.rdo'
oracle@adonis:~> exit
exit
SVRMGR> ALTER DATABASE ADD LOGFILE GROUP 7
('/u02/oradata/main/redo07_01.rdo',
'/u03/oradata/main/redo07_02.rdo') SIZE 10240K REUSE
/ 2> 3> 4>
Statement processed.
SVRMGR>

Кроме того, цепочка архивных журналов транзакций в результате невозможности архивирования группы 7 была разорвана. В случае необходимости проведения восстановления БД с использованием журналов за период времени, включающий поломку, операция восстановления будет невозможна.

Читать далее

2014-08-18

Приколы с конфигурированием cyrus-imapd

После долгих мучений с применением параметров с конфигурационных файлах cyrus-imapd выяснилось:

Если ты в конфигурационном файле /etc/imapd.conf изменил значение параметра, то последующее комментирование данного параметра не вернет его в значение по умолчанию. По крайней мере это касается версии 2.4.17. Если тебе нужно для параметра поставить другое значение, его нужно прописывать явно. Иначе будет работать установленное в последний раз.

Читать далее

2014-07-22

Ну мля чем еще админу заняться???

Принес директор ноут, что-то греется, говорит. И не важно, что у нас нет никого, кто имеет опыт сборки разборки - надо сделать.

Порыл инет, нашел инструкции:

1. http://ander.su/repair/article/15/1
 2. http://people.overclockers.ru/vGamBIT/17624/Chistka_ot_pyli_i_zamena_termopasty_na_Acer_Aspire_5750G/
3. http://draber.pp.ua/?p=910
4. http://habrahabr.ru/post/140120/

Вооружившись отвертками, все сделал. Разбирать пришлось, правда, 2 раза.
Собственно и не писал бы, но вдруг опять тот же ноут принесут, а у меня ссылки остались :)


Читать далее