Sie fragen sich, wie man Sperren in Amazon Redshift erkennt und freigibt? Wir können Ihnen helfen. Im Allgemeinen können wir auf ein Problem stoßen, bei dem die Tabellensperre die Abfragen in Amazon Redshift blockiert. Hier bei Bobcares unterstützen wir unsere Kunden mit verschiedenen AWS-Abfragen als Teil unserer AWS Support Services.

Heute wollen wir sehen, wie man dieses Problem findet und löst. Sperren in Amazon Redshift erkennen und freigeben Sperren sind ein Schutzmechanismus, der steuert, wie viele Sitzungen gleichzeitig auf eine Tabelle zugreifen können. Darüber hinaus bestimmt er die Operationen, die in diesen Sitzungen durchgeführt werden. Während die meisten relationalen Datenbanken Sperren auf Zeilenebene verwenden, verwendet Amazon Redshift Sperren auf Tabellenebene. Im Allgemeinen verfügt Amazon Redshift über drei Sperrmodi.

Diese sind: AccessExclusiveLock AccessShareLock ShareRowExclusiveLock Wenn eine Abfrage oder Transaktion eine Sperre für eine Tabelle erwirbt, bleibt diese für die Dauer der Abfrage oder Transaktion bestehen. Andere Abfragen oder Transaktionen, die darauf warten, die gleiche Sperre zu erhalten, werden jedoch blockiert. Angenommen, wir haben ein Problem mit den Sperren. In einem solchen Fall müssen wir die Sitzung (PID) identifizieren, die die Sperre hält, und dann die Sitzung beenden.

Wenn die Sitzung nicht beendet werden kann, müssen wir den Cluster neu starten. Wie kann man das beheben? Schauen wir uns nun an, wie unsere Support-Techniker die Sitzung identifizieren und beenden. Zunächst führen wir eine Abfrage aus, um Sitzungen zu identifizieren, die Sperren halten: select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c./name/),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())//86400|| days ||datediff(s,a.txn_start,getdate())400//3600|| hrs ||datediff(s,a.txn_start,getdate())600//60|| mins ||datediff(s,a.txn_start,getdate())`|| secs as txn_durationfrom svv_transactions aleft join (select pid,relation,granted from pg_locks group by 1,2,3) bon a.relation=b.relation und a.granted=f und b.granted=tleft join (select * from stv_tbl_perm where slice=0) con a.relation=c.idleft join pg_class d on a.relation=d.oidwhere a.relation is not null; Dies führt zu einer Ausgabe wie dieser: txn_owner | txn_db | xid | pid | txn_start | lock_mode | table_id | tablename | granted | blocking_pid | txn_duration |----------+--------+---------+-------+----------------------------+---------------------+----------+-----------+---------+--------------+-----------------------------+usr1 | db1 | 5559898 | 19813 | 2018-06-30 10:51:57.485722 | AccessExclusiveLock | 351959 | lineorder | t | | 0 days 0 hrs 0 mins 52 secs |usr1 | db1 | 5559927 | 20450 | 2018-06-30 10:52:19.761199 | AccessShareLock | 351959 | lineorder | f | 19813 | 0 days 0 hrs 0 mins 30 secs |usr1 | db1 | 5559898 | 19813 | 2018-06-30 10:51:57.485722 | AccessShareLock | 351959 | lineorder | t | | 0 days 0 hrs 0 mins 52 secs | Hier sehen wir eine Spalte granted.

Wenn sie f (false) ist, bedeutet dies, dass eine Transaktion in einer anderen Sitzung die Sperre hält. Die Spalte blocking_pid zeigt die Prozess-ID der Sitzung an, Erkennen und Freigeben von Sperren in Amazon Redshift - Wie wir es machen die Sperre hält.

Erkennen und Freigeben von Sperren in Amazon Redshift - Wie wir es machen

Um eine Sperre freizugeben, warten wir, bis die Transaktion, die die Sperre hält, beendet ist. Um die Sitzung manuell zu beenden, führen Sie den folgenden Befehl aus: select pg_terminate_backend(PID); Wenn wir eine PID beenden, werden alle laufenden Transaktionen zurückgesetzt und alle Sperren in der Sitzung freigegeben.

Andere Transaktionen, die darauf warten, die Sperre zu erhalten, beanspruchen dann diese Sperren. Wir müssen auch beachten, dass, wenn PG_TERMINATE_BACKEND(PID) 1 zurückgibt, dies eine erfolgreiche Beendigungsanfrage an die PID anzeigt. Dies ist jedoch keine vollständige Garantie für die Beendigung. In einigen wenigen Fällen können wir die PID nicht anhand ihres internen Status bestimmen. Daher ist es am besten, auch STV_SESSIONS zu prüfen, um die Beendigung zu bestätigen.

Wenn PG_TERMINATE_BACKEND(PID) den Prozess nicht erfolgreich beendet hat, müssen wir den Cluster neu starten, um den Prozess zu beenden. Fazit Kurz gesagt, wir haben gesehen, wie unsere Support-Techniker bei der Erkennung und Freigabe von Sperren in Amazon Redshift vorgehen.


19 1 28