Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вопрос про репликацию  [new]
Темный падаван
Member

Откуда: темная сторона Силы
Сообщений: 107
Есть несколько серверов в мастер-мастер репликации. Каждая табличка t_table имеет пакет t_table$rp . Вопрос в следующем. Я в скрипте, который мне в sqlplus показывает ошибки имя таблицы узнаю откусыванием суффикса $rp от имени пакета. Но... Попалась таблица с именем в 30 символов и данный метод не работает. Как определить имя таблицы, зная имя пакета ? Перебрал все DBA_REP% представления - но вроде там таких связок нет.
11 июн 10, 14:52    [8931629]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Темный падаван
Я в скрипте, который мне в sqlplus показывает ошибки имя таблицы узнаю откусыванием суффикса $rp от имени пакета
Ахренеть. А каким скриптом вы смотрите ошибки? Я - таким:
select * from deferror
11 июн 10, 15:19    [8931869]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
Темный падаван
Member

Откуда: темная сторона Силы
Сообщений: 107
GL,

Это скрипт для просмотра конкретной ошибки, чтоб в тормозную java-консоль не лазить
SET SERVEROUTPUT ON;
SET FEEDBACK OFF
SET HEADING OFF;
SELECT NAME FROM v$database;
SET HEADING ON;
SET LINES 160;
alter session set nls_date_format='dd-mm-yyyy  hh24:mi:ss';
alter session set NLS_LANGUAGE=AMERICAN;
alter session set NLS_TERRITORY = AMERICA;
EXEC dbms_output.enable(NULL);
DECLARE
  v_types	dbms_defer_query.type_ary;
	v_vals	dbms_defer_query.val_ary;
	col_cnt NUMBER := 1;
	v_no_err NUMBER := 1;
	v_table_name varchar2(30);
BEGIN
  FOR err_tr IN 
	  (SELECT de.deferred_tran_id
           ,de.callno
			     ,dc.argcount
					 ,de.origin_tran_db 
					 ,dc.schemaname
					 ,dc.packagename
					 ,de.error_msg
					 ,dc.procname
					 ,de.start_time
     FROM defcall dc, 
		      (SELECT * 
					   FROM (SELECT * FROM deferror ORDER BY start_time))
					  WHERE ROWNUM<2) de
     WHERE de.deferred_tran_id=dc.deferred_tran_id 
		   AND de.callno=dc.callno
		 )
	LOOP       
	  v_no_err := 0;    
	  IF err_tr.procname='REP_INSERT' THEN
		  col_cnt := 0;
		ELSE
		  col_cnt := 1;
		END IF;
	  dbms_defer_query.get_call_args(
		  callno  => err_tr.callno
		 ,tran_id => err_tr.deferred_tran_id
		 ,tran_db => err_tr.origin_tran_db
		 ,argcnt  => err_tr.argcount
		 ,argsize => 2000
		 ,date_fmt => 'dd-mm-yyyy  hh24:mi:ss'
		 ,types => v_types
		 ,vals => v_vals		 
		);                  
		dbms_output.put_line('------------------------------------------------------------------------------------------');
		dbms_output.put_line('Transacton id: '||err_tr.deferred_tran_id
		      ||' Package name:'||err_tr.schemaname||'.'||err_tr.packagename
		      ||' from database:'||err_tr.origin_tran_db);
		dbms_output.put_line('Error msg:'||err_tr.error_msg||' Procname: '||err_tr.procname);
		dbms_output.put_line(REPLACE(err_tr.packagename,'$RP')); 
		dbms_output.put_line(to_char(err_tr.start_time,'DD-MM-YYYY HH24:MI:SS'));   
		FOR v_cols IN (
		  SELECT column_id
			      ,column_name
						,DATA_TYPE 
      FROM Dba_Tab_Columns 
      WHERE table_name=REPLACE(err_tr.packagename,'$RP') --get table name from package name
			  AND owner=err_tr.schemaname 
      ORDER BY column_name)
		LOOP   
			col_cnt := col_cnt + 1;
		  CASE err_tr.procname 
		    WHEN 'REP_DELETE' THEN
					 BEGIN
						 dbms_output.put_line(lpad( v_cols.column_name||' '||v_cols.data_type||' original value: '||v_vals(col_cnt),255));
						 --EXECUTE IMMEDIATE 'select '||v_cols.column_name||' into v_vals('||to_char(col_cnt)||') from '
			         --||REPLACE(err_tr.packagename,'$RP')||' where rowid='||v_vals(1);
						 --dbms_output.put_line(v_cols.column_name||' '||v_cols.data_type||' current value: '||v_vals(col_cnt));
					 END; -- end if REP_DELETE 
				WHEN 'REP_INSERT' THEN
					 BEGIN
						 dbms_output.put_line(lpad(v_cols.column_name||' '||v_cols.data_type||' new value: '||v_vals(col_cnt),255));
					 END; -- end if REP_INSERT
				WHEN 'REP_UPDATE' THEN
					 BEGIN
						 dbms_output.put_line(lpad(v_cols.column_name||' '||v_cols.data_type||' original value: '||v_vals(col_cnt),255));
						 col_cnt := col_cnt + 1;
						 dbms_output.put_line(lpad(v_cols.column_name||' '||v_cols.data_type||' new value: '||v_vals(col_cnt),255));
           exception
             when others then null;				 
					 END;	-- end if REP_UPDATE					 
		  END CASE; 
		END LOOP;
	END LOOP;  
	IF v_no_err = 1 THEN dbms_output.put_line('no errors'); END IF;
END;
/
rollback;
SET FEEDBACK ON
11 июн 10, 15:24    [8931918]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Темный падаван
чтоб в тормозную java-консоль не лазить

Что вы понимаете под словами "просмотр конкретной ошибки"? Просмотр транзакции, в которой есть ошибка, или только конкретного call'а?
11 июн 10, 15:30    [8931974]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
Темный падаван
Member

Откуда: темная сторона Силы
Сообщений: 107
GL,

Просмотр конкретного кола, на котором ошибочная транзакция встает колом )
11 июн 10, 15:31    [8931994]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Темный падаван,

Посмотрел на ваш скрипт. А зачем вы отрезаете $RP от defcall.packagename'а - там же хранится именно имя таблицы, а уж никак не пакета репликации этой таблицы? У вас какая версия Oracle?
11 июн 10, 15:59    [8932281]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
Темный падаван
Member

Откуда: темная сторона Силы
Сообщений: 107
GL,

Если вы перечитаете свой пост, то имя поля именно packagename - имя пакета. А если вы возьмете таблицу в 30 символов и добавите ее в репликацию, то поймете о чем я. И на последок - это РАБОЧИЙ скрипт, для таблиц название которых <=27 символов
11 июн 10, 16:56    [8932710]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
Темный падаван
Member

Откуда: темная сторона Силы
Сообщений: 107
GL,

Версия 10.2.0.5 Linux x86-64
11 июн 10, 17:04    [8932760]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Темный падаван,

Cделайте, pls:
select package_name from defcall
и посмотрите, что там содержится в качестве package_name. У меня - имена таблиц. А у вас имена ...$RP и ...$RL пакетов, да? Извините, но я не верю - настолько криво настроить репликацию просто невозможно.
Если же речь идёт не о табличной, а о процедурной репликации, то тут действительно возможно всё.

Для справки: http://download.oracle.com/docs/cd/B19306_01/server.102/b14227/rardeftranviews.htm#i35093
11 июн 10, 17:19    [8932881]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
Темный падаван
Member

Откуда: темная сторона Силы
Сообщений: 107
GL,

А в чем кривизна-то? Покажите мне место в документации или на металинке, где написано, что этих суффиксов быть не должно? Пакеты создаются автоматически при добавлении таблиц в репликацию. Соответственно имя так же генерируется автоматически. И я сильно сомневаюсь, что oracle позволит вам создать в одной схеме 2 объекта с одинаковыми именами, но разных типов.
16 июн 10, 19:09    [8953180]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Темный падаван,

По ссылке:
DEFCALL
PACKAGENAME VARCHAR2(30) - The package name of the deferred call. For a replicated table, this can refer to the table name.
Перевод необходим?
16 июн 10, 21:10    [8953556]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
Темный падаван
Member

Откуда: темная сторона Силы
Сообщений: 107
GL,

Уважаемый, я по английски умею. И значение слова can знаю. И описание таблицы могу не только в документации, но и в самой базе посмотреть. Вы мне ссылочку дайте, что суффиксы - это неправильно. А то вот мне такая репликация с суффиксами досталась, а осмысленного объяснения, почему сие криво, я так и не видел.
16 июн 10, 21:34    [8953603]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Темный падаван,

А вы попробуйте сами сделать мастер-группу, добавить объекты (по мануалу), создать транзакцию и посмотреть, что будет в этом поле. Там и поговорим

PS Кстати, с англицким у вас таки ... того ... не очень...
16 июн 10, 21:38    [8953620]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
Темный падаван
Member

Откуда: темная сторона Силы
Сообщений: 107
GL,

Не поверите, пробовал не однократно. И все по мануалу (других источников не было) и все суффиксы вылазят, сволочи. Кстати, хотя can это не may, но все же не must ) Я готов признать свою неправоту, но при аргументированном ответе. Просто хочется понять, откуда суффикс... И как на счет одинаковых имен в одной схеме? Или у вас пакеты репликации в другой схеме лежат?
16 июн 10, 21:45    [8953633]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про репликацию  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Темный падаван,

Не совсем понятен вопрос про имена в одной схеме.
Пакет, поддерживающий репликацию таблицы, имеет суффикс $RP, $RL или $RR в зависимости от назначения пакета. Таблица такого суффикса не имеет. В представлении DEFCALL содержатся именно имена таблиц (для потабличной репликации) - и, соответственно, без суффиксов, или имена пакетов (для процедурной репликации), как правило (по умолчания, но не обязательно) с префиксами DEFER_ и таки да - уже в другой схеме.
16 июн 10, 22:03    [8953683]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить