অ্যালটার টেবিলে ডেটাবেস "হিমায়িত"


15

আমাদের উত্পাদনের পরিবেশটি আজ সকালে ঠিক কোনও কমে যাওয়ার জন্য কোনও টেবিল পরিবর্তন করার সময় কিছুক্ষণের জন্য হিমশীতল হয়।

অফারিং এসকিউএল:ALTER TABLE cliente ADD COLUMN topicos character varying(20)[];

* আমাদের সিস্টেমে লগইন করার জন্য সেই একই টেবিল থেকে একটি নির্বাচন দরকার, যাতে কোনও পরিবর্তনকারী টেবিলের সময় কেউ লগইন করতে পারে না। সিস্টেমটি স্বাভাবিক ক্রিয়াকলাপ পুনরায় চালু করার জন্য আমাদের প্রক্রিয়াটি হারাতে হয়েছিল।


টেবিল কাঠামো:

CREATE TABLE cliente
(
  rut character varying(30) NOT NULL,
  nombre character varying(150) NOT NULL,
  razon_social character varying(150) NOT NULL,
  direccion character varying(200) NOT NULL,
  comuna character varying(100) NOT NULL,
  ciudad character varying(100) NOT NULL,
  codigo_pais character varying(3) NOT NULL,
  activo boolean DEFAULT true,
  id serial NOT NULL,
  stock boolean DEFAULT false,
  vigente boolean DEFAULT true,
  clase integer DEFAULT 1,
  plan integer DEFAULT 1,
  plantilla character varying(15) DEFAULT 'WAYPOINT'::character varying,
  facturable integer DEFAULT 1,
  toolkit integer DEFAULT 0,
  propietario integer DEFAULT 0,
  creacion timestamp without time zone DEFAULT now(),
  codelco boolean NOT NULL DEFAULT false,
  familia integer DEFAULT 0,
  enabled_machines boolean DEFAULT false,
  enabled_canbus boolean DEFAULT false,
  enabled_horometro boolean DEFAULT false,
  enabled_comap boolean DEFAULT false,
  enabled_frio boolean DEFAULT false,
  enabled_panico boolean DEFAULT false,
  enabled_puerta boolean DEFAULT false,
  enabled_rpm boolean DEFAULT false,
  enabled_supervisor integer DEFAULT 0,
  demo boolean,
  interno boolean,
  mqtt_enable boolean NOT NULL DEFAULT false,
  topicos character varying(20)[],
  CONSTRAINT pk_cliente PRIMARY KEY (rut),
  CONSTRAINT fk_cliente_familiaid FOREIGN KEY (familia)
      REFERENCES cliente_familia (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT pk_pais FOREIGN KEY (codigo_pais)
      REFERENCES pais (codigo) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT unique_id_cliente UNIQUE (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE cliente
  OWNER TO waypoint;
GRANT ALL ON TABLE cliente TO waypoint;
GRANT ALL ON TABLE cliente TO waypointtx;
GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE cliente TO waypointtomcat;
GRANT SELECT ON TABLE cliente TO waypointphp;
GRANT SELECT ON TABLE cliente TO waypointpphppublic;
GRANT ALL ON TABLE cliente TO waypointsoporte;
GRANT SELECT, INSERT ON TABLE cliente TO waypointsalesforce;
GRANT SELECT ON TABLE cliente TO waypointadminuser;
GRANT SELECT ON TABLE cliente TO waypointagenda;
GRANT SELECT ON TABLE cliente TO waypointmachines;
GRANT SELECT ON TABLE cliente TO waypointreports;
GRANT SELECT ON TABLE cliente TO readonly;

CREATE INDEX index_cliente
  ON cliente
  USING btree
  (rut COLLATE pg_catalog."default");

CREATE INDEX index_cliente_activo
  ON cliente
  USING btree
  (activo);

CREATE INDEX index_cliente_id_activo
  ON cliente
  USING btree
  (id, activo);

CREATE INDEX index_cliente_rut_activo
  ON cliente
  USING btree
  (rut COLLATE pg_catalog."default", activo);


CREATE TRIGGER trigger_default_admin
  AFTER INSERT
  ON cliente
  FOR EACH ROW
  EXECUTE PROCEDURE crea_default_admin();

CREATE TRIGGER trigger_default_grupo
  AFTER INSERT
  ON cliente
  FOR EACH ROW
  EXECUTE PROCEDURE crea_default_clientegrupo();  

আমি কি চুক্তি, ট্রিগার বা অন্য কিছু অক্ষম করব?

সম্ভবত কোনও ডিবি টিউনিং?

আরও বিশ্লেষণের জন্য আমার আর কী সরবরাহ করা উচিত?

সংস্করণ: x86_64- অজানা-লিনাক্স-গ্নুতে পোস্টগ্রিজ এসকিউএল 9.4.5, জিসিসি দ্বারা সংকলিত (দেবিয়ান 4.9.2-10) 4.9.2, 64-বিট


যতক্ষণ ডিডিএল স্টেটমেন্ট চলছে ততক্ষণ টেবিলটি লক হয়ে গেছে এবং অ্যাক্সেস করা যায় না। এটি সম্পর্কে আপনি কিছু করতে পারবেন না।
a_horse_with_no_name

ভাল, প্রত্যাশিত হিসাবে ভাল না, কিন্তু একেবারে বোধগম্য;)
গঞ্জালো ভাস্কেজ

উত্তর:


8

ডিডিএল অপারেশনগুলি সাধারণত তারা যে বস্তুটির উপরে কাজ করে তা লক করে রাখে, তাই পরিকল্পনা করা রক্ষণাবেক্ষণ উইন্ডোর বাইরে সঞ্চালন করা উচিত নয় (যখন আপনার ব্যবহারকারীরা ব্যাহত হওয়ার প্রত্যাশা করছেন বা একটি পরিকল্পিত সময়ের জন্য সিস্টেমটি সম্পূর্ণ অফলাইন থাকবে) - আপনি যা করতে পারেন কিছুই নেই is এই সম্পর্কে সহজেই 1

কিছু ক্রিয়াকলাপ কেবল একটি রাইটিং লক রাখে, সুতরাং আপনার অ্যাপ্লিকেশনটি কেবল আক্রান্ত সামগ্রীগুলি পড়ার অনুরোধগুলি সরবরাহ করতে পারে।

ডিডিএল ক্রিয়াকলাপগুলি কী কী লকগুলি ধারণ করে তা তালিকাভুক্ত করার জন্য ডকুমেন্টেশনটি বেশ ভাল দেখাচ্ছে।

এই ব্লগ এন্ট্রিটির একটি সংক্ষিপ্তসার রয়েছে যা কলামটি যুক্ত করার সাথে সাথে কলাম যুক্ত করা একটি অনলাইন ক্রিয়াকলাপ হতে পারে এবং যদি কোনও ডিফল্ট মান বা অনন্য বাধা না থাকে তবে এটি সূচিত করে যে আপনার বক্তব্যটি লক ছাড়াই চালানো উচিত ছিল (আইআইআরসি পোস্টগ্রিস হিসাবে যদি আপনি অন্যথায় স্পষ্টভাবে না বলে) কলামগুলি ন্যুয়ালযোগ্য হিসাবে ডিফল্ট হয়েছে) আপনি অ্যাড কলামের পরে অন্য কোনও ক্রিয়াকলাপ চালিয়েছেন? সম্ভবত এটির উপরে একটি সূচক তৈরি করা (যা টেবিলে একটি ডিফল্টরূপে লেখার লক নিতে পারে)?

1 কিছু প্রতিলিপি / গুচ্ছকরণ / মিররিংয়ের ব্যবস্থা আপনাকে একটি আয়না আপডেট করার অনুমতি দেয় (পরিবর্তনের সময় এটিতে আপডেটগুলি বিরতি দেয় এবং সেগুলি পুনরায় খেলতে পারে), সেই অনুলিপিটিকে সরাসরি একটি হিসাবে ব্যবহার করতে স্যুইচ করুন, এবং প্রতিটি অনুলিপি আপডেট না হওয়া অবধি, তাই ডাউনটাইম সীমাবদ্ধ সময়ের মধ্যে রয়েছে ডিডিএল অপারেশন চলাকালীন পরিবর্তনগুলি পুনরায় খেলতে। এর মতো লাইভ অপারেশনগুলি ঝুঁকিবিহীন নয়, সুতরাং আপনি যদি এটি একেবারে না করতে পারেন তবে আপনার পরিবর্তে কাঠামোগত আপডেটগুলি সম্পাদন এবং যাচাই করার জন্য উপযুক্ত রক্ষণাবেক্ষণ উইন্ডোর ব্যবস্থা করুন arrange


35

আপনি যে কমান্ডটি চালাতে চান তা টেবিলটিতে একটি অ্যাক্সেস এক্সক্লুসিভ লক লাগবে, সেই টেবিলে অন্য সমস্ত অ্যাক্সেস আটকাবে। তবে এই লকের সময়কাল মাত্র কয়েক মিলিসেকেন্ড হওয়া উচিত, আপনি যেমনটি যুক্ত করতে চান তার মতো কলাম যুক্ত করার জন্য সারণীটি পুনরায় লেখার প্রয়োজন হয় না, কেবল মেটাডেটা আপডেট হওয়া দরকার।

যেখানে সমস্যাটি আসতে পারে এবং আমি ডোন্টকে ডলার দেওয়ার জন্য বাজি ধরছি যে এটি আপনি যে সমস্যাটি দেখছেন তা লক অগ্রাধিকারের মধ্যে রয়েছে। কারও কাছে এই টেবিলে অ্যাকসেস শেয়ার লক এর মতো একটি দুর্বল লক রয়েছে এবং তারা অনির্দিষ্টকালের জন্য এটির উপর শিবির স্থাপন করছে (সম্ভবত একটি নিষ্ক্রিয়-লেনদেন সংযোগ যা ফাঁস হয়েছে? কেউ যদি পিএসএইচএল খুলেছে, পুনরাবৃত্তিযোগ্য পঠন মোডে একটি কোয়েরি শুরু করেছে, এবং তারপরে ছুটিতে গেল?)।

সংযোজন করা কলমটি প্রয়োজনমতো অ্যাক্সেস এক্সক্লুসিভ নেওয়ার চেষ্টা করে এবং এটি প্রথম লকের পিছনে সারি করে।

এখন ভবিষ্যতের সমস্ত লক অনুরোধ প্রত্যাশিত অ্যাক্সেস এক্সক্লুসিভ অনুরোধের পিছনে সারি রেখেছে।

স্বতঃস্ফূর্তভাবে, আগত লক অনুরোধগুলি যা ইতিমধ্যে মঞ্জুর করা লকের সাথে সামঞ্জস্যপূর্ণ তা অপেক্ষার অ্যাক্সেস এক্সক্লুসিভের উপর দিয়ে লাফিয়ে উঠতে পারে এবং পাল্টে দেওয়া যায়, তবে পোস্টগ্র্রেএসকিউএল এটি করে না।

দীর্ঘস্থায়ী দুর্বল লকটি ধারণ করে এমন প্রক্রিয়াটি আপনাকে খুঁজে বের করতে হবে।

আপনি পিজি_লোকস টেবিলটি জিজ্ঞাসা করে এটি করতে পারেন।

select * from pg_locks where 
    granted and relation = 'cliente'::regclass \x\g\x

যদি সবকিছু লক হয়ে যাওয়ার সময়ে আপনি এটি করেন তবে আপনার কেবলমাত্র একটি উত্তর পাওয়া উচিত (যদি না একাধিক দীর্ঘস্থায়ী অপরাধী থাকে)। আপনি যদি ইতিমধ্যে কলাম যুক্ত করার পরে এটি করেন, তবে আপনি প্রচুর পরিমাণে অনুমোদিত লক দেখতে পাবেন, তবে আপনি যদি কয়েকবার পুনরাবৃত্তি করেন তবে প্রতিবারের চারপাশে থাকা এক বা কয়েকজন থাকতে হবে।

তারপরে আপনি পিজি_লক থেকে যে পিআইডি পেয়েছিলেন তা নিতে পারেন এবং অপরাধী কী করছে তা দেখার জন্য pg_stat_activity তে এর সাথে জিজ্ঞাসা করতে পারেন:

select * from pg_stat_activity where pid=28731 \x\g\x

...

backend_start    | 2016-03-22 13:08:30.849405-07
xact_start       | 2016-03-22 13:08:36.797703-07
query_start      | 2016-03-22 13:08:36.799021-07
state_change     | 2016-03-22 13:08:36.824369-07
waiting          | f
state            | idle in transaction
backend_xid      |
backend_xmin     |
query            | select * from cliente limit 4;

সুতরাং, এটি একটি লেনদেনের ভিতরে একটি ক্যোয়ারী চালিয়েছিল এবং তারপরে লেনদেনটি কখনও বন্ধ না করেই অলস হয়ে যায়। এটি এখন 13:13, সুতরাং তারা 5 মিনিটের জন্য অলস থাকে।


6
এই উত্তরটি আমার জীবন রক্ষা করেছিল
মহেন্দ্র

1
আমারও সংরক্ষণ করা হয়েছে, অংশটি lock prioritiesখুব ভাল ছিল, কারণ আমি অন্যান্য জায়গায় সে সম্পর্কে পড়িনি, ধন্যবাদ!
এডসন হোরাসিও জুনিয়র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.