แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแž˜แžฝแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž‘แž‘แžฝแž›แž”แžถแž“แž”แŸ’แžšแžœแžแŸ’แžแžทแž…แžถแž€แŸ‹แžŸแŸ„แž“แŸ…แž€แŸ’แž“แžปแž„ PostgreSQL

แž€แžถแžšแž”แž“แŸ’แžแž“แŸƒแžขแžแŸ’แžแž”แž‘ "แž€แžถแžšแž”แŸ‰แžปแž“แž”แŸ‰แž„แž”แž„แŸ’แž€แžพแžแžขแžถแžŽแžถแžกแžผแž€ ASH แžŸแž˜แŸ’แžšแžถแž”แŸ‹ PostgreSQL "แŸ”

แžขแžแŸ’แžแž”แž‘แž“แžนแž„แž–แžทแž“แžทแžแŸ’แž™ แž“แžทแž„แž”แž„แŸ’แž แžถแž‰ แžŠแŸ„แž™แž”แŸ’แžšแžพแžŸแŸ†แžŽแžฝแžš แž“แžทแž„แžงแž‘แžถแž แžšแžŽแŸแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹ แžแžพแž–แŸแžแŸŒแž˜แžถแž“แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแžขแŸ’แžœแžธแžแŸ’แž›แŸ‡แžขแžถแž…แž‘แž‘แžฝแž›แž”แžถแž“แžŠแŸ„แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸƒแž‘แžทแžŠแŸ’แž‹แž—แžถแž– pg_locks แŸ”

แž–แŸ’แžšแž˜แžถแž“
แžŠแŸ„แž™แžŸแžถแžšแžแŸ‚แž—แžถแž–แžแŸ’แž˜แžธแžแŸ’แž˜แŸ„แž„แž“แŸƒแž”แŸ’แžšแž’แžถแž“แž”แž‘ แž“แžทแž„แžšแž™แŸˆแž–แŸแž›แžŸแžถแž€แž›แŸ’แž”แž„แž˜แžทแž“แž‘แžถแž“แŸ‹แž”แž‰แŸ’แž…แž”แŸ‹ แžขแžแŸ’แžแž”แž‘แžขแžถแž…แž˜แžถแž“แž€แŸ†แž แžปแžŸแŸ” แž€แžถแžšแžšแžทแŸ‡แž‚แž“แŸ‹ แž“แžทแž„แž˜แžแžทแžแŸ’แžšแžผแžœแž”แžถแž“แžŸแŸ’แžœแžถแž‚แž˜แž“แŸแž™แŸ‰แžถแž„แžแŸ’แž›แžถแŸ†แž„ แž“แžทแž„แžšแŸ†แž–แžนแž„แž‘แžปแž€แŸ”

แž”แž‰แŸ’แž…แžผแž›โ€‹แž‘แžทแž“แŸ’แž“แž“แŸแž™

แž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸƒแž€แžถแžšแžแŸ†แžŽแžถแž„ pg_locks

archive_locking

CREATE TABLE archive_locking 
(       timepoint timestamp without time zone ,
	locktype text ,
	relation oid ,
	mode text ,
	tid xid ,
	vtid text ,
	pid integer ,
	blocking_pids integer[] ,
	granted boolean ,
        queryid bigint 
);

แžŸแŸ†แžแžถแž“แŸ‹แžแžถแžšแžถแž„แž‚แžบแžŸแŸ’แžšแžŠแŸ€แž„แž“แžนแž„แžแžถแžšแžถแž„ archive_pg_stat_activityแž–แžทแž–แžŽแŸŒแž“แžถแž›แž˜แŸ’แžขแžทแžแž“แŸ…แž‘แžธแž“แŸแŸ‡ - pg_stat_statements + pg_stat_activity + loq_query = pg_ash? แž แžพแž™แž“แŸ…แž‘แžธแž“แŸแŸ‡ - แž€แžถแžšแž”แŸ‰แžปแž“แž”แŸ‰แž„แžŠแžพแž˜แŸ’แž”แžธแž”แž„แŸ’แž€แžพแž analogue แž“แŸƒ ASH แžŸแž˜แŸ’แžšแžถแž”แŸ‹ PostgreSQL แŸ”

แžŠแžพแž˜แŸ’แž”แžธแž”แŸ†แž–แŸแž‰แž‡แžฝแžšแžˆแžš แžŸแŸ†แžŽแžฝแžš แž˜แžปแžแž„แžถแžšแžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹

update_history_locking_by_queryid

--update_history_locking_by_queryid.sql
CREATE OR REPLACE FUNCTION update_history_locking_by_queryid() RETURNS boolean AS $$
DECLARE
  result boolean ;
  current_minute double precision ; 
  
  start_minute integer ;
  finish_minute integer ;
  
  start_period timestamp without time zone ;
  finish_period timestamp without time zone ;
  
  lock_rec record ; 
  endpoint_rec record ; 
  
  current_hour_diff double precision ;
BEGIN
  RAISE NOTICE '***update_history_locking_by_queryid';
  
  result = TRUE ;
  
  current_minute = extract ( minute from now() );

  SELECT * FROM endpoint WHERE is_need_monitoring
  INTO endpoint_rec ;
  
  current_hour_diff = endpoint_rec.hour_diff ;
  
  IF current_minute < 5 
  THEN
	RAISE NOTICE 'Current time is less than 5 minute.';
	
	start_period = date_trunc('hour',now()) + (current_hour_diff * interval '1 hour');
    finish_period = start_period - interval '5 minute' ;
  ELSE 
    finish_minute =  extract ( minute from now() ) / 5 ;
    start_minute =  finish_minute - 1 ;
  
    start_period = date_trunc('hour',now()) + interval '1 minute'*start_minute*5+(current_hour_diff * interval '1 hour');
    finish_period = date_trunc('hour',now()) + interval '1 minute'*finish_minute*5+(current_hour_diff * interval '1 hour') ;
    
  END IF ;  
  
  RAISE NOTICE 'start_period = %', start_period;
  RAISE NOTICE 'finish_period = %', finish_period;

	FOR lock_rec IN   
	WITH act_queryid AS
	 (
		SELECT 
				pid , 
				timepoint ,
				query_start AS started ,			
				MAX(timepoint) OVER (PARTITION BY pid ,	query_start   ) AS finished ,			
				queryid 
		FROM 
				activity_hist.history_pg_stat_activity 			
		WHERE 			
				timepoint BETWEEN start_period and 
								  finish_period
		GROUP BY 
				pid , 
				timepoint ,  
				query_start ,
				queryid 
	 ),
	 lock_pids AS
		(
			SELECT
				hl.pid , 
				hl.locktype  ,
				hl.mode ,
				hl.timepoint , 
				MIN ( timepoint ) OVER (PARTITION BY pid , locktype  ,mode ) as started 
			FROM 
				activity_hist.history_locking hl
			WHERE 
				hl.timepoint between start_period and 
								     finish_period
			GROUP BY 
				hl.pid , 
				hl.locktype  ,
				hl.mode ,
				hl.timepoint 
		)
	SELECT 
		lp.pid , 
		lp.locktype  ,
		lp.mode ,
		lp.timepoint ,     
		aq.queryid 
	FROM lock_pids 	lp LEFT OUTER JOIN act_queryid aq ON ( lp.pid = aq.pid AND lp.started BETWEEN aq.started AND aq.finished )
	WHERE aq.queryid IS NOT NULL 
	GROUP BY  
		lp.pid , 
		lp.locktype  ,
		lp.mode ,
		lp.timepoint , 
		aq.queryid
	LOOP
		UPDATE activity_hist.history_locking SET queryid = lock_rec.queryid 
		WHERE pid = lock_rec.pid AND locktype = lock_rec.locktype AND mode = lock_rec.mode AND timepoint = lock_rec.timepoint ;	
	END LOOP;    
  
  RETURN result ;
END
$$ LANGUAGE plpgsql;

แž€แžถแžšแž–แž“แŸ’แž™แž›แŸ‹แŸ– แžแž˜แŸ’แž›แŸƒแž“แŸƒแž‡แžฝแžšแžˆแžšแžŸแŸ†แžŽแžฝแžšแžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž–แž“แŸ…แž€แŸ’แž“แžปแž„แžแžถแžšแžถแž„ history_locking แž แžพแž™แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แž—แžถแž‚แžแžถแžŸแžแŸ’แž˜แžธแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแžถแžšแžถแž„ archive_locking แžแž˜แŸ’แž›แŸƒแž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž€แŸ’แž“แžปแž„แžแž˜แŸ’แž›แŸƒแž”แŸ’แžšแžœแžแŸ’แžแžทแžŸแžถแžŸแŸ’แžแŸ’แžšแŸ”

แž›แž‘แŸ’แž’แž•แž›

แž–แŸแžแŸŒแž˜แžถแž“แž‘แžผแž‘แŸ…แžขแŸ†แž–แžธแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‘แžผแž‘แŸ…แŸ”

แž€แŸ†แž–แžปแž„แžšแž„แŸ‹แž…แžถแŸ†แž€แžถแžšแž…แžถแž€แŸ‹แžŸแŸ„แžŠแŸ„แž™แž”แŸ’แžšแž—แŸแž‘แž…แžถแž€แŸ‹แžŸแŸ„

แžŸแŸ†แžŽแžพ

WITH
t AS
(
	SELECT 
		locktype  ,
		mode ,
		count(*) as total 
	FROM 
		activity_hist.archive_locking
	WHERE 
		timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND 
		NOT granted
	GROUP BY 
		locktype  ,
		mode  
)
SELECT 
	locktype  ,
	mode ,
	total * interval '1 second' as duration			
FROM t 		
ORDER BY 3 DESC 

แžงแž‘แžถแž แžšแžŽแŸ:

| แžšแž„แŸ‹แž…แžถแŸ†แž€แžถแžšแž…แžถแž€แŸ‹แžŸแŸ„แžšแžŠแŸ„แž™ LOCKTYPES -----------------------+------------------------------------+ ------------------- | แž”แŸ’แžšแž—แŸแž‘แž…แžถแž€แŸ‹แžŸแŸ„| แžšแž”แŸ€แž”| แžšแž™แŸˆแž–แŸแž› +--------------------+-------------------------------- --+-------------------- | แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| แŸกแŸฉ:แŸฃแŸฉ:แŸขแŸฆ | tuple| AccessExclusiveLock| 19:39:26 ------------------------------+----------------------- --------+----------

แž€แžถแžšแž…แžถแž”แŸ‹แž™แž€แžŸแŸ„แžแžถแž˜แž”แŸ’แžšแž—แŸแž‘แžŸแŸ„

แžŸแŸ†แžŽแžพ

WITH
t AS
(
	SELECT 
		locktype  ,
		mode ,
		count(*) as total 
	FROM 
		activity_hist.archive_locking
	WHERE 
		timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND 
		granted
	GROUP BY 
		locktype  ,
		mode  
)
SELECT 
	locktype  ,
	mode ,
	total * interval '1 second' as duration			
FROM t 		
ORDER BY 3 DESC 

แžงแž‘แžถแž แžšแžŽแŸ:

| แž€แžถแžšแž…แžถแž”แŸ‹แž™แž€แžŸแŸ„แžแžถแž˜แž”แŸ’แžšแž—แŸแž‘แžŸแŸ„ +--------------------------------+-------------------------- --------+-------- | แž”แŸ’แžšแž—แŸแž‘แž…แžถแž€แŸ‹แžŸแŸ„| แžšแž”แŸ€แž”| แžšแž™แŸˆแž–แŸแž› +--------------------+-------------------------------- --+-------------------- | แž‘แŸ†แž“แžถแž€แŸ‹แž‘แŸ†แž“แž„ | RowExclusiveLock| 51:11:10 | แž“แžทแž˜แŸ’แž˜แžทแž | ExclusiveLock| แŸคแŸจ:แŸกแŸ :แŸคแŸฃ | แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ExclusiveLock| 48:10:43 | แž‘แŸ†แž“แžถแž€แŸ‹แž‘แŸ†แž“แž„ | AccessShareLock| 44:24:53 | tuple| AccessExclusiveLock| แŸกแŸง:แŸฅแŸจ:แŸคแŸง | tuple| ExclusiveLock| 20:06:13 | แž‘แŸ†แž“แžถแž€แŸ‹แž‘แŸ†แž“แž„ | ShareUpdateExclusiveLock| 17:58:47 | แžœแžแŸ’แžแžป | RowExclusiveLock| 01:40:41 | แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 00:26:41 | แž–แž„แŸ’แžšแžธแž€| ExclusiveLock| 00:00:01 ------------------------------+----------------------- --------+----------

แž–แŸแžแŸŒแž˜แžถแž“แž›แž˜แŸ’แžขแžทแžแžขแŸ†แž–แžธแžŸแŸ†แžŽแžพแžŸแŸ†แžŽแžฝแžšแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹

แž€แŸ†แž–แžปแž„แžšแž„แŸ‹แž…แžถแŸ†แž€แžถแžšแž…แžถแž€แŸ‹แžŸแŸ„แžŠแŸ„แž™ LOCKTYPES แžŠแŸ„แž™แž€แžถแžšแžŸแŸ’แžœแŸ‚แž„แžšแž€

แžŸแŸ†แžŽแžพ

WITH
lt AS
(
	SELECT
		pid , 
		locktype  ,
		mode ,
		timepoint , 
		queryid , 
		blocking_pids ,
                MIN ( timepoint ) OVER (PARTITION BY pid , locktype  ,mode ) as started  
	FROM 
		activity_hist.archive_locking
	WHERE 
		timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND 
			                  pg_stat_history_end+(current_hour_diff * interval '1 hour') AND 
		NOT granted AND
	       queryid IS NOT NULL 
	GROUP BY 
	        pid , 
		locktype  ,
		mode ,
		timepoint ,
		queryid ,
		blocking_pids 
)
SELECT 
        lt.pid , 
	lt.locktype  ,
	lt.mode ,			
        lt.started ,
	lt.queryid  ,
	lt.blocking_pids ,
	COUNT(*)  * interval '1 second'	 as duration		
FROM lt 	
GROUP BY 
	lt.pid , 
        lt.locktype  ,
	lt.mode ,			
        lt.started ,
        lt.queryid ,
	lt.blocking_pids 
ORDER BY 4

แžงแž‘แžถแž แžšแžŽแŸ:

| แžšแž„แŸ‹แž…แžถแŸ†แž€แžถแžšแž…แžถแž€แŸ‹แžŸแŸ„แžšแžŠแŸ„แž™ LOCKTYPES แžŠแŸ„แž™แž€แžถแžšแžŸแžถแž€แžŸแžฝแžš +----------+----------------+--------------------- --------------------------------+------------------ -+--------------------+----------------- --------- | pid| แž”แŸ’แžšแž—แŸแž‘แž…แžถแž€แŸ‹แžŸแŸ„| แžšแž”แŸ€แž”| แž”แžถแž“แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜| แžŸแŸ†แžŽแžฝแžš | blocking_pids| แžšแž™แŸˆแž–แŸแž› ----------+--------------------------------+----------- --------+--------------------------------+--------- ----------+--------------------------------+---------------- ---| แŸกแŸกแŸขแŸจแŸจ| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 11288-2019-09 17:10:00| 00.302936| {389015618226997618}| 11092:00:03 | แŸกแŸกแŸฆแŸขแŸฆ| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 34-11626-2019 09:17:10| 00| {21.380921}| 389015618226997618:12380:00 | แŸกแŸกแŸฆแŸขแŸฆ| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 00-29-11626 2019:09:17| 10| {00}| 21.380921:389015618226997618:11092 | แŸกแŸกแŸฆแŸขแŸฆ| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 00-03-25 11626:2019:09| 17| {10}| 00:21.380921:389015618226997618 | แŸกแŸกแŸฆแŸขแŸฆ| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 12213-00-01 55:11626:2019| 09| {17}| 10:00:21.380921 | แŸกแŸกแŸฆแŸขแŸฉ| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 389015618226997618-12751-00 00:01:11629| 2019| {09}| 17:10:00 | แŸกแŸกแŸฆแŸขแŸฉ| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 24.331935-389015618226997618-11092 00:03:22| 11629| {2019}| 09:17:10 | 00| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 24.331935-389015618226997618-12007 00:00:01| 12007| {2019}| 09:17:10 | 05| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 03.327933-389015618226997618-11629 00:00:13| 12007| {2019}| 09:17:10 | 05| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 03.327933-389015618226997618-11092 00:01:10| 12007| {2019}| 09:17:10 | 05| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ShareLock| 03.327933-389015618226997618-11288 00:00:05| 12213| {2019}| 09:17:10

แž…แžถแž”แŸ‹แž™แž€แžŸแŸ„แžแžถแž˜แž”แŸ’แžšแž—แŸแž‘แž…แžถแž€แŸ‹แžŸแŸ„แžŠแŸ„แž™แžŸแŸ†แžŽแžฝแžš

แžŸแŸ†แžŽแžพ

WITH
lt AS
(
	SELECT
		pid , 
		locktype  ,
		mode ,
		timepoint , 
		queryid , 
		blocking_pids ,
                MIN ( timepoint ) OVER (PARTITION BY pid , locktype  ,mode ) as started  
	FROM 
		activity_hist.archive_locking
	WHERE 
		timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND 
			                  pg_stat_history_end+(current_hour_diff * interval '1 hour') AND 
		granted AND
		queryid IS NOT NULL 
	GROUP BY 
	        pid , 
		locktype  ,
		mode ,
		timepoint ,
		queryid ,
		blocking_pids 
)
SELECT 
        lt.pid , 
	lt.locktype  ,
	lt.mode ,			
        lt.started ,
	lt.queryid  ,
	lt.blocking_pids ,
	COUNT(*)  * interval '1 second'	 as duration			
FROM lt 	
GROUP BY 
	lt.pid , 
	lt.locktype  ,
	lt.mode ,			
        lt.started ,
	lt.queryid ,
	lt.blocking_pids 
ORDER BY 4

แžงแž‘แžถแž แžšแžŽแŸ:

| แž™แž€แžŸแŸ„แžแžถแž˜แž”แŸ’แžšแž—แŸแž‘แž…แžถแž€แŸ‹แžŸแŸ„แžแžถแž˜แžŸแŸ†แžŽแžฝแžš +----------+----------+------ -------------+ --------------------------------+--------------------+ --------------------+------------------ -------- | pid| แž”แŸ’แžšแž—แŸแž‘แž…แžถแž€แŸ‹แžŸแŸ„| แžšแž”แŸ€แž”| แž”แžถแž“แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜| แžŸแŸ†แžŽแžฝแžš | blocking_pids| แžšแž™แŸˆแž–แŸแž› ----------+--------------------------------+----------- --------+--------------------------------+--------- ----------+--------------------------------+---------------- ---| แŸกแŸกแŸขแŸจแŸจ| แž‘แŸ†แž“แžถแž€แŸ‹แž‘แŸ†แž“แž„ | RowExclusiveLock| 11288-2019-09 17:10:00| 00.302936| {389015618226997618}| 11092:00:03 | แŸกแŸกแŸ แŸฉแŸข| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ExclusiveLock| 34-11092-2019 09:17:10| 00| {}| 00.302936:389015618226997618:00 | แŸกแŸกแŸขแŸจแŸจ| แž‘แŸ†แž“แžถแž€แŸ‹แž‘แŸ†แž“แž„ | RowExclusiveLock| 03-34-11288 2019:09:17| 10| {}| 00:00.302936:389015618226997618 | แŸกแŸกแŸ แŸฉแŸข| แž‘แŸ†แž“แžถแž€แŸ‹แž‘แŸ†แž“แž„ | RowExclusiveLock| 00-00-10 11092:2019:09| 17| {}| 10:00:00.302936 | แŸกแŸกแŸ แŸฉแŸข| แž“แžทแž˜แŸ’แž˜แžทแž | ExclusiveLock| 389015618226997618-00-03 34:11092:2019| 09| {}| 17:10:00 | แŸกแŸกแŸขแŸจแŸจ| แž“แžทแž˜แŸ’แž˜แžทแž | ExclusiveLock| 00.302936-389015618226997618-00 03:34:11288| 2019| {09}| 17:10:00 | แŸกแŸกแŸขแŸจแŸจ| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| ExclusiveLock| 00.302936-389015618226997618-11092 00:03:34| 11288| {2019}| 09:17:10 | แŸกแŸกแŸขแŸจแŸจ| tuple| AccessExclusiveLock| 00-00.302936-389015618226997618 11092:00:03| 34| {11288}| 2019:09:17

แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžœแžแŸ’แžแžทแž…แžถแž€แŸ‹แžŸแŸ„แžŠแžพแž˜แŸ’แž”แžธแžœแžทแž—แžถแž‚แžงแž”แŸ’แž”แžแŸ’แžแžทแž แŸแžแžปแž“แŸƒแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแŸ”

  1. แžŸแŸ†แžŽแžพแž‡แžถแž˜แžฝแž™ queryid=389015618226997618 แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแžŠแŸ„แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž˜แžฝแž™ pid=11288 แž€แŸ†แž–แžปแž„แžšแž„แŸ‹แž…แžถแŸ†แž€แžถแžšแž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹แžŠแŸ‚แž›แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž–แžธ 2019-09-17 10:00:00 แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžšแž™แŸˆแž–แŸแž› 3 แž“แžถแž‘แžธแŸ”
  2. แž€แžถแžšแž…แžถแž€แŸ‹แžŸแŸ„แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžŠแŸ„แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž˜แžฝแž™ pid=11092
  3. แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž˜แžฝแž™ pid=11092 แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแžŸแŸ†แžŽแžพแž‡แžถแž˜แžฝแž™ queryid=389015618226997618 แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž–แžธ 2019-09-17 10:00:00 แž…แžถแž€แŸ‹แžŸแŸ„แžšแž™แŸˆแž–แŸแž› 3 แž“แžถแž‘แžธแŸ”

แž›แž‘แŸ’แž’แž•แž›

แžฅแžกแžผแžœแž“แŸแŸ‡แžแŸ’แž‰แžปแŸ†แžŸแž„แŸ’แžƒแžนแž˜แžแžถแž•แŸ’แž“แŸ‚แž€แžŠแŸ‚แž›แž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž“แžทแž„แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž”แŸ†แž•แžปแžแž“แžนแž„แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ - แž€แžถแžšแž”แŸ’แžšแž˜แžผแž›แžŸแŸ’แžแžทแžแžทแž“แžทแž„แž€แžถแžšแžœแžทแž—แžถแž‚แž€แžšแžŽแžธแž›แžพแž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸƒแž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แž“แžทแž„แž€แžถแžšแž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹แŸ”

แž“แŸ…แž–แŸแž›แžขแž“แžถแž‚แž แžแŸ’แž‰แžปแŸ†แž…แž„แŸ‹แž‡แžฟแžแžถ แž™แžพแž„แž“แžนแž„แž‘แž‘แžฝแž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แž…แŸ†แžŽแžถแŸ†แž˜แžฝแž™แž…แŸ†แž“แžฝแž“ (แžŸแŸ’แžšแžŠแŸ€แž„แž‘แŸ…แž“แžนแž„ metalink แžšแž”แžŸแŸ‹ Oracle)แŸ”

แž‡แžถแž‘แžผแž‘แŸ… แžœแžถแž‚แžบแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž แŸแžแžปแž•แž›แž“แŸแŸ‡ แžŠแŸ‚แž›แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแžŠแŸ‚แž›แž”แžถแž“แž”แŸ’แžšแžพแžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแžฑแŸ’แž™แž˜แžถแž“แžŠแž›แŸ‹แž˜แž“แžปแžŸแŸ’แžŸแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แž“แžถแžฑแŸ’แž™แž”แžถแž“แž›แžฟแž“แžแžถแž˜แžŠแŸ‚แž›แžขแžถแž…แž’แŸ’แžœแžพแž‘แŸ…แž”แžถแž“แŸ”

แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž–แŸ’แž™แžถแž™แžถแž˜แž”แž„แŸ’แž แŸ„แŸ‡แž‚แž˜แŸ’แžšแŸ„แž„แž“แŸแŸ‡แž“แŸ…แž›แžพ github แž“แžถแž–แŸแž›แžแžถแž„แž˜แžปแžแž“แŸแŸ‡แŸ”

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹