Hi,
Here is the function can calculate the no.of files difference between the two wail files, and will give you an exact results.
CREATE OR REPLACE FUNCTION public.hot_standby_lag(primary_xlog_loc text, slave_xlog_replay_loc text)
RETURNS integer
LANGUAGE plpgsql
AS $function$
declare
Digit_Length int;
Query text;
No_of_Bits int;
No_of_Walfiles int;
No_of_Zeros int:=0;
Cnt int:=0;
Re_Formatted_Primary_Log text;
Re_Formatted_Slave_Log text;
_1 int;
_2 int;
_3 int;
BEGIN
select GREATEST(length(trim(substring($1 for 8),'0')||trim(substring($1 from 9 for 8),'0')||ltrim(substring($1 from 17 for 8),'0')),length(ltrim(substring($2 for 8),'0')||trim(substring($2 from 9 for 8),'0')||ltrim(substring($2 from 17 for 8),'0'))) into Digit_Length;
select GREATEST(length(ltrim(substring($1 for 8),'0')),length(ltrim(substring($2 for 8),'0'))) into _1;
select GREATEST(length(trim(substring($1 from 9 for 8),'0')),length(trim(substring($2 from 9 for 8),'0'))) into _2;
select GREATEST(length(ltrim(substring($1 from 17 for 8),'0')),length(ltrim(substring($2 from 17 for 8),'0'))) into _3;
if _3 != 2 then
Digit_Length:=Digit_Length+2-_3;
raise notice 'enterted';
end if;
raise notice '%',Digit_Length;
No_of_Bits:=4*(Digit_Length);
select ('x'||lpad(ltrim(substring(PRIMARY_XLOG_LOC for 8),'0'),_1,'0')||lpad(trim(substring(PRIMARY_XLOG_LOC from 9 for 8),'0'),_2,'0')||lpad(ltrim(substring(PRIMARY_XLOG_LOC from 17 for 8),'0'),2,'0')) into Re_Formatted_Primary_Log;
Raise notice '%',Re_Formatted_Primary_Log;
select ('x'||lpad(ltrim(substring(SLAVE_XLOG_REPLAY_LOC for 8),'0'),_1,'0')||lpad(trim(substring(SLAVE_XLOG_REPLAY_LOC from 9 for 8),'0'),_2,'0')||lpad(ltrim(substring(SLAVE_XLOG_REPLAY_LOC from 17 for 8),'0'),2,'0')) into Re_Formatted_Slave_Log;
raise notice '%',Re_Formatted_Slave_Log;
select GREATEST(length(regexp_replace(Re_Formatted_Primary_Log::text,'[^0]','','g')),length(regexp_replace(Re_Formatted_Slave_Log::text,'[^0]','','g'))) into Cnt;
Query:='select (select '''||Re_Formatted_Primary_Log||'''::bit('||No_Of_Bits||')::bigint) - (select '''||Re_Formatted_Slave_Log||'''::bit('||No_Of_Bits||')::bigint)';
raise notice '%',Query;
execute query into No_of_Walfiles;
return No_of_Walfiles;
END
$function$
Here, i tweaked the logic behind the hex decimal file names and will give you the exact resutls.
Hope this helps in warm standby/hot standby no.of files delay..
--Dinesh
Here is the function can calculate the no.of files difference between the two wail files, and will give you an exact results.
CREATE OR REPLACE FUNCTION public.hot_standby_lag(primary_xlog_loc text, slave_xlog_replay_loc text)
RETURNS integer
LANGUAGE plpgsql
AS $function$
declare
Digit_Length int;
Query text;
No_of_Bits int;
No_of_Walfiles int;
No_of_Zeros int:=0;
Cnt int:=0;
Re_Formatted_Primary_Log text;
Re_Formatted_Slave_Log text;
_1 int;
_2 int;
_3 int;
BEGIN
select GREATEST(length(trim(substring($1 for 8),'0')||trim(substring($1 from 9 for 8),'0')||ltrim(substring($1 from 17 for 8),'0')),length(ltrim(substring($2 for 8),'0')||trim(substring($2 from 9 for 8),'0')||ltrim(substring($2 from 17 for 8),'0'))) into Digit_Length;
select GREATEST(length(ltrim(substring($1 for 8),'0')),length(ltrim(substring($2 for 8),'0'))) into _1;
select GREATEST(length(trim(substring($1 from 9 for 8),'0')),length(trim(substring($2 from 9 for 8),'0'))) into _2;
select GREATEST(length(ltrim(substring($1 from 17 for 8),'0')),length(ltrim(substring($2 from 17 for 8),'0'))) into _3;
if _3 != 2 then
Digit_Length:=Digit_Length+2-_3;
raise notice 'enterted';
end if;
raise notice '%',Digit_Length;
No_of_Bits:=4*(Digit_Length);
select ('x'||lpad(ltrim(substring(PRIMARY_XLOG_LOC for 8),'0'),_1,'0')||lpad(trim(substring(PRIMARY_XLOG_LOC from 9 for 8),'0'),_2,'0')||lpad(ltrim(substring(PRIMARY_XLOG_LOC from 17 for 8),'0'),2,'0')) into Re_Formatted_Primary_Log;
Raise notice '%',Re_Formatted_Primary_Log;
select ('x'||lpad(ltrim(substring(SLAVE_XLOG_REPLAY_LOC for 8),'0'),_1,'0')||lpad(trim(substring(SLAVE_XLOG_REPLAY_LOC from 9 for 8),'0'),_2,'0')||lpad(ltrim(substring(SLAVE_XLOG_REPLAY_LOC from 17 for 8),'0'),2,'0')) into Re_Formatted_Slave_Log;
raise notice '%',Re_Formatted_Slave_Log;
select GREATEST(length(regexp_replace(Re_Formatted_Primary_Log::text,'[^0]','','g')),length(regexp_replace(Re_Formatted_Slave_Log::text,'[^0]','','g'))) into Cnt;
Query:='select (select '''||Re_Formatted_Primary_Log||'''::bit('||No_Of_Bits||')::bigint) - (select '''||Re_Formatted_Slave_Log||'''::bit('||No_Of_Bits||')::bigint)';
raise notice '%',Query;
execute query into No_of_Walfiles;
return No_of_Walfiles;
END
$function$
Here, i tweaked the logic behind the hex decimal file names and will give you the exact resutls.
Hope this helps in warm standby/hot standby no.of files delay..
--Dinesh
Comments
Post a Comment