powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как узнать timestamp бэкапа
17 сообщений из 42, страница 2 из 2
как узнать timestamp бэкапа
    #39993451
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, а что, я настолько часто нажираюсь, что несу чушь?
Ты только моему работодателю об этом не говори...
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994059
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сорян, дошли руки глянуть внимательнее
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> select to_char(sysdate, 'DD.MM.YYYY HH24:MI:SS') dt,
 ''||DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, ''||current_scn, SCN_TO_TIMESTAMP(current_scn) st from v$database d;

DT
----------------------------------------------------------------------------
''||DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
--------------------------------------------------------------------------------
''||CURRENT_SCN
--------------------------------------------------------------------------------
ST
---------------------------------------------------------------------------
31.08.2020 13:39:46
21589873590
21589873590
27-AUG-20 04.49.00.000000000 PM


21589873590 - ожидаемо)
с него - SCN_TO_TIMESTAMP - это почти дата опена в ридонли того, что восстановлено из бэкапа)

Код: plsql
1.
2.
2020-08-27T16:48:45.222346+05:00
Completed: alter database open read only



а вот это ещё один вариант оно)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select scn_to_timestamp(max(scn)) oo, ''||max(scn) m_scn from sys.SMON_SCN_TIME;

OO
---------------------------------------------------------------------------
M_SCN
--------------------------------------------------------------------------------
12-AUG-20 01.39.42.000000000 AM
21589852576
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994299
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
итог-то какой? где достоверно смотреть достоверное время до секунд?
пробовать методом тыка?)
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994324
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе нужно посмотреть, до какого SCN можно восстановить, чтоб открыть без проблем?

Или тебе просто нужно узнать время, к которому будет относиться RESETLOGS ?

На момент восстановления у тебя архивлоги закаталогизированы (или информация о них изначально находится в восстановленном контролфайле)
А тут к тебя и V$ARCHIVED_LOG и V$BACKUP_ARCHIVELOG_DETAILS -- если ты целиком катил этот лог, то NEXT_TIME скорее всего то, что тебе нужно

А SCN_TO_TIMESTAMP, как я уже говорил, работает на основании обычной таблицы SYS.SMON_SCN_TIME, которая доступна только при открытой (в том числе в READ ONLY) БД. Ну и дальше банальная интерполяция (хотя возможно, последние 1-5-10-60 минут могут храниться и в какой-нибудь динамической вьюхе)
Да, она часто (как правило, каждую минуту, но зависит от нагрузки) обновляется, поддерживая небольшое кол-во записей (до 11g там вообще фиксированное количество строк было), где-то 5-7 дней, но при открытии в RO ты точно не перезапишешь старые (восстановленные с бэкапа) записи, поэтому время будет правильное

PS. Ну и очень похоже, что TIME_DP таки хранится в UTC
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994388
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Или тебе просто


просто нужно узнать точное время)
целиком катил лог 1145 (ресторе и рековер until sequence 1146)

тогда глупый вопрос:
(в архивлоге 1145 Next SCN) 21589873591 останется накачен или нет?
AlexVin
(он же в 1146 Low SCN)


current_scn = 21589873590 в развернутой из бэкапа и открытой на чтение базе на 1 меньше почему-то

в заголовках файлов 21589873591 12-AUG-2020 01:45:51

в SMON_SCN_TIME максимальный 12-AUG-20 01.39.42.000000000 AM 21589852576

TIME_DP таки хранится в UTC - похоже)

Код: plsql
1.
2.
3.
4.
5.
SQL> select to_char(l.next_time, 'DD.MM.YYYY HH24:MI:SS') dt from V$ARCHIVED_LOG l where l.sequence# = 1145;

DT
----------------------------------------------------------------------------
12.08.2020 01:45:51



так на 01.39.42 или на 01:45:51 будет база после RESETLOGS?
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994414
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как не включается
+- 1 к SCN это там вообще какая-то чехарда (насколько помню, это обсуждалось в топике что-то типа "прыжок через resetlogs")
Кстати, в контролфайле текущий SCN увеличивается при каждой попытке открытия (есть и более радикальные способы)

В твоем случае получается что таки ближе к "01:45:51", из NEXT_TIME
Но ты мог попробовать и проинтерполировать значения из SYS.SMON_SCN_TIME на значение RESETLOGS_CHANGE# (после открытия), да или просто запросить scn_to_timestamp(resetlogs_change#) from v$database, но тут проблема, как быстро оно перезапишет содержимое таблички под актуальные данные.

Ну и на какой SCN (точно) у тебя произошел RESETLOGS ты можешь посмотреть в V$DATABASE или alert.log

Что-то я вообще перестал понимать, что именно тебе непонятно
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994425
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя там тоже иногда погоду показывают
Код: plsql
1.
2.
3.
4.
5.
tst> select resetlogs_time, resetlogs_change#, scn_to_timestamp(resetlogs_change#) from v$database;

RESETLOGS_TIME      RESETLOGS_CHANGE# SCN_TO_TIMESTAMP(RESETLOGS_CHANGE#)
------------------- ----------------- ------------------------------------------------------------------
31-08-2020 15:26:27      126823247866 30-08-2020 14:33:20.000000000


Лог RMAN DUPLICATE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
contents of Memory Script:
{
   set until scn  126823154156;
   set newname for datafile  1 to
...
   restore
...
...
contents of Memory Script:
{
   set until time  "to_date('AUG 30 2020 14:34:15', 'MON DD YYYY HH24:MI:SS')";
   recover
...

alert.log
Код: plaintext
1.
2.
Mon Aug 31 15:25:45 2020
Incomplete Recovery applied until change 126823247865 time 08/30/2020 14:34:15


Но все-таки DUPLICATE это там, где не очень-то повлияешь на такие мелочи
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994484
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
В твоем случае получается что таки ближе к "01:45:51", из NEXT_TIME

мне не надо ближе)
в итоге мне надо поднять базу на максимально возможное время и сказать его с точностью до секунды)
на какое время в ней данные
казалось бы просто всё
until да, не включает указанное значение как between. вроде бы)

а что в SCN_TO_TIMESTAMP чехарда, это я уже в курсе)
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994492
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexVin

не включает указанное значение как between

between включает (>= and <=)

....
stax
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994495
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, не чехарда

Я подзабыл это за давностью и ненужностью
Но именно с 10g SMON_SCN_TIME хранит базовое время/scn (time_dp/scn) для совместимости, обеспечивая точность как минимум в 5 мин +- интерполяция, дополнительно к этому хранится еще и более мелкая карта (TIM_SCN_TIME) которая позволяет хранить до 300 "уточнений" повышая точность до 1 сек.

А scn_to_timestamp(resetlogs_change#) from v$database вполне себе точное время RESETLOGS-а
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994498
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
AlexVin

until да, не включает указанное значение как between

between включает (>= and <=)

....
stax
-- Грузины лучше чем армяне
-- Чем, чем лучше?
-- Чем армяне
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994522
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Stax
пропущено...

between включает (>= and <=)

....
stax
-- Грузины лучше чем армяне
-- Чем, чем лучше?
-- Чем армяне


until да, не включает указанное значение как включает between ))
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994642
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
дополнительно к этому хранится еще и более мелкая карта (TIM_SCN_TIME) которая позволяет хранить до 300 "уточнений" повышая точность до 1 сек.

TIM_SCN_TIME = TIM_SCN_MAP ?
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39994847
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я тут немного поковырял новое содержимое SMON_SCN_TIME
Получилось примерно следущее
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
set serveroutput on
declare
	num_rows constant integer := 3;
	endianess constant number := utl_raw.machine_endian;

/*	endian_format varchar2(8);
*/
	raw_line raw(12);
	raw_piece raw(4);
	time_unix date;
	scn_wrap number;
	scn_base number;
	scn_full number;
	opts_or_thread number;
begin
/*	select endian_format into endian_format
	from v$transportable_platform t, v$database d
	where d.platform_name = t.platform_name;
*/
	for r in (select * from (select * from sys.smon_scn_time order by scn desc
				)where rownum <= num_rows) loop
		for i in reverse 1..r.num_mappings loop
			raw_line := utl_raw.substr(r.tim_scn_map, (i-1)*12+1, 12);
			time_unix := date '1970-01-01' +
				utl_raw.cast_to_binary_integer(
						utl_raw.substr(raw_line, 1, 4), endianess
								)/24/60/60;
/*			scn_base := utl_raw.cast_to_binary_integer(
						utl_raw.substr(raw_line, 5, 4), endianess);
*/
/*			raw_piece := case when endian_format='Big'
					then utl_raw.substr(raw_line, 5, 4)
					else utl_raw.reverse(utl_raw.substr(raw_line, 5, 4))
					end;
			scn_base := to_number(rawtohex(raw_piece), 'XXXXXXXX');
*/
			scn_base := utl_raw.cast_to_binary_integer(
						utl_raw.substr(raw_line, 5, 4), endianess);
			scn_base := scn_base + case when scn_base < 0
						then power(2, 32)
						else 0
						end;
			scn_wrap := utl_raw.cast_to_binary_integer(
						utl_raw.substr(raw_line, 9, 2), endianess);
			scn_full := scn_wrap * power(2, 32) + scn_base;

/*			raw_piece := case when endian_format='Big'
					then utl_raw.substr(raw_line, 11, 2)
					else utl_raw.reverse(utl_raw.substr(raw_line, 11, 2))
					end;
			opts_or_thread := to_number(rawtohex(raw_piece), 'XXXX');
*/
			opts_or_thread := utl_raw.cast_to_binary_integer(
						utl_raw.substr(raw_line, 11, 2), endianess);
			opts_or_thread := opts_or_thread + case when opts_or_thread < 0
						then power(2, 16)
						else 0
						end;

			dbms_output.put_line('. '||to_char(i, '990')||rpad(' ...', 15)||
					to_char(time_unix, 'yyyy-mm-dd hh24:mi:ss')||'  scn: '||
					to_char(scn_wrap, 'FMXXXX')||'.'||
					to_char(scn_base, 'FM0XXXXXXX')||': '||
					to_char(scn_full, 'FM9999999999999990')||' opts_or_thread:'||
					to_char(opts_or_thread, '0XXX'));
		end loop;
		time_unix := date '1970-01-01' + r.time_mp/24/60/60;
		scn_wrap := r.scn_wrp;
		scn_base := r.scn_bas;
		scn_full := r.scn;
		dbms_output.put_line(to_char(time_unix, 'yyyy-mm-dd hh24:mi:ss')||' ('||
					to_char(r.time_dp, 'yyyy-mm-dd hh24:mi:ss')||') scn: '||
					to_char(scn_wrap, 'FMXXXX')||'.'||
					to_char(scn_base, 'FM0XXXXXXX')||': '||
					to_char(scn_full, 'FM9999999999999990'));
	end loop;
end;
/

Все эти приседания с Big/Little Endian связаны с тем, что utl_raw.cast_to_binary_integer работает со знаковым INTEGER, а нужен беззнаковый -- тут либо превращать в HEX используя соответствующий порядок байт (закоментировано), либо тупо таки добавить недостающее -- кто работал с машинным представлением, тот не увидит ничего необычного
По-хорошему это надо делать со всеми значениями, но смещение от UNIX_DATE пока положительно и SCN_WRAP (у меня по крайней мере, но подозреваю, что у всех) тоже положительно, поэтому не парился :-(

Последние 2 байта названы как opts_or_thread ибо мне не понятно, что там -- после 12.2 там всегда 0 (но у меня single instance), а до этого там попадались и более другие значения, возможно просто мусор
Т.е., как правило, каждая запись генерируется раз в 5 мин, и может хранить до 100 уточнений, но в зависимости от нагрузки там может быть и 3 сек и 1 SCN
Ну и дырки от клонирования тоже вполне присутствуют -- БД после DUPLICATE из предыдущих постов
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
tst> select min(mins), max(mins), min(scns), max(scns) from
  2   (select (time_dp-lag(time_dp) over (order by scn))*24*60 mins,
  3           scn-lag(scn) over (order by scn) scns
  4    from sys.smon_scn_time)
  5  where scns is not null;

   MIN(MINS)    MAX(MINS)    MIN(SCNS)    MAX(SCNS)
------------ ------------ ------------ ------------
         .05 1499.5333333           10     95685911


На нормально работающих БД это значение лежит в районе 5 мин.


старые версииЧто еще смешнее, в 10g смещение для TIME_MP было вообще каким-то странным
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
asv> select * from v$version where rownum=1;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

asv> select distinct time_dp-(time_mp/24/60/60) from sys.smon_scn_time;

TIME_DP-(TIME_MP/24
-------------------
26-05-1987 00:00:00

asv> connect system@tst
Enter password: *******
Connected.
tst> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

tst> select distinct time_dp-(time_mp/24/60/60) from sys.smon_scn_time;

TIME_DP-(TIME_MP/24
-------------------
01-01-1970 00:00:00

Это все на Solaris SPARC (Big endian)
9-ку развернуть уже сложно, не поддерживается новой соляркой :-(
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39995665
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexVin

current_scn = 21589873590 в развернутой из бэкапа и открытой на чтение базе на 1 меньше почему-то

в заголовках файлов 21589873591 12-AUG-2020 01:45:51

в SMON_SCN_TIME максимальный 12-AUG-20 01.39.42.000000000 AM 21589852576

Код: plsql
1.
2.
3.
4.
5.
SQL> select to_char(l.next_time, 'DD.MM.YYYY HH24:MI:SS') dt from V$ARCHIVED_LOG l where l.sequence# = 1145;

DT
----------------------------------------------------------------------------
12.08.2020 01:45:51



так на 01.39.42 или на 01:45:51 будет база после RESETLOGS?


после alter database open resetlogs:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select scn_to_timestamp(resetlogs_change#) rch, ''||resetlogs_change# from v$database;

RCH
---------------------------------------------------------------------------
''||RESETLOGS_CHANGE#
--------------------------------------------------------------------------------
12-AUG-20 01.41.00.000000000 AM
21589873592


а next_time действительно не включен.
пока не резетлогнешь, не узнаешь до скольки накатили?))
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39995988
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чем checkpoint_time не подходит...
...
Рейтинг: 0 / 0
как узнать timestamp бэкапа
    #39996069
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DВА
чем checkpoint_time не подходит...

где, когда и как его посмотреть?
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как узнать timestamp бэкапа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]