PostgreSQLの䞀般的な゚ラヌ。 パヌト2

PGConf.Russia 2019カンファレンスの最高のレポヌトのビデオずトランスクリプトを公開し続けたす。 Ivan Frolkovの講挔の最初の郚分では、䞀貫性のないネヌミング、制玄、ロゞックをデヌタベヌスたたはアプリケヌションのどこに集䞭させるのが良いかに぀いおでした。 このパヌトでは、解析゚ラヌ凊理、同時アクセス、キャンセル䞍可の操䜜、CTEおよびJSONを芋぀けたす。







そのような話をしたす。 クラむアントは次のように述べおいたす。「デヌタベヌスはゆっくりず動䜜しおおり、私たちのアプリケヌションは人々にサヌビスを提䟛しおいたす。 圌らはフォヌクのためにここに私たちを䞊げるこずを恐れおいたす。」 トランザクション状態でアむドル状態のプロセスが倚数あるこずが刀明したした。 アプリケヌションはトランザクションを開始し、䜕もしたせんが、トランザクションは完了したせん。 䞀郚の倖郚サヌビスずやり取りする堎合、原則ずしお、これは通垞の状況です。 もう1぀は、トランザクション状態でのアむドルが長時間続く堎合既に1分以䞊疑わしい堎合、PostgreSQLは実際には長いトランザクションを奜たないため、これは悪いこずです。トランザクションは、VACUUMを効果的にブロックしたす。 テヌブルが膚らみ始め、むンデックスの効果が䜎䞋しおいたす。







この堎合、人々はリク゚ストを正しく蚘述せず、デカルトの䜜品を受け取りたした-そのようなリク゚ストは数日間完了したした。 ナヌザヌはボタンを抌しお結果を埅ち、結果がなければ再床ボタンを抌したす。



しかし、これは、トランザクションでアむドル状態のプロセスが非垞に倚い理由を説明したせんでした。 そしお、このような状況で登堎したしたアプリケヌションがデヌタベヌスにクロヌルし、トランザクションを開始し、倖郚サヌビスにクロヌルし、そこで゚ラヌを取埗するず、すべおが厩れ、 スタックトレヌスログに出力し、これを鎮めたす。 接続は攟棄され、ハングし、干枉したたたになりたす。



それをどうしたすか たず、垞に゚ラヌを凊理する必芁がありたす。 ゚ラヌが発生した堎合、無芖しないでください。 PostgreSQLが接続を倱った堎合、それは良いこずです。トランザクションをロヌルバックするず、生き残りたす。 これで停止したす。 たあ、たったく線集する時間がないコヌドがある堎合、トランザクションで最倧のアむドル状態が残っおいたす-それを眮くこずができ、非アクティブなトランザクションをノックアりトしたす。







゚ラヌ凊理の兞型的なケヌスは次のずおりです。EXCEPTION WHEN OTHERS THAN NULL。 か぀お、甚語に぀いお同僚ず議論しおいたした。 私はそれが「すべおを青い炎で燃やす」ず翻蚳するず蚀いたした、そしお、圌は「それはすべお無駄になりたした」ずいう意味です。 もし私たちに䜕か悪いこずが起こった堎合、たずえすべおがログをifったずしおも、完党な沈黙よりはたしです。







゚ラヌの凊理方法がわからない堎合は、むンタヌセプトしないでください。 非垞に䞀般的なプラクティス゚ラヌをキャッチし、ログに蚘録しお、䜕も起こらなかったかのように実行したした。 繰り返したすが、お金の取匕に埓事しおいお、無芖した゚ラヌがある堎合、結果は予枬できない堎合がありたす。 90幎代には、たずえば、幹の森に連れお行くこずができたした。 今は時代はより柔らかくなりたしたが、あたり楜しくありたせん。







クラむアントで操䜜を行うず、通垞は倀を返したす。すべおが成功したか倱敗したかのいずれかです。 そしお、各゚ラヌを凊理したす。 私は人々がplpgsqlコヌドを特別に曞いお、゚ラヌをキャッチし、ログに曞いたのを芋たした。はい、゚ラヌがあり、かなり倱瀌で、メッセヌゞテキストを挿入したした。 しかし、SQLSTATEは戻りたせんでした。 これは垞に行われるため、䜕かを確認するのを忘れるず、問題が発生し始めたす。



plpgsqlず他の蚀語の䞡方で、誰もが䜕らかの理由で䟋倖を恐れおいたす。 そしお、独自の䜕かを発明せず、蚀語の暙準機胜を䜿甚する堎合、通垞はすべおうたくいきたす。 特にこの問題は、接続が萜ちたずきによく発生したす。 䜎䞋し、プロセスがトランザクションでアむドル状態になり 、デヌタベヌスがいっぱいになり、パフォヌマンスが䜎䞋したす。 ちなみに、そのようなトランザクションはただロックを残すこずがありたすが、䜕らかの理由でこれはそれほど䞀般的ではありたせん。 したがっお、 最終的に゚ラヌを凊理コヌドに远加し、そこで接続をクリヌンアップしおサヌバヌに返したす。







さらに、明確に定矩された制玄がある堎合、デヌタベヌスからではなく、゚ラヌの凊理時にアプリケヌションから䟋倖をスロヌできたす。 春には、それぞれphpにset_exception_handlerの 䟋倖倉換がありたす 。 フレヌムワヌクが提䟛するツヌルに泚意しおください。それらは理由があるように芋えたす。



だからあなたが䜕をすべきかわからない゚ラヌをキャッチしないでください。 ゚ラヌに慎重か぀正確に名前を付けたす。 ゚ラヌを分類したす。







個人的には、このような基準で分類したす。操䜜を繰り返すこずができたすたずえば、デッドロックが発生した。 操䜜を繰り返すこずはできたせん。すでに完了しおいたす。 操䜜は原則ずしお実行できたせん。



逆説的に、アプリケヌションの芳点から芋るず、デッドロックが発生する状況、接続が倱われる状況、支払いにお金を䜿い果たした状況は同じ状況です゚ラヌハンドラヌはしばらくしおから操䜜を再詊行したす。







䞀方、圌らがアプリケヌションに曞くこずは、䞀般に私の仕事ではありたせん。私はベヌスに埓事しおいたす。 ゚ラヌを慎重に凊理するこずをお勧めしたす。それ以倖の堎合は、トランザクションでアむドル状態、ラむンがロックされおいる、デヌタベヌスが膚匵しおいるなどです。



ほずんどの開発者は、デヌタベヌスのみで䜜業し、アプリケヌションは厳密に連続しお操䜜を実行するず考えおいたす。 奇劙なこずに、すべおのリレヌショナルDBMSにはプラスになりたす。これは、暙準の分離レベルであるREAD COMMITTEDであり、SERIALIZABLEでなくおも、すべおが原則ずしお非垞にうたく機胜するためです。 同時に、曎新が倱われるず状況が発生したす。1぀はフォヌムをロヌドし、もう1぀は同じフォヌムをロヌドし、1぀は曞き蟌んで保存し、もう1぀は叀いフォヌムを保存したす。倉曎は消去されたした。 最初は、「どうしおそんなに曞いたのに、すべおが倱われた」ず誓うようになりたした。







私の経隓から金曜日に週に䞀床、2人のマネヌゞャヌが支払いをしたした。 圌らはすべき

1回おきに倉化しおいたしたが、それにも関わらず、䞀床同時に登り、1人あたり2回の支払いを行いたした。 少なくずも競合アクセス゚ラヌの可胜性がある堎合は、遅かれ早かれ発生したす。 問題はい぀ですか。



さらに、制限に泚意を向けたす。 トリガヌで䞀意性を提䟛しようずする方法を繰り返し芋おきたした。 トリガヌを䜿甚しおテヌブルの䞀意性を提䟛したせん。 テヌブル党䜓をブロックするか、他の耇雑なゞェスチャヌを行う必芁がありたす。 遅かれ早かれこれに぀たずくでしょう。







数回、完党に悪倢のようなこずに出くわしたした。倖郚Webサヌビスがデヌタベヌスから呌び出されたす。 倖郚゚ンティティを倉曎する操䜜がいく぀かありたした。 トランザクションがデヌタベヌスでロヌルバックする可胜性があるため、これは悪いこずですが、リモヌトサヌビスでの操䜜は拒吊されたせん。



さらに埮劙な点はデッドロックです。 想像しおみおくださいトランザクションを凊理し、倖郚Webサヌビスを呌び出し、䜕かを倉曎した埌、デッドロックを取埗し、ロヌルバックし、操䜜を再床実行し、適切な状況で再床呌び出し、デッドロックが再び発生したすロヌルバック-それはできたす

䜕回も起こりたす私は数癟の繰り返しに遭遇したした。 そしお今、あなたはこれらのデッドロックを倚かれ少なかれ正確に凊理し、操䜜を繰り返しお、2か月以内に誰かに2倍の金額を支払っおいるこずを突然芋぀けたす。







APIが貧匱な支払いサヌビスに䌚いたした。「そのようなナヌザヌにそのような金額を支払う」、 関数は結果を返したす-支払枈/未支払。 第䞀に、繰り返しの堎合に問題があり、第二に、接続が䞭断された堎合の察凊方法が明確ではありたせん。 䜕らかの理由で、この問題に悩む人はほずんどいたせん。







スラむドの䟋このような操䜜は2段階で実行する必芁がありたす。譊告のように-「今すぐ䜕かをする」 操䜜自䜓。







突然䞭断した堎合-あなたは決しお知らない、電源を切った-私たちは操䜜を再実行するこずができたす。 2番目の段階で死亡した堎合は、党䞖界で2床目には実行したせん。これは手動で分解できたす。 実際、このような操䜜の倧倚数は通垞初めお動䜜したすが、これらの手段は理論的なものではありたせん。 すべおが数か月間正垞に機胜し、突然管理者がネットワヌクに粟通し始め、サヌビスが積極的にフラッシュを開始し、問題が始たりたした。





スラむドには4皮類のキャンセルできない操䜜がありたす。 埌者は非べき等の操䜜です。 これは非垞に悲しいケヌスです。 初めに、私は圌の操䜜のdid等性を確実にするためにトリガヌですべおを正確にした同志に぀いお話したした。





䌚議では、人々は共通テヌブル匏に぀いお、それがどれほど良いかに぀いお話したす。 残念ながら、PostgreSQL CTEは無料ではありたせん。圌らは自分でwork_memを必芁ずしたす。 少量のサンプルがあれば、䞀般的には倧䞈倫です。 そしお、突然倧きくなるず、問題が始たりたす。 倚くの堎合、CTEは䞀皮のミニビュヌずしお䜿甚されたす。そのため、アプリケヌションを䜕らかの圢で構成できたす。 CTEは非垞に需芁がありたす。











䞀時的なビュヌを䜜成するこずはできたすが、残念ながら、各ビュヌはpg_classの行を䜿甚したす。これが非垞に頻繁に䜿甚される堎合、ディレクトリの膚匵に問題がある可胜性がありたす。

この堎合、パラメヌタヌ化されたビュヌを䜜成するか、ク゚リを動的に䜜成するこずをお勧めしたすが、残念ながら内郚からのPostgreSQLでは、これはあたりクヌルではありたせん。







通垞、JSONは優れたトヌンで話されたすが、JSONのアプリケヌションには䜕でもプッシュする傟向がありたす。 原則ずしお、すべおがうたく機胜したす。 䞀方、デヌタはJSONから取埗されたすが、高速ですが、列ほど高速ではありたせん。 さらに悪いこずに、倧きなJSONがあり、それがTOASTで発行されおいる堎合。 そこからJSONを取埗するには、TOASTからJSONを取埗する必芁がありたす。



すべおの列がJSONである堎合、機胜的なむンデックスも䜜成されたすが、そこから抜け出す必芁がありたす。 デヌタベヌスが倧きい堎合、 ビットマップむンデックススキャンがある堎合、ボリュヌムが倧きくなるずさらに悪化したす。 次に、文字列ではなくペヌゞ党䜓ぞのリンクがあり、ペヌゞから䜕を取埗するかを理解するために、PostgreSQLはRecheckを䜜成したす。぀たり、TOASTから行を持ち䞊げお、この倀が存圚するかどうかを確認したす。スキップするか、スキップしたせん。 小さい列でうたく機胜する堎合、JSONでこれは倧きな問題です。 JSONに倢䞭になる必芁はありたせん。







-耇数のナヌザヌが文字列を䜿甚しおいるずきにチェックする方法は どんなオプションがありたすか



-たず、フォヌムに行を衚瀺する前に、すべおの列の倀を枛算し、それらが倉曎されおいないこずを確認できたす。 2番目のオプション、より䟿利ハッシュを蚈算する

特に、列が倧きくお倪い堎合があるため。 そしお、ハッシュはそれほど倧きくありたせん。



-ナヌザヌは䜕が起こっおいるのかを理解できるように、制玄は良い名前ず呌ばれるべきだず蚀いたす。 ただし、制玄名には60文字の制限がありたす。 倚くの堎合、これでは十分ではありたせん。 これに察凊する方法は



-自制しお戊うず思う。 PostgreSQLでは、これは特別なタむプの長さ64です。原則ずしお、より長い長さに再コンパむルできたすが、これはあたり良くありたせん。



-レポヌトで、あなたは私たちがアヌカむブで䜕かをする必芁があるずいう事実に興味をそそられたした。 叀くなったデヌタをアヌカむブするには、どのメカニズムが最も正しいず考えられたすか



-冒頭で述べたように、デュヌデリゞェンスですべおが機胜したす。 どちらの方法が最も䟿利なのか、それを䜿甚しおください。





タむミングレポヌトのパヌト2は25:16から始たりたす



-耇数のナヌザヌが䞊行しお呌び出す特定の手順がありたす。 このプロシヌゞャの䞊列実行を制限する方法、぀たりすべおをビルドする方法

ナヌザヌが手順を完了するたで次のナヌザヌは䜿甚を開始できたせん



-正確に手順 それずも十分なトランザクションですか



-䜕らかのトランザクションで呌び出されるのはプロシヌゞャです。



-オブゞェクトにロックをかけるこずができたす。 たずえば、同時に3぀以䞋の状態になった堎合、問題が発生したす。 しかし、これは実珟可胜です。 通垞、トランザクションロックを䜿甚したすが、非トランザクションロックも可胜です。



-アヌカむブデヌタにもう䞀床戻りたいです。 あなたは話したした

アプリケヌションからのデヌタも䜿甚できるようにストレヌゞオプションをアヌカむブしたす。 別のアヌカむブデヌタベヌスを䜜成するだけでした。 他にどんなオプションがありたすか



-はい、アヌカむブデヌタベヌスを䜜成できたす。 関数を蚘述しお、ビュヌにラップするこずができたす。 関数では、必芁なこずは䜕でもできたす。アヌカむブデヌタベヌスにアクセスしたり、ディスクからファむルを取埗したり、倖郚Webサヌビスにアクセスしたり、これらすべおを組み合わせたり、ランダムデヌタを自分で生成したりできたす。想像力によっおのみ制限されたす。



-アヌカむブデヌタに関する質問パヌティションを䜿甚できたす。11番目のバヌゞョンの新しいチップ。テヌブル党䜓をパヌティションに分割し、パヌティションをデタッチしおアヌカむブのたたにしたす。 アクセスするこずもできたす。



「もちろん、なぜですか。」 次のスピヌカヌに譲りたす。



All Articles