ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ Ρ€Π°Π±ΠΎΡ‚Π°. ΠšΡƒΡ€Ρ: «АдминистрированиС Π‘Π£Π‘Π” TantorΒ»

ОглавлСниС

Π Π°Π·Π΄Π΅Π» 1. Установка Π‘Π£Π‘Π” Tantor        7

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ кластСра        7

Π§Π°ΡΡ‚ΡŒ 2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ кластСра ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ initdb        10

Π§Π°ΡΡ‚ΡŒ 3. Π Π΅ΠΆΠΈΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ        15

Π§Π°ΡΡ‚ΡŒ 4.  ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² экзСмпляру Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС        16

Π§Π°ΡΡ‚ΡŒ 5. Локализация        16

Π§Π°ΡΡ‚ΡŒ 6. ΠžΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ        17

Π§Π°ΡΡ‚ΡŒ 7. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ управлСния        19

Π§Π°ΡΡ‚ΡŒ 8. Настройка Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° psql        20

Π§Π°ΡΡ‚ΡŒ 9. ИспользованиС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° psql        25

Π§Π°ΡΡ‚ΡŒ 10. ВосстановлСниС сохранСнного кластСра        34

Π Π°Π·Π΄Π΅Π» 2. АрхитСктура        35

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° памяти        35

Π§Π°ΡΡ‚ΡŒ 1. Вранзакция Π² psql        35

Π§Π°ΡΡ‚ΡŒ 2. Бписок Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… процСссов        36

Π§Π°ΡΡ‚ΡŒ 3. Π‘ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ кэш, ΠΊΠΎΠΌΠ°Π½Π΄Π° EXPLAIN        38

Π§Π°ΡΡ‚ΡŒ 4. Π–ΡƒΡ€Π½Π°Π» прСдзаписи. Π“Π΄Π΅ хранится?        38

Π§Π°ΡΡ‚ΡŒ 5. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°        39

Π§Π°ΡΡ‚ΡŒ 6. ВосстановлСниС послС сбоя        40

ΠœΠ½ΠΎΠ³ΠΎΠ²Π΅Ρ€ΡΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ        41

Π§Π°ΡΡ‚ΡŒ 1. Вставка, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ строки        41

Π§Π°ΡΡ‚ΡŒ 2. Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ вСрсии строки Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях изоляции        43

Π§Π°ΡΡ‚ΡŒ 3. БостояниС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎ CLOG        45

Π§Π°ΡΡ‚ΡŒ 4. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹        47

Π§Π°ΡΡ‚ΡŒ 5. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° строки        48

Π Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹        50

Π§Π°ΡΡ‚ΡŒ 1. ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ очистка Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹        50

Π§Π°ΡΡ‚ΡŒ 2. Анализ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹        53

Π§Π°ΡΡ‚ΡŒ 3. ΠŸΠ΅Ρ€Π΅ΡΡ‚Ρ€ΠΎΠΉΠΊΠ° индСкса        53

Π§Π°ΡΡ‚ΡŒ 4. Полная очистка        54

Π§Π°ΡΡ‚ΡŒ 5. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ HypoPG        54

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запросов        59

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для запросов        59

Π§Π°ΡΡ‚ΡŒ 2. Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ        59

Π§Π°ΡΡ‚ΡŒ 3. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ индСксу        60

Π§Π°ΡΡ‚ΡŒ 4. Низкая ΡΠ΅Π»Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ        61

Π§Π°ΡΡ‚ΡŒ 5. ИспользованиС статистики        62

Π§Π°ΡΡ‚ΡŒ 6. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ pg_stat_statements        62

Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ        65

Π§Π°ΡΡ‚ΡŒ 1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ        65

Π§Π°ΡΡ‚ΡŒ 2. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ        66

Π§Π°ΡΡ‚ΡŒ 3. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ доступных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ        66

Π§Π°ΡΡ‚ΡŒ 4. Установка ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ обновлСния        67

Π§Π°ΡΡ‚ΡŒ 5. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ доступных вСрсий Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. ОбновлСниС Π΄ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии        67

Π§Π°ΡΡ‚ΡŒ 6. ΠžΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…        69

Π Π°Π·Π΄Π΅Π» 3. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅        73

Π§Π°ΡΡ‚ΡŒ 1. ΠžΠ±Π·ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ        73

Π§Π°ΡΡ‚ΡŒ 2. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ измСрСния        81

Π§Π°ΡΡ‚ΡŒ 3. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ логичСского Ρ‚ΠΈΠΏΠ°        83

Π§Π°ΡΡ‚ΡŒ 4. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹        85

Π§Π°ΡΡ‚ΡŒ 5. Π€Π°ΠΉΠ» слуТб        90

Π Π°Π·Π΄Π΅Π» 4. Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…        92

ЛогичСская структура кластСра        92

1. Установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях        92

2. Установка ΠΏΡƒΡ‚ΠΈ поиска Π² функциях ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…        92

Π§Π°ΡΡ‚ΡŒ 1. Установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях        92

Π§Π°ΡΡ‚ΡŒ 2. Установка ΠΏΡƒΡ‚ΠΈ поиска Π² функциях ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…        102

ЀизичСская структура кластСра        105

5. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_repack        105

6. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pgcompacttable        105

7. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ORC (ΠšΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Citus columnar)        105

a. Установка ΠΈ использованиС        105

b. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сТатия        105

c. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ        105

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…        105

Π§Π°ΡΡ‚ΡŒ 2. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства        108

Π§Π°ΡΡ‚ΡŒ 3. Π€Π°ΠΉΠ» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Β«ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΒ»        112

Π§Π°ΡΡ‚ΡŒ 4. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство        114

Π§Π°ΡΡ‚ΡŒ 5. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_repack        116

Π§Π°ΡΡ‚ΡŒ 6. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pgcompacttable        117

Π§Π°ΡΡ‚ΡŒ 7. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ORC (ΠšΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Citus columnar)        121

Π§Π°ΡΡ‚ΡŒ 7a. Установка ΠΈ использованиС        121

Π§Π°ΡΡ‚ΡŒ 7b. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сТатия        124

Π§Π°ΡΡ‚ΡŒ 7c. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ        126

Π Π°Π·Π΄Π΅Π» 5. Π–ΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅        132

Π–ΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅        132

Π§Π°ΡΡ‚ΡŒ 1. Какая информация ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΆΡƒΡ€Π½Π°Π»        132

Π§Π°ΡΡ‚ΡŒ 2. РасполоТСниС ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² сСрвСра        132

Π§Π°ΡΡ‚ΡŒ 3. Как информация ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΆΡƒΡ€Π½Π°Π»        133

Π§Π°ΡΡ‚ΡŒ 4. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° csv        134

Π§Π°ΡΡ‚ΡŒ 5.  Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π° сообщСний        135

Π Π°Π·Π΄Π΅Π» 6. Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ        136

РолСвая модСль бСзопасности        136

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ        136

Π§Π°ΡΡ‚ΡŒ 2. Установка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²        137

Π§Π°ΡΡ‚ΡŒ 3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ        137

Π§Π°ΡΡ‚ΡŒ 4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ схСмы ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹        138

Π§Π°ΡΡ‚ΡŒ 5. Π’Ρ‹Π΄Π°Ρ‡Π° Ρ€ΠΎΠ»ΠΈ доступа ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅        139

Π§Π°ΡΡ‚ΡŒ 6. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²        141

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ аутСнтификация        142

Π§Π°ΡΡ‚ΡŒ 1. РасполоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ        142

Π§Π°ΡΡ‚ΡŒ 2. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΏΡ€Π°Π²ΠΈΠ» Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ        143

Π§Π°ΡΡ‚ΡŒ 3. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ измСнСния для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ        143

Π§Π°ΡΡ‚ΡŒ 4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° коррСктности настройки        144

Π§Π°ΡΡ‚ΡŒ 5. ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²        145

Π Π°Π·Π΄Π΅Π» 7. Π Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅        146

ЀизичСскоС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅        146

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ кластСра        146

Π§Π°ΡΡ‚ΡŒ 2. Запуск экзСмпляра Π½Π° ΠΊΠΎΠΏΠΈΠΈ кластСра        147

Π§Π°ΡΡ‚ΡŒ 3. Π€Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π°        149

Π§Π°ΡΡ‚ΡŒ 4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° цСлостности Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ        151

Π§Π°ΡΡ‚ΡŒ 5. Богласованная рСзСрвная копия        152

Π§Π°ΡΡ‚ΡŒ 6. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»Π°        154

Π§Π°ΡΡ‚ΡŒ 7. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π° ΠΆΡƒΡ€Π½Π°Π»Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_receivewal        156

Π§Π°ΡΡ‚ΡŒ 8. Бинхронная фиксация Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ pg_receivewal        159

Π§Π°ΡΡ‚ΡŒ 9. ΠœΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ        160

ЛогичСскоС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅        162

Π§Π°ΡΡ‚ΡŒ 1. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_dump        162

Π§Π°ΡΡ‚ΡŒ 2. Π€ΠΎΡ€ΠΌΠ°Ρ‚ custom ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° pg_restore        164

Π§Π°ΡΡ‚ΡŒ 3. Π€ΠΎΡ€ΠΌΠ°Ρ‚ directory        166

Π§Π°ΡΡ‚ΡŒ 4. Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ рСзСрвирования        167

Π§Π°ΡΡ‚ΡŒ 5. Команда COPY        168

Π Π°Π·Π΄Π΅Π» 8. РСпликация        171

ЀизичСская рСпликация        171

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ        171

Π§Π°ΡΡ‚ΡŒ 2. Π‘Π»ΠΎΡ‚Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ        173

Π§Π°ΡΡ‚ΡŒ 3. ИзмСнСниС ΠΈΠΌΠ΅Π½ΠΈ кластСра        174

Π§Π°ΡΡ‚ΡŒ 4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ        177

Π§Π°ΡΡ‚ΡŒ 5. Π’Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° Ρ€ΠΎΠ»ΡŒ мастСра        181

Π§Π°ΡΡ‚ΡŒ 6. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ        185

Π§Π°ΡΡ‚ΡŒ 7. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ        192

Π§Π°ΡΡ‚ΡŒ 8. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи        195

Π§Π°ΡΡ‚ΡŒ 9. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_rewind        199

ЛогичСская рСпликация        205

Π§Π°ΡΡ‚ΡŒ 1. РСпликация Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹        205

Π§Π°ΡΡ‚ΡŒ 2. РСпликация Π±Π΅Π· ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°        212

Π§Π°ΡΡ‚ΡŒ 3. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ        216

Π§Π°ΡΡ‚ΡŒ 4. ДвунаправлСнная рСпликация        219

Π§Π°ΡΡ‚ΡŒ 5. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ подписок ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ        223

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Β«TantorΒ»        225

ΠžΠ±Π·ΠΎΡ€        225

Π§Π°ΡΡ‚ΡŒ 1. Π Π°Π±ΠΎΡ‡ΠΈΠ΅ пространства        225

Π§Π°ΡΡ‚ΡŒ 2. ΠžΠ±Π·ΠΎΡ€ экзСмпляра        225

Π§Π°ΡΡ‚ΡŒ 3. Настройка экзСмпляра        225

Π§Π°ΡΡ‚ΡŒ 4. ΠŸΡ€ΠΎΡ„Π°ΠΉΠ»ΠΈΠ½Π³ запросов        225

Π§Π°ΡΡ‚ΡŒ 5. Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ активности        226

Π§Π°ΡΡ‚ΡŒ 6. Π Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹        226

Π Π°Π·Π΄Π΅Π» 10. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΈ измСнСния Π‘Π£Π‘Π” Tantor ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с PostgreSQL        227

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ orafce        227

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ pg_variables        229

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ page_repair        234

Π§Π°ΡΡ‚ΡŒ 1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ        234

Π§Π°ΡΡ‚ΡŒ 2. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹        235

Π§Π°ΡΡ‚ΡŒ 3. ВосстановлСниС страницы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ page_repair        237

Π§Π°ΡΡ‚ΡŒ 4. ΠžΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ страницы        240

ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ        243

Π§Π°ΡΡ‚ΡŒ 1. Установка Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ· исходных ΠΊΠΎΠ΄ΠΎΠ² Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ pldebugger        243

Π§Π°ΡΡ‚ΡŒ 2. ΠžΡ‚Π»Π°Π΄ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² pgAdmin        247

Π§Π°ΡΡ‚ΡŒ 3. ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² DBeaver        249

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° строк большого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° - StringBuffer        258

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ΠΎ:

ОлСг Иванов, Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ ΠŸΡ€ΠΎΠ½ΡŒΠΊΠΈΠ½, Эмиль Школьник, Π”Π°Ρ€ΡŒΡ ΠœΠΈΡˆΠ°Ρ€ΠΈΠ½Π°, АлСксандр Π“ΠΎΡ€Π±Π°Ρ‡ΡƒΠΊ

!

ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: 30 ΠΌΠ°Ρ 2024 Π³.
По всСм вопросам ΠΈ прСдлоТСниям ΠΊΠ°ΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ обучСния, поТалуйста, ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ: edu@tantorlabs.ru


Π Π°Π·Π΄Π΅Π» 1. Установка Π‘Π£Π‘Π” Tantor

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ кластСра
  2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ кластСра ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ initdb
  3. Π Π΅ΠΆΠΈΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  4. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² экзСмпляру Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС
  5. Локализация
  6. ΠžΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ
  7. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ управлСния
  8. Настройка Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° psql 
  9. ИспользованиС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° psql
  10. ВосстановлСниС сохранСнного кластСра

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ кластСра

1) ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root:

astra@tantor:~$ sudo bash

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ сколько ядСр процСссора доступно Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ):

root@tantor:/home/astra# cat /proc/cpuinfo | grep cores

cpu cores   : 2

cpu cores   : 2

Число строк ΠΏΠΎ числу процСссоров. Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π±Π΅Π· "| grep cores" Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π°ΡŽΡ‚ΡΡ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ядру процСссора.

Бколько ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти имССтся:

root@tantor:/home/astra# cat /proc/meminfo | grep Mem

MemTotal:        8130152 kB

MemFree:         3288668 kB

MemAvailable:    4781360 kB

3) ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС Π‘Π£Π‘Π” Π’Π°Π½Ρ‚ΠΎΡ€ установлСно Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ /opt/tantor/db 

ДирСктория с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ кластСра /var/lib/postgresql.

Π­Ρ‚ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ монтирования, Π½ΠΎ Π² нашСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС эти Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ смонтированы Π² ΠΊΠΎΡ€Π½Π΅ "/". ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ сколько ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ свободного мСста:

root@tantor:/home/astra# df -HT | grep /$

/dev/sda1      ext4           41G   22G   18G  56% /

Π‘Π²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ мСста ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ 18Π“Π±.

4) Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ инсталлятор:

root@tantor:/home/astra# wget https://public.tantorlabs.ru/db_installer.sh

https://public.tantorlabs.ru/db_installer.sh

Resolving public.tantorlabs.ru (public.tantorlabs.ru)... 84.201.157.208

Connecting to public.tantorlabs.ru (public.tantorlabs.ru)|84.201.157.208|:443... connected.

HTTP request sent, awaiting response... 200 OK

Length: 18312 (18K) [application/octet-stream]

Saving to: ‘db_installer.sh’

db_installer.sh               100%[=================================================>]  17,88K  --.-KB/s        in 0s          

 ‘db_installer.sh’ saved [18312/18312]

         5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° исполнСниС скрипта инсталляции:

root@tantor:/home/astra# ls -al db_installer.sh

-rw-r--r-- 1 root root 18353 db_installer.sh

         6) Если Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π° исполнСниС Ρ„Π°ΠΉΠ»Π° Π½Π΅Ρ‚, Ρ‚ΠΎ Π΄Π°ΠΉΡ‚Π΅ ΠΏΡ€Π°Π²Π° Π½Π° исполнСниС:

 root@tantor:/home/astra# chmod +x db_installer.sh

7) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ инсталлятора ΠΈ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

 root@tantor:/home/astra# ./db_installer.sh --help

 ====================================================================

Usage: db_installer.sh [OPTIONS]

Installer version: 24.04.12 

This script will perform installation of the Tantor DB on current host.

If the Tantor DB is already installed, no actions will be taken.

Available options:

  --help                        Show this help message.

 

--------------------------------------------------------------------

  --edition=                    Set edition (be, se, se-1c, se-certified). "se" is default.

  --major-version=              Set major version (14, 15)

  --maintenance-version=        Set maintenance version (15.2.4).

                                By default latest version will be installed.

   --do-initdb                   After installation run initdb with checksums.

  --package=                    Set specific package (all, client, libpq5).

                                "all" is default.

 --------------------------------------------------------------------

  --from-file=                  Install package from local file (rpm, deb)

                                May be used with --do-initdb option

====================================================================

Example for commercial use

====================================================================

 export NEXUS_USER="user_name"

export NEXUS_USER_PASSWORD="user_password"

export NEXUS_URL="nexus.tantorlabs.ru"

./db_installer.sh \

        --do-initdb \

    --major-version=15 \

        --edition=se

====================================================================

Example for evaluation use (without login and password)

Only for Basic Edition

====================================================================

export NEXUS_URL="nexus-public.tantorlabs.ru"

./db_installer.sh \

        --do-initdb \

    --major-version=15 \

        --edition=be

====================================================================

Examples how to install from file

====================================================================

./db_installer.sh \

    --from-file=./packages/tantor-be-server-15_15.4.1.jammy_amd64.deb

./db_installer.sh \

        --do-initdb \ --from-file=/tmp/tantor-be-server-15_15.4.1.jammy_amd64.deb

ΠŸΡ€ΠΈ создании кластСра инсталлятором Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм для Π±Π»ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

8) ΠŸΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ postgres. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ postgres

root@tantor:/home/astra# passwd postgres

New password: postgres

Retype new password: postgres

passwd: password updated successfully

9) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡƒΡ‚ΡŒ ΠΊ исполняСмым Ρ„Π°ΠΉΠ»Π°ΠΌ Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ» профиля ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ postgres. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ postgres, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаётся инсталлятором для запуска экзСмпляров кластСров. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ "-" Π·Π°ΡΡ‚авляСт ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ Ρ‚ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ΄Ρ‘Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

 root@tantor:/home/astra# su - postgres

postgres@tantor:~$ cat .bash_profile

export PATH=/opt/tantor/db/16/bin:$PATH

export LANGUAGE=en_US.UTF-8

10) Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ кластСра Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ "-D" ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌ. ΠšΠΎΠΌΠ°Π½Π΄Ρƒ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΉ строкой, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π΅ ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки:

postgres@tantor:~$ echo "export PGDATA=/var/lib/postgresql/tantor-se-16/data" >> .bash_profile

         11) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ PGDATA Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° профиля.

postgres@tantor:~$ cat .bash_profile

export PATH=/opt/tantor/db/16/bin:$PATH

export LANGUAGE=en_US.UTF-8

export PGDATA=/var/lib/postgresql/tantor-se-16/data

12) ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» профиля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ:

postgres@tantor:~$ source .bash_profile

Π§Π°ΡΡ‚ΡŒ 2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ кластСра ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ initdb

 1) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ Π΄Π²Π° экзСмпляра кластСра. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ pg_ctl.

postgres@tantor:~$ pg_ctl stop

waiting for server to shut down.... done

server stopped

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16-replica/data

waiting for server to shut down.... done

server stopped

МоТно Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ управлСния слуТбами запускаСмыми инфраструктурой systemd: sudo systemctl stop tantor-se-server-16

ΠŸΡ€ΠΈ запускС ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ systemctl ΡΠ½Π°Ρ‡Π°Π»Π° провСряСтся, Ρ‡Ρ‚ΠΎ дирСктория PGDATA Β«ΠΏΠΎΡ…ΠΎΠΆΠ°Β» Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ кластСра ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ postgresql-check-db-dir ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ pg_ctl start.

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ тСкстовым Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ (kate) Ρ„Π°ΠΉΠ» /usr/lib/systemd/system/tantor-se-server-16.service ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ строки, Π³Π΄Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΏΡ€ΠΈ запускС, остановкС ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ (reload) слуТбы. ОбновлСниС - это Π½Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° (restart).

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ содСрТимоС Ρ„Π°ΠΉΠ»Π° описатСля слуТбы:

postgres@tantor:~$ cat /usr/lib/systemd/system/tantor-se-server-16.service | grep /opt

ExecStartPre=/opt/tantor/db/16/bin/postgresql-check-db-dir ${PGDATA}

ExecStart=/opt/tantor/db/16/bin/pg_ctl start -D ${PGDATA} -s -w -t ${PGSTARTTIMEOUT}

ExecStop=/opt/tantor/db/16/bin/pg_ctl stop -D ${PGDATA} -s -m fast

ExecReload=/opt/tantor/db/16/bin/pg_ctl reload -D ${PGDATA} -s

Π Π΅ΠΆΠΈΠΌ остановки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ fast.

Если экзСмпляр запускался ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_ctl, Π° Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· systemd, Ρ‚ΠΎ systemctl Π½Π΅ остановит экзСмпляр. ΠŸΡ€ΠΈ этом, pg_ctl останавливаСт экзСмпляр, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Π»ΡŽΠ±Ρ‹ΠΌ способом. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ рСкомСндуСтся ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ экзСмпляр ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_ctl.

Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ экзСмпляр Π»ΡƒΡ‡ΡˆΠ΅ Ρ‡Π΅Ρ€Π΅Π· systemctl. ΠŸΡ€ΠΈ запускС экзСмпляра Ρ‡Π΅Ρ€Π΅Π· сСтСвоС соСдинСниС (подсоСдинившись ΠΏΠΎ ssh) ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_ctl, экзСмпляр ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ остановится послС закрытия сСтСвого соСдинСния (ΠΏΠΎ ssh). Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ запускС Ρ‡Π΅Ρ€Π΅Π· pg_ctl Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΆΡƒΡ€Π½Π°Π»Π° сообщСний Π² Ρ„Π°ΠΉΠ», Π° Π½Π΅ Π½Π° экран Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

3) Π”Π°ΠΉΡ‚Π΅ Π΅Ρ‰Ρ‘ Ρ€Π°Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ остановки экзСмпляра, Ссли экзСмпляр Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΎΠ½ становится, Ссли Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΎΠ± этом сообщит:

 postgres@tantor:~$ pg_ctl stop

pg_ctl: PID file "/var/lib/postgresql/tantor-se-16/data/postmaster.pid" does not exist

Is server running?

4) Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ кластСра:

postgres@tantor:~$ mkdir $PGDATA/../data.SAVE

postgres@tantor:~$ mv $PGDATA/* $PGDATA/../data.SAVE

postgres@tantor:~$ chmod 750 $PGDATA/../data.SAVE 

5) Π”Π°Π»Π΅Π΅ создайтС кластСр. Для создания кластСра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° initdb. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΎΠ½Π° Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, Π² частности, относящиСся ΠΊ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ). ЗапуститС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (со значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ):

postgres@tantor:~$ initdb

The files belonging to this database system will be owned by user "postgres".

This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".

The default database encoding has accordingly been set to "UTF8".

The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/tantor-se-16/data ... ok

creating subdirectories ... ok

selecting dynamic shared memory implementation ... posix

selecting default max_connections ... 100

selecting default shared_buffers ... 128MB

selecting default time zone ... Europe/Moscow

creating configuration files ... ok

running bootstrap script ... ok

performing post-bootstrap initialization ... ok

syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections

initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

pg_ctl -D /var/lib/postgresql/tantor-se-16/data -l logfile start

6) ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ клавиши Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ <Shift+PgUp> <Shift+PgDown>. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½.

Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ создан кластСр.

7) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_controldata, Ρ‡Ρ‚ΠΎ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½:

postgres@tantor:~$ pg_controldata

pg_control version number:                1300

Catalog version number:                   202307071

Database system identifier:               7340951136757174317

Database cluster state:                   shut down

pg_control last modified:                 12:19:38

Latest checkpoint location:               0/1514AB0

Latest checkpoint's REDO location:        0/1514AB0

Latest checkpoint's REDO WAL file:        000000010000000000000001

Latest checkpoint's TimeLineID:           1

Latest checkpoint's PrevTimeLineID:   1

Latest checkpoint's full_page_writes: on

Latest checkpoint's NextXID:          731

Latest checkpoint's NextOID:              13602

Latest checkpoint's NextMultiXactId:  1

Latest checkpoint's NextMultiOffset:  0

Latest checkpoint's oldestXID:            723

Latest checkpoint's oldestXID's DB:   1

Latest checkpoint's oldestActiveXID:  0

Latest checkpoint's oldestMultiXid:   1

Latest checkpoint's oldestMulti's DB: 1

Latest checkpoint's oldestCommitTsXid:0

Latest checkpoint's newestCommitTsXid:0

Time of latest checkpoint:                12:19:38

Fake LSN counter for unlogged rels:   0/3E8

Minimum recovery ending location:         0/0

Min recovery ending loc's timeline:   0

Backup start location:                    0/0

Backup end location:                      0/0

End-of-backup record required:            no

wal_level setting:                        replica

wal_log_hints setting:                    off

max_connections setting:                  100

max_worker_processes setting:             8

max_wal_senders setting:                  10

max_prepared_xacts setting:               0

max_locks_per_xact setting:               64

track_commit_timestamp setting:           off

Maximum data alignment:                   8

Database block size:                      8192

Blocks per segment of large relation: 131072

WAL block size:                           8192

Bytes per WAL segment:                    16777216

Maximum length of identifiers:            64

Maximum columns in an index:              32

Maximum size of a TOAST chunk:            1996

Size of a large-object chunk:             2048

Date/time type storage:                   64-bit integers

Float8 argument passing:                  by value

Data page checksum version:               0

Mock authentication nonce:           0d18c599c7876e965a894cd059b60c1307f5e1a959703351495b0193f729174a

8) НайдитС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ экзСмпляр кластСра Π½Π΅ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΈΠ»ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ погашСн. Π­Ρ‚ΠΎ строка:

Database cluster state:                   shut down

         9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_checksum:

postgres@tantor:~$ pg_checksums --help

pg_checksums enables, disables, or verifies data checksums in a PostgreSQL database cluster.

Usage:

  pg_checksums [OPTION]... [DATADIR]

Options:

 [-D, --pgdata=]DATADIR        data directory

  -c, --check                  check data checksums (default)

  -d, --disable                disable data checksums

  -e, --enable                 enable data checksums

  -f, --filenode=FILENODE  check only relation with specified filenode

  -N, --no-sync                do not wait for changes to be written safely to disk

  -P, --progress               show progress information

  -v, --verbose                output verbose messages

  -V, --version                output version information, then exit

  -?, --help                   show this help, then exit

If no data directory (DATADIR) is specified, the environment variable PGDATA

is used.

         Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π½Π° кластСрС.

10) Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -v ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ стоит, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ с Π½ΠΈΠΌ выводится список всСх Ρ„Π°ΠΉΠ»ΠΎΠ² кластСра, Π° ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎ.

postgres@tantor:~$ pg_checksums -e

Checksum operation completed

Files scanned:   948

Blocks scanned:  2817

Files written:  780

Blocks written: 2817

pg_checksums: syncing data directory

pg_checksums: updating control file

Checksums enabled in cluster

11) ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -c ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° соотвСтствиС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ суммам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сохранСны Π² ΠΈΡ… Π±Π»ΠΎΠΊΠ°Ρ….

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… кластСра:

postgres@tantor:~$ pg_checksums -c

Checksum operation completed

Files scanned:   948

Blocks scanned:  2817

Bad checksums:  0

Data checksum version: 1

12) ЗапуститС экзСмпляр кластСра:

postgres@tantor:~$ pg_ctl start

waiting for server to start....

LOG:  starting PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

LOG:  listening on IPv4 address "127.0.0.1", port 5432

LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

LOG:  database system was shut down at 13:25:56 MSK

LOG:  database system is ready to accept connections

 done

server started

ЭкзСмпляр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΡ€Ρ‚ 5432 для UnixSockets ΠΈ Π½Π° локальном сСтСвом интСрфСйсС.

13) Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ sudo systemctl start tantor-se-server-16

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ запуск с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ systemctl. ΠŸΡ€ΠΈ запускС ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ pg_ctl start, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ использовали сообщСния выводятся Π² error output stream, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы postgres.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ это:

postgres@tantor:~$ psql -c "\dconfig log_destination"

List of configuration parameters

        Parameter        | Value

-----------------+--------

 log_destination | stderr

(1 row)

ΠŸΡ€ΠΈ запускС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ systemd Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΎ ΠΆΠ΅ (log_destination=stderr), Π½ΠΎ error output stream Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° ΠΆΡƒΡ€Π½Π°Π» ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈΠ»ΠΈ процСсс syslog (тСкстовый Ρ„Π°ΠΉΠ» /var/log/syslog ΠΊΡƒΠ΄Π° ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ всС сообщСния ΠΎΡ‚ процСссов ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы).

ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΉ эксплуатации Π² ΠΆΡƒΡ€Π½Π°Π» ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ большиС ΠΎΠ±ΡŠΠ΅ΠΌΡ‹ тСкста ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ процСсс сбора сообщСний "logging_collector", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ процСссов. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π° сообщСний рассматриваСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Π»Π°Π²Π΅ курса.


Π§Π°ΡΡ‚ΡŒ 3. Π Π΅ΠΆΠΈΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ использованиС Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ€Π΅Π΄ΠΊΠΈΡ… случаях.

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ экзСмпляр кластСра:

postgres@tantor:~$ pg_ctl stop

waiting for server to shut down.... done

server stopped

2) ЗапуститС ΠΎΠ΄ΠΈΠ½ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ наши ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΉ сСссии:

postgres@tantor:~$ postgres --single

PostgreSQL stand-alone backend 16.1

3) ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ ΠΏΡ€ΠΎΠΌΠΏΡ‚. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‚ΠΈΠΏΠ° SELECT Π²Ρ‹Π΄Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π° с диагностичСскими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ ΠΈ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ символом ';'.

Π”Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ SELECT:

backend> select tantor_version()

            1: tantor_version        (typeid = 25, len = -1, typmod = -1, byval = f)

           ----

            1: tantor_version = "Tantor Special Edition 16.1.0"           (typeid = 25, len = -1, typmod = -1, byval = f)

           ----

4) Π”Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ VACUUM FULL:

backend> vacuum full

         5) Для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· сСссии Π½ΡƒΠΆΠ½ΠΎ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl+D>. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ psql (Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ слэш, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· psql "\q") ΠΈ ΠΈΡ… синонимы (quit, exit ΠΊΠΎΡ‚Ρ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ синонимами \q) Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π΅ Π² ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ psql.

ΠžΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΎΡ‚ кластСра, Π½Π°Π±Ρ€Π°Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl+D>:

backend> <Ctrl+D> LOG:  checkpoint starting: shutdown immediate

LOG:  checkpoint complete: wrote 145 buffers (0.9%); 0 WAL file(s) added, 0 removed, 1 recycled; write=0.007 s, sync=0.070 s, total=0.086 s; sync files=283, longest=0.012 s, average=0.001 s; distance=5719 kB, estimate=5719 kB; lsn=0/208C110, redo lsn=0/208C110

postgres@tantor:~$

6) ЗапуститС экзСмпляр ΠΈΠ·-ΠΏΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root:

postgres@tantor:~$ su -

Password: root

root@tantor:~# systemctl start tantor-se-server-16

root@tantor:~#

7) Π’Ρ‹ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈΠ· Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° root (вмСсто exit ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl+D>):

root@tantor:~# exit

logout

postgres@tantor:~$

8) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ экзСмпляр. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ½ запускался Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_ctl:

postgres@tantor:~$ pg_ctl stop

waiting for server to shut down.... done

server stopped

Π§Π°ΡΡ‚ΡŒ 4.  ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² экзСмпляру Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для запуска экзСмпляра Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Установим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ work_mem Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 8 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚. Π§Π°ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π² ΠΈΡ… Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС.

ЗапуститС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres@tantor:~$ pg_ctl start -o "--work_mem=8MB"

waiting for server to start....

[19479] LOG:  starting PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

[19479] LOG:  listening on IPv6 address "::1", port 5432

[19479] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

[19482] LOG:  database system was shut down at 13:59:08 MSK

[19479] LOG:  database system is ready to accept connections

2) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ установился:

postgres@tantor:~$ psql -c "show work_mem"

 work_mem

----------

 8MB

(1 row)

Π§Π°ΡΡ‚ΡŒ 5. Локализация 

1) ПослС создания кластСра ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сортировка:

postgres=# SELECT n FROM unnest(ARRAY['Π°', 'Π΅', 'Ρ‘', 'Π–', 'я', 'Ё','Π•']) n ORDER BY n;

 n

---

 Π°

 Π΅

 Π•

 Ρ‘

 Π

 Π–

 Ρ

(7 rows) 

postgres=# SELECT n FROM unnest(ARRAY['Π°', 'Π΅', 'Ρ‘', 'Π–', 'я', 'Ё','Π•']) n ORDER BY n COLLATE "ru-x-icu";

 n

---

 Π°

 Π΅

 Π•

 Ρ‘

 Π

 Π–

 Ρ

(7 rows)

2)  ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ сортировок ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»Π° опСрационная систСма ΠΏΡ€ΠΈ создании кластСра:

postgres=# select collname from pg_collation where collname like '%ru%RU%';

  collname  

-------------

 ru_RU.utf8

 ru_RU

 ru-RU-x-icu

(3 rows)

Π§Π°ΡΡ‚ΡŒ 6. ΠžΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ

Π”Π°Π»ΡŒΡˆΠ΅ приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ссли Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Π±Ρ‹Π»ΠΎ установлСно большС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ Π² этом ΠΏΡƒΠ½ΠΊΡ‚Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ, с Π½ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ:

1) postgres=# select collname from pg_collation where collname like '%ru%RU%';

    collname        

----------------

 ru_RU

 ru_RU.cp1251

 ru_RU.iso88595

 ru_RU.utf8

 ru_RU

 ru_RU

 ru-RU-x-icu

(7 rows)

2) Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ сортировки:

postgres=# create database lab01iso88595 LC_COLLATE = 'ru_RU.iso88595';

ERROR:  encoding "UTF8" does not match locale "ru_RU.iso88595"

DETAIL:  The chosen LC_COLLATE setting requires encoding "ISO_8859_5".

Ошибка ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сортировка связана с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ.

         3) Π£ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ:

postgres=# create database lab01iso88595 LC_COLLATE = 'ru_RU.iso88595' ENCODING='ISO_8859_5';

ERROR:  encoding "ISO_8859_5" does not match locale "en_US.UTF-8"

DETAIL:  The chosen LC_CTYPE setting requires encoding "UTF8".

 ΠžΡˆΠΈΠ±ΠΊΠ° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ctype Ρ‚Π°ΠΊΠΆΠ΅ связан с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ.

         4) ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΅Ρ‰Ρ‘:

postgres=# create database lab01iso88595 LC_COLLATE = 'ru_RU.iso88595' LC_CTYPE='ru_RU.iso88595';

ERROR:  encoding "UTF8" does not match locale "ru_RU.iso88595"

DETAIL:  The chosen LC_CTYPE setting requires encoding "ISO_8859_5".

УбСТдаСмся, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ctype Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ задания ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ для создаваСмой Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

         5) Π£ΠΊΠ°ΠΆΠ΅ΠΌ всС Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

postgres=# create database lab01iso88595 LC_COLLATE = 'ru_RU.iso88595' LC_CTYPE='ru_RU.iso88595' ENCODING='ISO_8859_5';

ERROR:  new encoding (ISO_8859_5) is incompatible with the encoding of the template database (UTF8)

HINT:  Use the same encoding as in the template database, or use template0 as template.

Ошибка ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… template1 Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, СдинствСнный шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ это template0.

         6) Π£ΠΊΠ°ΠΆΠ΅ΠΌ имя шаблона:

postgres=# create database lab01iso88595 LC_COLLATE = 'ru_RU.iso88595' LC_CTYPE='ru_RU.iso88595' ENCODING='ISO_8859_5' TEMPLATE= template0;

CREATE DATABASE

ΠŸΡ€ΠΈ создании Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΡ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для кластСра ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

7) ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌΡΡ ΠΊ Π½ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сортировка с ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. Π—Π°Π΄Π°Π΄ΠΈΠΌ Π΅Ρ‘ явно, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для этой Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сортировки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

postgres=# \c lab01iso88595

You are now connected to database "lab01iso88595" as user "postgres".

lab01iso88595=# SELECT n FROM unnest(ARRAY['Π°', 'Π΅', 'Ρ‘', 'Π–', 'я', 'Ё','Π•']) n ORDER BY n COLLATE "ru_RU.iso88595";

 n

---

 Π°

 Π΅

 Π•

 Ρ‘

 Π

 Π–

 Ρ

(7 rows)

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ UTF-8.

Π§Π°ΡΡ‚ΡŒ 7. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ управлСния

Познакомимся с ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ SQL. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ создания Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π£ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Линукс принято ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ (ΠΊΠ»ΡŽΡ‡) с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ --help ΠΈΠ»ΠΈ -h Ρ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ описаниСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

 postgres@tantor:~$ createdb --help

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΈΠΌΠ΅Π½Π΅ΠΌ lab01database:

 postgres@tantor:~$ createdb lab01database

Ошибки Π½Π΅ Π²Ρ‹Π΄Π°Π½ΠΎ, Π·Π½Π°Ρ‡ΠΈΡ‚ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… создана.

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… кластСра ΠΈ ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… пространств ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ oid2name. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… lab01database Π΅ΡΡ‚ΡŒ Π² спискС:

postgres@tantor:~$ oid2name

All databases:

        Oid  Database Name  Tablespace

----------------------------------

  16798  lab01database  pg_default

  16797  lab01iso88595  pg_default

          5           postgres  pg_default

          4          template0  pg_default

          1          template1  pg_default

         3) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΈΠΌΠ΅Π½Π΅ΠΌ lab01user, Ρ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ ΠΈ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… кластСра ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

postgres@tantor:~$ createuser lab01user --login --superuser -P

Enter password for new role: lab01user

Enter it again: lab01user

postgres@tantor:~$ 

4) ЗапуститС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· кластСра ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ - это ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для всСх Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… кластСра. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ создаваСмыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² stdout (Π½Π° экран Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°).

postgres@tantor:~$ pg_dumpall -g

--

-- PostgreSQL database cluster dump

--

SET default_transaction_read_only = off;

SET client_encoding = 'UTF8';

SET standard_conforming_strings = on;

--

-- Roles

--

CREATE ROLE lab01user;

ALTER ROLE lab01user WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:Z...9;;

CREATE ROLE postgres;

ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS; 

Π’ Π²Ρ‹Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° воссоздания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ создали.

5) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π²Π°ΠΊΡƒΡƒΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΡƒ строк

postgres@tantor:~$ vacuumdb -a -F

vacuumdb: vacuuming database "lab01database"

vacuumdb: vacuuming database "lab01iso88595"

vacuumdb: vacuuming database "postgres"

vacuumdb: vacuuming database "template1" 

6) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ кластСр Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ соСдинСния 

postgres@tantor:~$ pg_isready

/var/run/postgresql:5432 - accepting connections

Π§Π°ΡΡ‚ΡŒ 8. Настройка Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° psql

1) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ postgres посмотрСв ΠΏΡ€ΠΎΠΌΠΏΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

postgres@tantor:~$

2) ЗапуститС psql ΠΈ Π²Ρ‹ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹. Для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ \q Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl+D> Π»ΠΈΠ±ΠΎ quit Π»ΠΈΠ±ΠΎ exit. 

postgres@tantor:~$ psql

psql (16.1)

Type "help" for help.

postgres=# \q

postgres@tantor:~$ 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ (prompt) psql ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ. Π­Ρ‚ΠΎ пригодится, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ SQL ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

         3) НастройтС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, прСдставлСний Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ psql.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ записи строки Π² .psqlrc Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ Π² домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Ρ‚ΠΈΠ»ΡŒΠ΄Π° ~):

postgres@tantor:~$ echo "\setenv PAGER 'less -XS'" > ~/.psqlrc

postgres@tantor:~$ echo "\setenv PSQL_EDITOR /usr/bin/mcedit" >> ~/.psqlrc

4) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ появилась строка, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ вставили Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅: 

postgres@tantor:~$ cat ~/.psqlrc

\setenv PAGER 'less -XS'

\setenv PSQL_EDITOR /usr/bin/mcedit

postgres@tantor:~$

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС ΠΈ графичСских Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π’ AstraLinux стандартно установлСн графичСский Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ kate. Однако, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ su для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, графичСский Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π½Π΅ запустится. Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ вмСсто su ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ Π² этом ΠΏΡƒΠ½ΠΊΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ для справки ΠΈ ΠΈΡ… Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ.

 postgres@tantor:~$ exit

logout

root@tantor:/home/astra# exit

exit

astra@tantor:~$ ssh -X postgres@localhost

The authenticity of host 'localhost (::1)' can't be established.

ECDSA key fingerprint is SHA256:12VsUcC5hw5I1zr015AJ8C+xsN0m5h+IlU2M/xdNg6o.

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.

postgres@localhost's password: postgres

/usr/bin/xauth:  file /var/lib/postgresql/.Xauthority does not exist

postgres@tantor:~$ export PSQL_EDITOR=kate

postgres@tantor:~$ pg_ctl stop

postgres@tantor:~$ sudo systemctl start tantor-se-server-16

Π£Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· ~/.psqlrc строку \setenv PSQL_EDITOR /usr/bin/mcedit

         5) ЗапуститС psql:

postgres@tantor:~$ psql

psql (16.1)

Type "help" for help.

 postgres=# 

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ²ΡˆΠΈΡΡŒ ΠΏΠΎ ssh Π½Π΅ стоит Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ экзСмпляр ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_ctl stat, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ послС закрытия соСдинСния ssh экзСмпляр остановится. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° - Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс, Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠΈΠΉ процСсс postgres останавливаСтся. ΠŸΡ€ΠΈ подсоСдинСнии ΠΏΠΎ ssh Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ экзСмпляр стоит ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ sudo systemctl start tantor-se-server-16. 

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ подсказку ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ psql Π½Π°Π±Ρ€Π°Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ \? ΠΈ ΠΏΡ€ΠΎΠΌΠΎΡ‚Π°ΠΉΡ‚Π΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ клавиши <Enter> Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ Π΄ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π° Query Buffer:

postgres=# \?

...

Query Buffer

  \e [FILE] [LINE]           edit the query buffer (or file) with external editor

  \ef [FUNCNAME [LINE]]  edit function definition with external editor

  \ev [VIEWNAME [LINE]]  edit view definition with external editor

  \p                         show the contents of the query buffer

  \r                         reset (clear) the query buffer

  \s [FILE]                  display history or save it to file

  \w FILE                    write query buffer to file

МоТно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ клавишами z - ΠΏΡ€ΠΎΠΌΠΎΡ‚Π°Ρ‚ΡŒ экран Π²Π²Π΅Ρ€Ρ… b - ΠΏΡ€ΠΎΠΌΠΎΡ‚Π°Ρ‚ΡŒ экран Π²Π½ΠΈΠ· q - Π²Ρ‹ΠΉΡ‚ΠΈ.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΌΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° клавишами <Shift+PgUp> <Shift+PgDn>.

7) Если ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ подсказку Π½Π° русском языкС установитС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния LC_MESSAGES, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ устанавливаСтся язык сообщСний ΡƒΡ‚ΠΈΠ»ΠΈΡ‚. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° настройка ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π».

НаТмитС Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl+D> (ΠΈΠ»ΠΈ Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ \q ΠΈ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Enter>). Π£Π΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ <Ctrl+D>, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ быстро набираСтся.

НабСритС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres@tantor:~$ export LC_MESSAGES=ru_RU.utf8

postgres@tantor:~$ unset LANGUAGE

8) Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ настройка дСйствовала постоянно, Ρ‚ΠΎ Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

postgres@tantor:~$ cp .bash_profile .bash_profile.OLD

postgres@tantor:~$ echo "export LC_MESSAGES=ru_RU.utf8" >> ~/.bash_profile

postgres@tantor:~$ echo "unset LANGUAGE" >> ~/.bash_profile

9) Если вмСсто символов ">>" Π½Π°Π±Ρ€Π°Ρ‚ΡŒ ">" Ρ‚ΠΎ содСрТимоС Ρ„Π°ΠΉΠ»Π° затрётся. Π”Π²ΠΎΠΉΠ½ΠΎΠΉ символ добавляСт строку Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°. Π’ домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» .profile  Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» Π½Π΅ΡƒΠ΄ΠΎΠ±Π΅Π½ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π² домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ присутствуСт Ρ„Π°ΠΉΠ» .bash_profile ΠΈΠ»ΠΈ .bash_login Ρ‚ΠΎ Ρ„Π°ΠΉΠ» .profile Π½Π΅ дСйствуСт.

ЗапуститС psql ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ \?. Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ сохраняСтся ΠΈ ΠΌΠΎΠΆΠ½ΠΎ набирая Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ стрСлку Π²Π²Π΅Ρ€Ρ… ΠΈΠ»ΠΈ Π²Π½ΠΈΠ· Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· истории, Π° наТимая <Enter> ΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ. 

postgres@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=# \?

Π‘ΡƒΡ„Π΅Ρ€ запроса

\e [ЀАЙЛ] [БВРОКА]   ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ запроса (ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ») Π²ΠΎ внСшнСм Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅

\ef [ЀУНКЦИЯ [БВРОКА]] ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎ внСшнСм Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅

\ev [VIEWNAME [LINE]] ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ прСдставлСния Π²ΠΎ внСшнСм Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅

  \p                         Π²Ρ‹Π²Π΅ΡΡ‚ΠΈ содСрТимоС Π±ΡƒΡ„Π΅Ρ€Π° запросов

  \r                         ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ запроса

  \s [ЀАЙЛ]                  Π²Ρ‹Π²Π΅ΡΡ‚ΠΈ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΈΠ»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Ρ‘ Π² Ρ„Π°ΠΉΠ»

  \w ЀАЙЛ                    Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ запроса Π² Ρ„Π°ΠΉΠ»

:q 

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ подсказки Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ "q" 

10) ΠŸΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ тСкст. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ \p \r ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠ»ΠΈ Π½Π΅ Π·Π½Π°ΡŽΡ‚ ΠΎ Π½ΠΈΡ…, Π½ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹.

Как psql Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΠ΅Ρ‚ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°? Когда Π²Ρ‹ Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ \e \ef \ev Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΈ Π΅ΠΌΡƒ psql ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ тСкст Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° высвСчиваСтся Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΊΠ°ΠΊ /tmp/psql/edit.6652.sql

Π”Π°Π»ΡŒΡˆΠ΅ срСдствами Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Π²Ρ‹ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ тСкст ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚Π΅ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€. Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ сохраняСт тСкст Π² Ρ„Π°ΠΉΠ» ΠΈ psql ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π·Π°ΠΊΡ€Ρ‹Ρ‚. Π‘ΠΊΡ€Ρ‹Ρ‚ΠΎ ΠΎΡ‚ вас psql ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ Π² Π±ΡƒΡ„Π΅Ρ€, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π²Ρ‹ Π½Π°Π±Ρ€Π°Π»ΠΈ содСрТимоС Ρ„Π°ΠΉΠ»Π° Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅.

Нюанс: Ссли Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π²Ρ‹ Π½Π΅ поставили Ρ‚ΠΎΡ‡ΠΊΡƒ с запятой ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку Π² ΠΊΠΎΠ½Ρ†Π΅ Π½Π°Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ»ΠΈ ΡƒΠΆΠ΅ Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π² psql Π²Ρ‹ Π΅Ρ‘ Π½Π΅ Π½Π°Π±Ρ€Π°Π»ΠΈ, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ ΠΏΠΎΡˆΠ»Ρ‘Ρ‚ΡΡ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€. Π­Ρ‚ΠΎΡ‚ нюанс ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΡΡ‚ΡŒ использованиС ΠΊΠΎΠΌΠ°Π½Π΄ \e \ef ΠΈ \ev ΡΠΊΠ»ΠΎΠ½ΡΡ ΠΊ использованию графичСских срСдств Ρ‚ΠΈΠΏΠ° pgAdmin.

         11) Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ создания прСдставлСния ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ \ev Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ F2 (ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ) F10 (Π²Ρ‹ΠΉΡ‚ΠΈ). ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅. Π’ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ kate ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π° AstraLinux быстрыС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Ctrl+S> - ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ <Ctrl+Q> - Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°.

postgres=# \ev

CREATE VIEW

12) Командой \p ΠΏΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ послСднюю ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. Команда Π±Ρ‹Π»Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° psql ΠΈΠ· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°.

ПослС посылки ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: 

postgres=# \p

CREATE VIEW lab01view  AS

SELECT now();

13) Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ прСдставлСниС ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (routines ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ относятся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ):

  \sf[+]  Π˜ΠœΠ―_ЀУНКЦИИ        ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

  \sv[+]  Π˜ΠœΠ―_ΠŸΠ Π•Π”Π‘Π’         ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ прСдставлСния

         ΠΠ°Π±Π΅Ρ€ΠΈΡ‚Π΅:

\sv l<TAB><ENTER>

Π“Π΄Π΅ <TAB> клавиша табуляции, <ENTER> Ρ‚ΠΎΠΆΠ΅ клавиша Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅.

ПослС наТатия клавиши <TAB> psql Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ прСдставлСния. Если прСдставлСний Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° Π±ΡƒΠΊΠ²Ρƒ 'l' ΠΌΠ½ΠΎΠ³ΠΎ (ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΡ…), Ρ‚ΠΎ Π½Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚. Π’ этом случаС Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши <TAB> высвСтит список ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ². Π’Ρ‹ смоТСтС Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ нСсколько символов ΠΈ снова Π½Π°ΠΆΠ°Ρ‚ΡŒ <TAB> ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π½Π°Π±Ρ€Π°Π»ΠΈ Π½Π°ΠΆΠ°Π² ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <ENTER>.

postgres=# \sv lab01view

CREATE OR REPLACE VIEW public.lab01view AS

SELECT now() AS now

postgres=#

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ с запятой Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π΅Ρ‚. ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ появится Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΈ ;<ENTER> Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

         ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ ";" ΠΎΡ‚сутствуСт.

ΠœΡ‹ рассмотрСли Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ самого Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° psql - взаимодСйствия с Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ. ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ информация Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

Π§Π°ΡΡ‚ΡŒ 9. ИспользованиС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° psql

         1) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

postgres=# BEGIN TRANSACTION;

BEGIN

2) ΠœΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠΏΡ‚ измСнился - появился символ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΈ. Π’ psql Ρ ΠΏΡ€ΠΎΠΌΠΏΡ‚ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ссли Π»ΠΈ открытая транзакция Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ Π΅Π΅.

Π”Π°Π»ΡŒΡˆΠ΅ Π½Π°Π±Π΅Ρ€Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² нСсколько строк.

НабСритС SELECT:

postgres=*# select

3) ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠΏΡ‚ ΠΎΠΏΡΡ‚ΡŒ измСнился, вмСсто символа равСнство появилось Ρ‚ΠΈΡ€Π΅. Π”ΠΎΠ½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ с запятой:

postgres-*# tantor_version();

             tantor_version             

-------------------------------

 Tantor Special Edition 16.1.0

(1 row)

4) ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠΏΡ‚ ΠΎΠΏΡΡ‚ΡŒ измСнился, вмСсто символа Ρ‚ΠΈΡ€Π΅ вСрнулся символ равСнства. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ Π½Π΅Ρ‚ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

НабСритС ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈ ΠΏΠΎΡˆΠ»ΠΈΡ‚Π΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ с запятой: 

postgres=*# ffff;

ERROR:  syntax error at or near "ffff"

LINE 1: ffff;

Π’Ρ‹Π΄Π°Π»Π°ΡΡŒ ошибка синтаксиса. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ вмСсто Π·Π²Ρ‘Π·Π΄ΠΎΡ‡ΠΊΠΈ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅ΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ появился символ Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ транзакция Π΅Ρ‰Ρ‘ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π°, Π½ΠΎ ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅ΡˆΠ»Π° Π² состояниС сбоя, Π° Π² Ρ‚Π°ΠΊΠΎΠΌ состоянии транзакция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒΡΡ. Π’ состояниС сбоя Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ пСрСходят нСчасто, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ошибок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, накопившиСся Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ нСльзя. НапримСр, ошибки сСриализации доступа. Π§Ρ‚ΠΎ опасного Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ "ffff"? Π•Ρ‘ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сСрвСрный процСсс ΠΈ Π²ΠΈΠ΄ΠΈΡ‚ Ρ‡Ρ‚ΠΎ это Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ совсСм Π΄ΠΈΠΊΠΎΠ΅, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΆΠ΅ программист Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ процСсс рассчитываСт Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π΄Π°Ρ‘Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ написанноС программистом ΠΈ оттСстированноС. ΠŸΠΎΡΡ‚ΠΎΠΌ считаСт Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ пСрСвСсти Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π² состояниС сбоя.

         5) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. НабСритС:

postgres=!# select 1;

ERROR:  current transaction is aborted, commands ignored until end of transaction block

ВыдаСтся ошибка Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΈ Π»ΡŽΠ±Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ сСрвСрным процСссом ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ "Π΄ΠΎΠ±Ρ€ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ" Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

6)Π—Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠ°Π½Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ:

postgres=!# COMMIT;

ROLLBACK

         ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ транзакция пСрСвСдСнная Π² состояниС сбоя Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ»ΠΈ Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ сохранСния Ссли ΠΎΠ½Π° Π±Ρ‹Π»Π° установлСна. На ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ COMMIT сСрвСрный процСсс Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ - транзакция Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° ΠΏΡƒΡ‚Π΅ΠΌ ΠΎΡ‚ΠΊΠ°Ρ‚Π°.

Π•ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ON_ERROR_ROLLBACK, ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π½Π΅ Ρ‚Π΅Ρ€ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄. Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ заставляСт psql ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‚ΠΎΡ‡ΠΊΡƒ сохранСния (SAVEPOINT), Ρ‡Ρ‚ΠΎ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ использованиС счСтчика Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ (xid). Если Π΅Π³ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INTERACTIVE, Ρ‚ΠΎΠ³Π΄Π° Ρ‚ΠΎΡ‡ΠΊΠΈ сохранСния Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ, Ссли Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² psql ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ.

         7) УстановитС этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:

postgres=# \set ON_ERROR_ROLLBACK INTERACTIVE 

8) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

postgres=# BEGIN;

BEGIN

postgres=*# select 1;

 ?column?

----------

            1

(1 строка)

postgres=*# ffff;

ERROR:  syntax error at or near "ffff"

БВРОКА 1: ffff;

              ^

postgres=*# COMMIT;

COMMIT

Вранзакция Π±Ρ‹Π»Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° фиксациСй, Π° Π½Π΅ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΎΠΌ.

9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊ psql ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ свои ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ - Ρ‡Ρ‚ΠΎ ΠΎΠ½ посылаСт сСрвСрному процСссу, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вывСсти красивый Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠ΅ Ρ€ΠΎΠ»ΠΈ Π΅ΡΡ‚ΡŒ Π² кластСрС. На английском языкС это Π±Ρ‹ Π·Π²ΡƒΡ‡Π°Π»ΠΎ Β«describe userΒ», сокращСния ΠΏΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π±ΡƒΠΊΠ²Π°ΠΌ слов Β«duΒ». Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ слэш - ΠΎΠ±Ρ‰Π΅Π΅ Π½Π°Ρ‡Π°Π»ΠΎ всСх ΠΊΠΎΠΌΠ°Π½Π΄ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ psql. Если Π±Π΅Π· ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ слэша, это ΠΊΠΎΠΌΠ°Π½Π΄Π° SQL ΠΈ посылаСтся Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сСрвСрному процСссу ΠΊΠ°ΠΊ тСкст. Для посылки Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠ° с запятой ";" ΠΈΠ½Π°Ρ‡Π΅ ΠΊΠ°ΠΊ psql ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ.

НабСритС:

postgres=# \du

                                    Бписок Ρ€ΠΎΠ»Π΅ΠΉ

 Π˜ΠΌΡ Ρ€ΠΎΠ»ΠΈ  |                                ΠΡ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹                                

-----------+-------------------------------------------------------------------------

 lab01user | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”

 postgres  | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”, РСпликация, ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ RLS

10) УстановитС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ psql ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π°ΠΌ ΠΊΠ°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ psql ΡΠ°ΠΌ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ посылаСт Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅:

postgres=# \set ECHO_HIDDEN on

11) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# \du

********* Π—ΠΠŸΠ ΠžΠ‘ *********

SELECT r.rolname, r.rolsuper, r.rolinherit,

  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,

  r.rolconnlimit, r.rolvaliduntil

, r.rolreplication

, r.rolbypassrls

FROM pg_catalog.pg_roles r

WHERE r.rolname !~ '^pg_'

ORDER BY 1;

**************************

                                           Бписок Ρ€ΠΎΠ»Π΅ΠΉ

 Π˜ΠΌΡ Ρ€ΠΎΠ»ΠΈ  |                                ΠΡ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹                                

-----------+-------------------------------------------------------------------------

 lab01user | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”

 postgres  | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”, РСпликация, ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ RLS

12) Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ (copy-paste) тСкст ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Ctrl+Shift+c> <Ctrl+Shift+v>

 postgres=# SELECT r.rolname, r.rolsuper, r.rolinherit,

  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,

  r.rolconnlimit, r.rolvaliduntil

, r.rolreplication

, r.rolbypassrls

FROM pg_catalog.pg_roles r

WHERE r.rolname !~ '^pg_'

ORDER BY 1;

 rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolconnlimit | rolvaliduntil | rolreplication | rolbypassrls

-----------+----------+------------+---------------+-------------+-------------+--------------+---------------+----------------+--------------

 lab01user | t        | t          | t             | t           | t           |           -1 |               | f              | f

 postgres  | t        | t          | t             | t           | t           |           -1 |               | t              | t

(2 строки)

Π’ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ psql ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π΅Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚: psql Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ» Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ INHERIT ΠΈ LOGIN. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ создании Ρ€ΠΎΠ»ΠΈ. ЗначСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ. Π‘ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ значСния «НС наслСдуСтся, Π’Ρ…ΠΎΠ΄ Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½Β». Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Π° нСпонятна, поэтому ΠΌΡ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π½Π° Π½Π΅ΠΉ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

13) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ \? ΡΠΏΡ€Π°Π²ΠΊΡƒ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ \connect (сокращённая вСрсия ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹  \с)

Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅:

  \c[onnect] {[Π‘Π”|- ΠŸΠžΠ›Π¬Π—ΠžΠ’ΠΠ’Π•Π›Π¬|- Π‘Π•Π Π’Π•Π |- ПОРВ|-] | conninfo}

                             ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

                             (тСкущая: "postgres")

  \conninfo                  ΠΈΠ½Ρ„ормация ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ соСдинСнии

14) ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ подсоСдинСния. Клавиша табуляции позволяСт Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ psql Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ подсоСдинСнии ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ списку ΠΈΠΌΡ‘Π½ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. ЦСль этой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ соСдинСний - Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ порядок слСдования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ \c: Π±Π°Π·Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ хост ΠΏΠΎΡ€Ρ‚. Π•ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ, Ρ‚ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π½Π° Ρ‚ΠΈΡ€Π΅. <TAB><ENTER> - клавиши табуляции ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ (новая строка) Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅.

 postgres=# \c la<TAB><ENTER>

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "lab01database" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres".

lab01database=# \c - la<TAB><ENTER>

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "lab01database" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "lab01user".

lab01database=# \c - - localhost

БСйчас Π²Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "lab01database", ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "lab01user" (сСрвСр "localhost": адрСс "127.0.0.1", ΠΏΠΎΡ€Ρ‚ "5432").

lab01database=# \c - - - 5432

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "lab01database" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "lab01user".

lab01database=# \c postgres p<TAB><ENTER>

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres".

15) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π²Π΅Π±-страницы ΠΈ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

16) ЗапуститС psql:

postgres@education:~$ psql

psql (16.1)

Type "help" for help.

         17) УстановитС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π° HTML:

postgres=# \pset format html

Output format is html.

         18) ΠŸΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ file.html:

postgres=# \o file.html

         19) Π”Π°ΠΉΡ‚Π΅ Π»ΡŽΠ±ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅:

postgres=# show all; 

20) ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ„Π°ΠΉΠ»:

postgres=# \o

         21) ЗапуститС Π½Π° выходя ΠΈΡ… psql ΠΎΠΊΠ½ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°:

postgres=# \! xdg-open file.html

         22) ΠŸΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ ΠΏΠΎΠΊΠ° Π½Π΅ запустится ΠΎΠΊΠ½ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Π—Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ psql:

postgres=# \q 

23) Π—Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΎΠΊΠ½ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°:

postgres@tantor:~$ <CTRL+d>

24) Π—Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΎΠΊΠ½ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ Π² ΠΎΠΊΠ½ΠΎ psql. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠ΅ Π΅Ρ‰Ρ‘ Π΅ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π²Ρ‹Π²ΠΎΠ΄Π°. НабСритС Π² psql:

 postgres=# \pset format aaa

\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped

25) Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ aligned, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

postgres=# \pset format aligned

Output format is aligned.

         26) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

postgres=# SHOW ALL;

Π’ ΠΊΠΎΠ½Ρ†Π΅ экрана высвСтится Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅. НаТмитС Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ клавиши z z b q ΠΈ посмотритС эффСкт.

z - ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ страница, b - прСдыдущая, q - Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠΏΡ‚.

27) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# \pset format wrapped

Output format is wrapped.

28) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

postgres=# SHOW ALL;

НаТмитС Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ клавиши z z b h  ΠŸΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ описаниС доступных клавиш. Π—Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ Π½Π°Π²Ρ‹ΠΊΠΈ проматывания Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

29) Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ отличия. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ wrapped (пСрСнос ΠΏΠΎ словам) Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ aligned.

30) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ выходя ΠΈΠ· psql Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Команда Линукс "pwd" ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ "pwd" ΠΈΠ»ΠΈ "ls" (Π²Ρ‹Π΄Π°Ρ‘Ρ‚ список Ρ„Π°ΠΉΠ»ΠΎΠ²) Π±Π΅Π· Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· psql:

postgres=# \! pwd

/var/lib/postgresql        

31) УстановитС Ρ†Π²Π΅Ρ‚Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠΏΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΡΠ²Π΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ (pid) сСрвСрного процСсса сСрым Ρ†Π²Π΅Ρ‚ΠΎΠΌ:

\set PROMPT1 '%[%033[0;90m%][%p]%[%033[0m%] %[%033[0;31m%]%n%[%033[0m%]@%[%033[0;34m%]%m%[%033[0m%]:%[%033[0;32m%]%>%[%033[0m%] %[%033[0;36m%]%~%[%033[0m%] %[%033[0;33m%]%[%033[5m%]%x%[%033[0m%]%[%033[0m%]%R%# '

\set PROMPT2 '%[%033[0;90m%][%l]%[%033[0m%] %[%033[0;31m%]%n%[%033[0m%]@%[%033[0;34m%]%m%[%033[0m%]:%[%033[0;32m%]%>%[%033[0m%] %[%033[0;36m%]%~%[%033[0m%] %[%033[0;33m%]%[%033[5m%]%x%[%033[0m%]%[%033[0m%]%R%# '

Бтатус Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ отобраТаСтся ΠΌΠΈΠ³Π°ΡŽΡ‰ΠΈΠΌΠΈ символами * ΠΈ ! ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

Π‘ΠΏΡ€Π°Π²ΠΊΠ° Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ символы Ссли Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой ΠΏΡ€ΠΎΠΌΠΏΡ‚:

%p Π½ΠΎΠΌΠ΅Ρ€ сСрвСрного процСсса

%n Ρ€ΠΎΠ»ΡŒ. (ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π²ΠΎ врСмя сСссии ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ SET SESSION AUTHORIZATION;)

%m ΠΈΠΌΡ хоста ΠΈΠ»ΠΈ [local], Ссли соСдинСниС осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· Unix-сокСт

%> Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° экзСмпляра

%/ ΠΈΠΌΡ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

%~ ΠΈΠΌΡ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Если это Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ вмСсто ΠΈΠΌΠ΅Π½ΠΈ отобраТаСтся ~

%# Π΄Π»Ρ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ символ #, для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ€ΠΎΠ»Π΅ΠΉ символ >%l Π½ΠΎΠΌΠ΅Ρ€ строки Π² Π±ΡƒΡ„Π΅Ρ€Π΅ Π²Π²ΠΎΠ΄Π°.

%R Π΄Π»Ρ PROMPT1 ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ = Ссли сСссия находится Π² Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π²Π΅Ρ‚Π²ΠΈ условного Π±Π»ΠΎΠΊΠ° @ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ однострочного Π²Π²ΠΎΠ΄Π° ^ Ссли сСссия ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΎΡ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… !

для PROMPT2 Ссли ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° &ndash;

Ссли Π΅ΡΡ‚ΡŒ Π½Π΅Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ * Ссли Π΅ΡΡ‚ΡŒ нСзакрытая ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ° Ρ‚ΠΎ '

Ссли Π΅ΡΡ‚ΡŒ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Π°Ρ двойная ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ° Ρ‚ΠΎ "

Ссли Π΅ΡΡ‚ΡŒ начатая, Π½ΠΎ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Π°Ρ $строка$ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈ Π½Π°Π±ΠΎΡ€Π΅ тСкста Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ) Ρ‚ΠΎ $

Ссли Π΅ΡΡ‚ΡŒ лСвая скобка Π° правая скобка Π½Π΅ Π²Π²Π΅Π΄Π΅Π½Π°, Ρ‚ΠΎ (

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ PROMPT2 Π²Π°ΠΆΠ½Ρ‹ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π±Ρ‹Π² Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ апостроф сколько <ENTER> ; ΠΈΠ»ΠΈ \r Π½Π΅ Π½Π°Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°Π±Π΅Ρ€Ρ‘Ρ‚Π΅ апостроф:

Если Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ€ΠΎΠ»ΡŒ ΠΈ Π±Π°Π·Ρƒ:

\set PROMPT1 '%[%033[0;31m%]%n%[%033[0m%]@%[%033[0;36m%]%/%[%033[0m%] %[%033[0;33m%]%[%033[5m%]%x%[%033[0m%]%[%033[0m%]%R%# '

\set PROMPT2 '%[%033[0;31m%]%n%[%033[0m%]@%[%033[0;36m%]%/%[%033[0m%] %[%033[0;33m%]%[%033[5m%]%x%[%033[0m%]%[%033[0m%]%R%# '

         32) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ выводится Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ запроса:

  usename   | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig

------------+----------+-------------+----------+--------

 postgres   |       10 | t           | t        | t       | t            | ******** |          |

 replicator |    16388 | f           | f        | t       | f            | ******** |          |

 pma_user   |    16528 | f           | t        | f       | f            | ******** |          |

(3 строки)

33) УстановитС ΡΡ‚ΠΈΠ»ΡŒ отрисовки Π»ΠΈΠ½ΠΈΠΉ символами unicode:

postgres=# \pset linestyle unicode

УстановлСн ΡΡ‚ΠΈΠ»ΡŒ Π»ΠΈΠ½ΠΈΠΉ: unicode.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ запрос (Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π΄Π²Π° Ρ€Π°Π·Π° Π½Π° ΠΊΠ»Ρƒ <ENTER>)

postgres=# select * from pg_user;

  usename   Β¦ usesysid Β¦ usecreatedb Β¦ usesuper Β¦ userepl Β¦ usebypassrls Β¦  passwd  Β¦ valuntil Β¦ useconfig

------------+----------+-------------+----------+---------+-

 postgres   Β¦       10 Β¦ t           Β¦ t        Β¦ t       Β¦ t            Β¦ ******** Β¦          Β¦

 replicator Β¦    16388 Β¦ f           Β¦ f        Β¦ t       Β¦ f            Β¦ ******** Β¦          Β¦

 pma_user   Β¦    16528 Β¦ f           Β¦ t        Β¦ f       Β¦ f            Β¦ ******** Β¦          Β¦

(3 строки)

          34) ΠŸΠΎΠΌΠ΅Π½ΡΠΉΡ‚Π΅ ΡΡ‚ΠΈΠ»ΡŒ отобраТСния Π³Ρ€Π°Π½ΠΈΡ† :

ostgres=# \pset border 0

Π‘Ρ‚ΠΈΠ»ΡŒ Π³Ρ€Π°Π½ΠΈΡ†: 0.

35) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ запрос:

postgres=# select * from pg_user;

 usename   usesysid usecreatedb usesuper userepl usebypassrls  passwd  valuntil useconfig

---------- -------- ----------- -------- ------- -----------

postgres         10 t           t        t       t            ********          

replicator    16388 f           f        t       f            ********          

pma_user      16528 f           t        f       f            ********          

(3 строки)

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ стало Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ. 

36) ΠŸΠΎΠΌΠ΅Π½ΡΠΉΡ‚Π΅ ΡΡ‚ΠΈΠ»ΡŒ отобраТСния Π³Ρ€Π°Π½ΠΈΡ†:

postgres=# \pset border 2

Π‘Ρ‚ΠΈΠ»ΡŒ Π³Ρ€Π°Π½ΠΈΡ†: 2.

postgres=# select * from pg_user;

Β¦  usename   Β¦ usesysid Β¦ usecreatedb Β¦ usesuper Β¦ userepl Β¦ usebypassrls Β¦  passwd  Β¦ valuntil Β¦ useconfig Β¦

+------------+----------+--------+

Β¦ postgres   Β¦       10 Β¦ t           Β¦ t        Β¦ t       Β¦ t            Β¦ ******** Β¦          Β¦           Β¦

Β¦ replicator Β¦    16388 Β¦ f           Β¦ f        Β¦ t       Β¦ f            Β¦ ******** Β¦          Β¦           Β¦

Β¦ pma_user   Β¦    16528 Β¦ f           Β¦ t        Β¦ f       Β¦ f            Β¦ ******** Β¦          Β¦           Β¦

L------------+---------------

(3 строки)

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ для сСбя ΡΡ‚ΠΈΠ»ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ постоянным ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ~/.psqlrc Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² этот Ρ„Π°ΠΉΠ» ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ рассмотрСли.


Π§Π°ΡΡ‚ΡŒ 10. ВосстановлСниС сохранСнного кластСра

Π’ ΠΏΡƒΠ½ΠΊΡ‚Π΅ 4 части 2 ΠΌΡ‹ сохранили ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΉ кластСр ΠΏΠ΅Ρ€Π΅Π΄ созданиСм Π½ΠΎΠ²ΠΎΠ³ΠΎ кластСра. Π’Π΅Ρ€Π½Ρ‘ΠΌ кластСр Π½Π° мСсто.

1) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ экзСмпляр:

postgres@tantor:~$ pg_ctl stop

2) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

postgres@tantor:~$ mkdir $PGDATA/../data.afterLAB1

postgres@tantor:~$ mv $PGDATA/* $PGDATA/../data.afterLAB1

postgres@tantor:~$ mv $PGDATA/../data.SAVE/* $PGDATA

         3) ЗапуститС экзСмпляр:

postgres@tantor:~$ sudo systemctl start tantor-se-server-16

4) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ экзСмпляра:

postgres@tantor:~$ psql -c "select datname from pg_database;"

  datname

-----------

 postgres

 test_db

 template1

 template0

(4 строки)


Π Π°Π·Π΄Π΅Π» 2. АрхитСктура

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° памяти

  1. Вранзакция Π² psql
  2. Бписок Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… процСссов
  3. Π‘ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ кэш, ΠΊΠΎΠΌΠ°Π½Π΄Π° EXPLAIN
  4. Π–ΡƒΡ€Π½Π°Π» прСдзаписи. Π“Π΄Π΅ хранится?
  5. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°  
  6. ВосстановлСниС послС сбоя

Π§Π°ΡΡ‚ΡŒ 1. Вранзакция Π² psql

1) ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Fly Π½Π° Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ столС:

astra@tantor:~$ psql

psql (16.1)

2) Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#

3) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

postgres=# CREATE TABLE a(id integer);

CREATE TABLE

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

postgres=# \dt a

        Бписок ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

Π‘Ρ…Π΅ΠΌΠ°  | Имя |   Π’ΠΈΠΏ   | Π’Π»Π°Π΄Π΅Π»Π΅Ρ†  

-------+-----+---------+----------

public | a   | Ρ‚Π°Π±Π»ΠΈΡ†Π° | postgres

  1. строка)

5) ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ:

postgres=# BEGIN;

BEGIN

6) Вставим ΠΏΠ΅Ρ€Π²ΡƒΡŽ строчку. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ табуляции ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова ΠΈ Π΄Π°ΠΆΠ΅ слоТныС конструкции.  

postgres=*# INSERT INTO a VALUES (1);

INSERT 0 1

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° появлСниС Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΈ Π² строкС - это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ транзакция.

7) ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строчку Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»:

8) Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ psql.

astra@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#

9) ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

postgres=# SELECT * FROM a;

 id

----

(0 строк)

УбСдились - ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строчки. Π’ΠΈΠ΄Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ зафиксированныС Π΄Π°Π½Π½Ρ‹Π΅. ГрязноС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π½Π΅ допускаСтся.

-------------------------------------------------

10) Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ зафиксируСм Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

postgres=*# COMMIT;

COMMIT

11) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ обратимся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π·.

postgres=# SELECT * FROM a;

 id

----

  1

(1 строка)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ измСнСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ зафиксированы.

Π’Ρ‹Π²ΠΎΠ΄ - Π²ΠΈΠ΄Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ зафиксированы.

Π§Π°ΡΡ‚ΡŒ 2. Бписок Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… процСссов

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π³Π΄Π΅ находится дирСктория PGDATA, Π³Π΄Π΅ находятся Ρ„Π°ΠΉΠ»Ρ‹ кластСра Π‘Π”.

postgres=# SHOW data_directory;

            data_directory            

---------------------------------------

 /var/lib/postgresql/tantor-se-16/data

(1 строка)

2) Π’Ρ‹ΠΉΠ΄ΠΈΡ‚Π΅ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΈΠ· psql.

postgres=# \q

        3) Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ список процСссов Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ ps

astra@tantor:~$ sudo cat /var/lib/postgresql/tantor-se-16/data/postmaster.pid

466

/var/lib/postgresql/tantor-se-16/data

1713847705

5432

/var/run/postgresql

*

  1048641         0

ready  

4) Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ PID = 466 

astra@tantor:~$ sudo ps -o command --ppid 466

COMMAND

postgres: logger

postgres: checkpointer

postgres: background writer

postgres: walwriter

postgres: autovacuum launcher

postgres: logical replication launcher

postgres: walsender replicator ::1(34460) streaming 0/6DA71ED8

postgres: postgres postgres [local] idle

Π–ΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ систСмныС Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ процСссы, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅.

        Π‘писок процСссов ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· прСдставлСниС pg_stat_activity.

5) Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅.

postgres=# SELECT pid, backend_type, backend_start        

FROM pg_stat_activity;

  pid  |         backend_type         |         backend_start        

-------+------------------------------

   527 | autovacuum launcher          | 2024-04-23 07:48:25.435889+03

   528 | logical replication launcher | 2024-04-23 07:48:25.441432+03

   533 | walsender                    | 2024-04-23 07:48:25.472863+03

 25072 | client backend               | 2024-04-23 07:48:51.242631+03

 10977 | client backend               | 2024-04-23 08:06:17.871119+03

   520 | background writer            | 2024-04-23 07:48:25.403365+03

   519 | checkpointer                 | 2024-04-23 07:48:25.402941+03

   526 | walwriter                    | 2024-04-23 07:48:25.425135+03

(8 строк)

Π§Π°ΡΡ‚ΡŒ 3. Π‘ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ кэш, ΠΊΠΎΠΌΠ°Π½Π΄Π° EXPLAIN

1) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ строки Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Β«aΒ».

postgres=#INSERT INTO a SELECT id FROM generate_series(1,10000) AS id;    

INSERT 0 10000

2) Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ сСрвСр:

astra@education:~$ sudo systemctl restart tantor-se-server-16

3) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚:

postgres=# \c

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Β«postgresΒ», ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Β«postgresΒ».        

4) Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Explain посмотритС, ΠΎΡ‚ΠΊΡƒΠ΄Π° бСрСтся информация:

postgres=# EXPLAIN (analyze, buffers)

SELECT * FROM a;

                                            QUERY PLAN                                              

-------------------------------------------------

Seq Scan on a  (cost=0.00..145.00 rows=10000 width=4) (actual time=0.035..1.952 rows=10000 loops=1)

  Buffers: shared read=45

Planning:

  Buffers: shared hit=16 read=6 dirtied=3

Planning Time: 0.428 ms

Execution Time: 2.948 ms

(6 строк)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° строку Buffers. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ Π±Ρ‹Π»Π° взята с диска ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· кэш ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.

5) Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ экспСримСнт Π΅Ρ‰Π΅ Ρ€Π°Π·.

postgres=# EXPLAIN (analyze, buffers)

SELECT * FROM a;

                                             QUERY PLAN                                              

-------------------------------------------------------

 Seq Scan on a  (cost=0.00..145.00 rows=10000 width=4) (actual time=0.016..1.383 rows=10000 loops=1)

   Buffers: shared hit=45

 Planning Time: 0.063 ms

 Execution Time: 2.355 ms

(4 строки)

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ измСнилась. Π’Π΅ΠΏΠ΅Ρ€ΡŒ информация Π½Π°ΠΉΠ΄Π΅Π½Π° Π² Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠΌ кэшС

Π§Π°ΡΡ‚ΡŒ 4. Π–ΡƒΡ€Π½Π°Π» прСдзаписи. Π“Π΄Π΅ хранится?

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

astra@education:~$ sudo ls -l /var/lib/postgresql/tantor-se-16/data/pg_wal

ΠΈΡ‚ΠΎΠ³ΠΎ 360452

-rw------- 1 postgres postgres 16777216 Apr 23 08:10 00000001000000000000006D

-rw-r----- 1 postgres postgres 16777216 Apr  3 14:28 00000001000000000000006E

-rw-r----- 1 postgres postgres 16777216 Apr  3 14:28 00000001000000000000006F

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000070

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000071

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000072

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000073

-rw------- 1 postgres postgres 16777216 Apr  3 14:42 000000010000000000000074

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000075

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000076

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000077

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000078

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 000000010000000000000079

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 00000001000000000000007A

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 00000001000000000000007B

-rw------- 1 postgres postgres 16777216 Apr  3 14:42 00000001000000000000007C

-rw------- 1 postgres postgres 16777216 Apr  3 14:42 00000001000000000000007D

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 00000001000000000000007E

-rw------- 1 postgres postgres 16777216 Apr  3 14:41 00000001000000000000007F

-rw------- 1 postgres postgres 16777216 Apr  3 14:42 000000010000000000000080

-rw-r----- 1 postgres postgres 16777216 Apr  3 14:42 000000010000000000000081

-rw------- 1 postgres postgres 16777216 Apr  3 14:42 000000010000000000000082

drwx------ 2 postgres postgres     4096 Apr  2 12:09 archive_status

Π€Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π° прСдзаписи находятся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ pg_wal. Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΠΎ 16 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚.

Π§Π°ΡΡ‚ΡŒ 5. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°

1) ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° выполняСтся пСриодичСски, посмотрим Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» установлСн.

postgres=# SHOW checkpoint_timeout;

checkpoint_timeout  

--------------------

5min

(1 строка)

2) ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

postgres=# CHECKPOINT;

CHECKPOINT

3) Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ посмотрим Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π° прСдзаписи. НСнуТныС Ρ„Π°ΠΉΠ»Ρ‹ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹.

astra@education:~$ sudo ls -l /var/lib/postgresql/tantor-se-16/data/pg_wal

ΠΈΡ‚ΠΎΠ³ΠΎ 802820

-rw------- 1 postgres postgres 16777216 Feb 14 07:40 0000000100000001000000A4

-rw------- 1 postgres postgres 16777216 Feb 14 07:40 0000000100000001000000A5

-rw------- 1 postgres postgres 16777216 Feb 14 07:40 0000000100000001000000A6

-rw------- 1 postgres postgres 16777216 Feb 14 07:40 0000000100000001000000A7

-rw------- 1 postgres postgres 16777216 Feb 14 07:40 0000000100000001000000A8

Π§Π°ΡΡ‚ΡŒ 6. ВосстановлСниС послС сбоя

1) Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Π½ΠΎΠ²Ρ‹Π΅ строчки:

postgres=# INSERT INTO a SELECT id FROM generate_series(1,10000) AS id;

INSERT 0 10000

2) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ кластСр Π‘Π” Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ систСмного сбоя. Для Π½Π°Ρ‡Π°Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ PID процСсса postmaster.

astra@education:~$ sudo cat /var/lib/postgresql/tantor-se-16/data/postmaster.pid

12563

/var/lib/postgresql/tantor-se-16/data

1713849023

5432

/var/run/postgresql

*

  1048641        24

ready    

astra@education:~$ sudo kill -9 12563

3) Запустим экзСмпляр сСрвСра.

astra@education:~$ sudo systemctl start tantor-se-server-16

НСмного Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚. Π˜Π΄Π΅Ρ‚ восстановлСниС.

4) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΊΠ½Π΅ посмотрим, ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ Π»ΠΈ вставлСнныС строки.

postgres=# \c

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Β«postgresΒ» ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Β«postgresΒ».

postgres=# SELECT count(*) FROM a;

count

-------

 20000

(1 строка)

5) ΠžΡ‡ΠΈΡΡ‚ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅.

postgres=# DROP TABLE a;

DROP TABLE

postgres=# \dt

ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹.


ΠœΠ½ΠΎΠ³ΠΎΠ²Π΅Ρ€ΡΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ

  1. Вставка, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ строки
  2. Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ вСрсии строки Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях изоляции
  3. БостояниС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎ CLOG
  4. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
  5. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° строки

Π§Π°ΡΡ‚ΡŒ 1. Вставка, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ строки

1) Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ psql:

astra@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#

2) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

postgres=# CREATE TABLE a(id integer);

CREATE TABLE

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ.

postgres=# \dt a

         Π‘писок ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

 Π‘Ρ…Π΅ΠΌΠ°  | Имя |   Π’ΠΈΠΏ   | Π’Π»Π°Π΄Π΅Π»Π΅Ρ†

--------+-----+---------+----------

 public | a   | Ρ‚Π°Π±Π»ΠΈΡ†Π° | postgres

(1 строка)

4) Вставим ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

postgres=# INSERT INTO a VALUES(100);

INSERT 0 1

         5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ xmin.

postgres=# SELECT xmin, xmax, * FROM a;

xmin | xmax  | id  

------+------+-----

 1567 |    0 | 100

(1 строка)

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΡΡ 1567 - это Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»Π° создана пСрвая вСрсия строки.

 6) НачнСм ΡΠ²Π½ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

postgres=# BEGIN;

BEGIN

7) Обновим ΠΏΠ΅Ρ€Π²ΡƒΡŽ строчку.

postgres=*# UPDATE a SET id = 200;

UPDATE 1

8) ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΈ посмотрим, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ.

postgres=*# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+-----

 1569 |    0 | 200

(1 строка)

9) УбСдились Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ транзакция Π²ΠΈΠ΄ΠΈΡ‚ свои измСнСния.

Как Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ссли ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ?

id=100 ΠΈΠ»ΠΈ 200?

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ обращаСмся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅.
10) Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ
psql.

astra@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#

postgres=# SELECT xmin, xmax, * FROM a;

 xmin | xmax | id  

------+------+-----

 1568 | 1569 | 100

(1 строка)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ xmax ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ - это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ сущСствуСт вторая вСрсия строки Π½ΠΎ ΠΎΠ½Π° Π΅Ρ‰Π΅ Π½Π΅ зафиксирована.

11) Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ фиксируСм Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

postgres=*# COMMIT;

COMMIT

12) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΈΠ΄ΠΈΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ строку.

postgres=# SELECT xmin, xmax, * FROM a;

 xmin | xmax | id  

------+------+-----

 1569 |    0 | 200

(1 строка)

13) Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим, ΠΊΠ°ΠΊ выглядит ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅. ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅.

postgres=# BEGIN;

BEGIN

14) УдаляСм строчку.

postgres=*# DELETE FROM a;

DELETE 1

postgres=*# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+----

(0 rows)

ΠŸΠ΅Ρ€Π²Π°Ρ транзакция Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ строчку, ΠΎΠ½Π° ΡƒΠ΄Π°Π»Π΅Π½Π°, Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ° Π½Π΅ зафиксировано.

15) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅:

 postgres=# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+-----

 1569 | 1570 | 200

(1 строка)

Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΅Ρ‰Π΅ Π²ΠΈΠ΄Π½Π°, Π½ΠΎ xmax ΠΎΠΏΡΡ‚ΡŒ измСнился.

16) Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ фиксируСм Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ:

postgres=*# COMMIT;

COMMIT

17) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅:

postgres=# SELECT xmin, xmax, * FROM a;

 xmin | xmax | id

------+------+----

(0 rows)

Π§Π°ΡΡ‚ΡŒ 2. Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ вСрсии строки Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях изоляции

1) ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ вставим строку.

postgres=# BEGIN;

BEGIN

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ изоляции.

postgres=*# SHOW transaction_isolation;

transaction_isolation  

-----------------------

read committed

(1 строка)

postgres=*# INSERT INTO a VALUES(100);  

INSERT 0 1

postgres=*# SELECT xmin, xmax, * FROM a;

             

xmin | xmax | id  

------+------+-----

 1571 |    0 | 100

(1 строка)

3) НачнСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΈ обратимся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

postgres=# BEGIN;

BEGIN

postgres=*# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+----

(0 строк)

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ изоляции.
postgres=*# SHOW transaction_isolation;

transaction_isolation  

-----------------------

read committed

(1 строка)

5) Пока новая строка Π½Π΅ Π²ΠΈΠ΄Π½Π°. ЗафиксируСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ

postgres=*# COMMIT;

COMMIT

6) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ обратимся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Π§Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ?

postgres=*# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+-----

 1571 |    0 | 100

(1 строка)

7) ЗафиксируСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

postgres=*# COMMIT;

COMMIT

ИзмСнСния стали Π²ΠΈΠ΄Π½Ρ‹. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ аномалия Π½Π΅ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ чтСния.  

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ repeatable read.

8) Вставим Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ строку.

postgres=# BEGIN ISOLATION LEVEL REPEATABLE READ;

BEGIN

postgres=*# INSERT INTO a VALUES(200);

INSERT 0 1

postgres=*# SELECT xmin, xmax, * FROM a;

 xmin | xmax | id  

------+------+-----

 1571 |    0 | 100

 1572 |    0 | 200

(2 строки)

9) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ обратимся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π² Π½ΠΎΠ²ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π½Π΅.

postgres=# BEGIN ISOLATION LEVEL REPEATABLE READ;

BEGIN

postgres=*# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+-----

 1571 |    0 | 100

(1 строка)

10) Π’Π΅ΠΏΠ΅Ρ€ΡŒ фиксируСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

postgres=*# COMMIT;

COMMIT

11) ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π΅Ρ‰Π΅ Ρ€Π°Π·.

postgres=*# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

-----+------+-----

1571 |    0 | 100

(1 строка)

ИзмСнСния Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹. Π½Π° этом ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ снимком Π΄Π°Π½Π½Ρ‹Ρ….

12) ЗафиксируСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

postgres=*# COMMIT;

COMMIT

Π§Π°ΡΡ‚ΡŒ 3. БостояниС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎ CLOG

1) ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ посмотрим послС вставки состояниС.

postgres=# BEGIN;

BEGIN

postgres=*# INSERT INTO a VALUES(300);   

INSERT 0 1

postgres=*# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+-----

 1571 |    0 | 100

 1572 |    0 | 200

 1573 |    0 | 300

(3 строки)

2) Π’ΠΈΠ΄ΠΈΠΌ вставку Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ строки. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ статус Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ:

postgres=*# SELECT pg_xact_status('1573');

pg_xact_status  

----------------

in progress

(1 строка)

3) ЗафиксируСм Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ посмотрим статус.

postgres=*# COMMIT;

COMMIT

postgres=# SELECT pg_xact_status('1573');

 pg_xact_status

----------------

 committed

(1 строка)

4) Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим, ΠΊΠ°ΠΊ ΠΏΠΎΠ²Π΅Π΄Π΅Ρ‚ сСбя CLOG ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

postgres=# BEGIN;

BEGIN

postgres=*# INSERT INTO a VALUES(400);   

INSERT 0 1

postgres=*# SELECT xmin, xmax, * FROM a;

 xmin | xmax | id  

------+------+-----

 1571 |    0 | 100

 1572 |    0 | 200

 1573 |    0 | 300

 1574 |    0 | 400

(4 строки)

postgres=*# SELECT pg_xact_status('1574');

pg_xact_status  

----------------

in progress

(1 строка)

postgres=*# ROLLBACK;

ROLLBACK

postgres=# SELECT pg_xact_status('1574');

pg_xact_status  

----------------

aborted

(1 строка)

postgres=*# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+-----

 1571 |    0 | 100

 1572 |    0 | 200

 1573 |    0 | 300

(3 строки)

Π§Π°ΡΡ‚ΡŒ 4. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

1) Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ вставим Π½ΠΎΠ²ΡƒΡŽ строку ΠΈ посмотрим Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pg_locks, для этого Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ pid ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса.

postgres=# SELECT pg_backend_pid(); 

pg_backend_pid

----------------

          12193

(1 строка)

2) ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ обратимся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

postgres=# BEGIN;

BEGIN

postgres=*# UPDATE a SET id = id + 1;                                              

UPDATE 3

postgres=*# SELECT locktype, transactionid, mode, relation::regclass as obj FROM pg_locks where pid = 12193;

  locktype     | transactionid |       mode       |   obj    

---------------+---------------+------------------

 relation      |               | AccessShareLock  | pg_locks

 relation      |               | RowExclusiveLock | a

 virtualxid    |               | ExclusiveLock    |

 transactionid |          1577 | ExclusiveLock    |

(4 строки)

Появилась Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ RowExclusiveLock - накладываСтся Π² случаС обновлСния строк.

3) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΊΠ½Π΅ построим индСкс ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ посмотрим pid процСсса.

postgres=# SELECT pg_backend_pid();

pg_backend_pid

----------------

          17210

(1 строка)

postgres=# CREATE INDEX ON a (id);

4) Вранзакция подвисла. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ посмотрим, Ρ‡Ρ‚ΠΎ происходит Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ процСссС.

postgres=*# SELECT locktype, transactionid, mode, relation::regclass as obj FROM pg_locks where pid = 17210;  

 locktype  | transactionid |     mode      | obj

------------+---------------+---------------+-----

 virtualxid |               | ExclusiveLock |

 relation   |               | ShareLock     | a

(2 строки)

Появилась Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ShareLock ΠΎΠ½Π° Π½Π΅ совмСстима RowExclusiveLock Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° блокировочная ситуация.

5) ЗафиксируСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ.

postgres=*# COMMIT;

COMMIT

6) Π’ΡƒΡ‚ ΠΆΠ΅ срабатываСт ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΊΠ½Π΅.

CREATE INDEX

Π§Π°ΡΡ‚ΡŒ 5. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° строки

1) НачнСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ:

postgres=# BEGIN;

BEGIN

postgres=*# UPDATE a SET id = id + 1 WHERE id=101;                                 

UPDATE 1

2) НачнСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ:

postgres=# BEGIN;

BEGIN

postgres=*# UPDATE a SET id = id + 1 WHERE id=101;

Вранзакция подвисла, сработала Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°.

3) ЗафиксируСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ:

postgres=*# COMMIT;

COMMIT

Π’ΡƒΡ‚ ΠΆΠ΅ срабатываСт вторая.

UPDATE 0

postgres=*# COMMIT;

COMMIT

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΊΠΎΠΉ вСрсии строки Π½Π΅Ρ‚ для обновлСния.

4) Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ обратимся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅

postgres=# SELECT xmin, xmax, * FROM a;

xmin | xmax | id  

------+------+-----

 1577 |    0 | 201

 1577 |    0 | 301

 1579 | 1580 | 102

(3 строки)

5) Π£Π΄Π°Π»ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. 

postgres=# DROP TABLE a;

DROP TABLE

Π—Π°Π΄Π°Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ.


Π Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹

  1. ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ очистка Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
  2. Анализ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
  3. ΠŸΠ΅Ρ€Π΅ΡΡ‚Ρ€ΠΎΠΉΠΊΠ° индСкса
  4. Полная очистка
  5. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ HypoPG

Π§Π°ΡΡ‚ΡŒ 1. ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ очистка Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹


        1) Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ
psql

astra@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#

2) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

postgres=# CREATE TABLE a
        (id integer primary key generated always as identity,
         t  char(2000)) WITH (autovacuum_enabled = off);

CREATE TABLE

postgres=# INSERT INTO a(t) SELECT to_char(generate_series(1,10000),'9999');

INSERT 0 10000

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ.

postgres=# \d a  

                               Table "public.a"

Column |      Type       | Collation | Nullable |           Default            

--------+-----------------+-----------+----------

id     | integer         |           | not null | generated always as identity

t      | character(2000) |           |          |  

Indexes:

   "a_pkey" PRIMARY KEY, btree (id)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ создан ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈ индСкс.

4) Π£Π·Π½Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ индСкса Π² Π±Π°ΠΉΡ‚Π°Ρ…:

postgres=# SELECT pg_table_size('a');

pg_table_size  

---------------

     20512768

(1 строка)

postgres=# SELECT pg_table_size('a_pkey');

pg_table_size  

---------------

       245760

(1 строка)

5) Обновим 50% строк:

postgres=# UPDATE a set t= t || 'a' where id > 5000;

UPDATE 5000

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

postgres=# SELECT pg_table_size('a');               

pg_table_size  

---------------

     30752768

(1 строка)

postgres=# SELECT pg_table_size('a_pkey');

           

pg_table_size  

---------------

       360448

(1 строка)

7) Они Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΈΡΡŒ. ΠžΡ‡ΠΈΡΡ‚ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ индСкс:

postgres=# VACUUM a;

VACUUM

postgres=# SELECT pg_table_size('a'); SELECT pg_table_size('a_pkey');

pg_table_size  

---------------

     30760960

(1 строка)

pg_table_size  

---------------

       360448

(1 строка)

8) Π Π°Π·ΠΌΠ΅Ρ€ остался Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅. Π•Ρ‰Π΅ Ρ€Π°Π· ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ строки.

postgres=# UPDATE a set t= t || 'a' where id > 5000;

UPDATE 5000

postgres=# SELECT pg_table_size('a'); SELECT pg_table_size('a_pkey');

pg_table_size  

---------------

     30760960

(1 строка)

pg_table_size  

---------------

       360448

(1 строка)

ΠžΠΏΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ измСнился. ΠŸΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ это ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ использовано ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½ΠΎΠ΅ пространство.

9) К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ Ρ†ΠΈΠΊΠ» очистки.

postgres=# UPDATE a set t= t || 'a' where id > 5000;                 

UPDATE 5000

postgres=# UPDATE a set t= t || 'a' where id > 5000;

UPDATE 5000

postgres=# SELECT pg_table_size('a'); SELECT pg_table_size('a_pkey');

pg_table_size  

---------------

     51249152

(1 строка)

pg_table_size  

---------------

       466944

(1 строка)

10) Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠΏΡΡ‚ΡŒ вырос.

postgres=# VACUUM a;

VACUUM

postgres=# SELECT pg_table_size('a'); SELECT pg_table_size('a_pkey');

pg_table_size  

---------------

     51249152

(1 строка)

pg_table_size  

---------------

       466944

(1 строка)

Π”Π°ΠΆΠ΅ послС очистки Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ.


Π§Π°ΡΡ‚ΡŒ 2. Анализ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

1) Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ нСсколько Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ, посмотрим насколько Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π° ΠΎΡΡ‚Π°Π»Π°ΡΡŒ статистика. Π‘Π½Π°Ρ‡Π°Π»Π° обратимся ΠΊ систСмному ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ.

postgres=# SELECT reltuples FROM pg_class WHERE relname='a';

reltuples  

-----------

     8333

(1 строка)

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρƒ нас содСрТится 8333 строки.

2) Π’Π΅ΠΏΠ΅Ρ€ΡŒ обратимся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

postgres=# SELECT count(*) FROM a;

count  

-------

10000

(1 строка)

3) Оказалось, Ρ‡Ρ‚ΠΎ строк большС. Бтатистика всСгда ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Π°. Π’Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ„Π°Π·Ρƒ Π°Π½Π°Π»ΠΈΠ·Π°.

postgres=# ANALYZE a;

ANALYZE

4) Π’Π΅ΠΏΠ΅Ρ€ΡŒ статистика стала Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ.

postgres=# SELECT reltuples FROM pg_class WHERE relname='a';

 reltuples

-----------

     10000

(1 строка)

Π§Π°ΡΡ‚ΡŒ 3. ΠŸΠ΅Ρ€Π΅ΡΡ‚Ρ€ΠΎΠΉΠΊΠ° индСкса

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²:

postgres=# SELECT pg_table_size('a'); SELECT pg_table_size('a_pkey');

pg_table_size  

---------------

     51249152

(1 строка)

pg_table_size  

---------------

       466944

(1 строка)

2) БСйчас Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π° ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ индСкс. ΠŸΠ΅Ρ€Π΅ΡΡ‚Ρ€ΠΎΠΈΠΌ Π΅Π³ΠΎ.

postgres=# REINDEX TABLE a;

REINDEX

postgres=# SELECT pg_table_size('a'); SELECT pg_table_size('a_pkey');

pg_table_size  

---------------

     51249152

(1 строка)

pg_table_size  

---------------

       245760

(1 строка)

3) Π Π°Π·ΠΌΠ΅Ρ€ индСкса ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΡΡ, Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ остался Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

Π§Π°ΡΡ‚ΡŒ 4. Полная очистка

postgres=# VACUUM FULL a;

VACUUM

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

postgres=# SELECT pg_table_size('a'); SELECT pg_table_size('a_pkey');

pg_table_size  

---------------

     20488192

(1 строка)

pg_table_size  

---------------

       245760

(1 строка)

Π Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΡΡ.

2) Π£Π΄Π°Π»ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

postgres=# DROP TABLE a;

DROP TABLE

Π—Π°Π΄Π°Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ.

Π§Π°ΡΡ‚ΡŒ 5. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ HypoPG

1) УстановитС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ hypopg:

postgres=# CREATE EXTENSION hypopg;

CREATE EXTENSION

2) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с тСстовыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

postgres=# CREATE TABLE hypo AS SELECT id, 'line ' || id AS val FROM generate_series(1,10000) id;

SELECT 10000

3) План выполнСния Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки - ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сканированиС (Seq Scan). Π˜Π½Π΄Π΅ΠΊΡΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доступа Π½Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅Ρ‚ индСксов:

postgres=# EXPLAIN SELECT * FROM hypo WHERE id = 1;

                       QUERY PLAN                      

--------------------------------------------------------

 Seq Scan on hypo  (cost=0.00..165.60 rows=41  width=36)

   Filter: (id = 1)

(2 строки)

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ количСство строк 41, Π° Π½Π΅ 1? НСт статистики.

4) Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ статистику:

postgres=# vacuum analyze hypo;

VACUUM

postgres=# EXPLAIN SELECT * FROM hypo WHERE id = 1;

                      QUERY PLAN                      

-------------------------------------------------------

 Seq Scan on hypo  (cost=0.00..180.00 rows=1 width=13)

   Filter: (id = 1)

(2 строки)

ОТидаСмоС количСство строк 1.

Π”Π°Π½Π° Π·Π°Π΄Π°Ρ‡Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого запроса. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ индСкс ΠΏΠΎ столбцу id ускорит Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запроса. НуТно ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСкс. Если ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСкс, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΈ индСкс ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ индСкса Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎ ΠΈ Π΄ΠΎΠ»Π³ΠΎ, ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ мСсто. ΠŸΠ΅Ρ€Π΅Π΄ созданиСм индСкса ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ запроса.

5) Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρ‹ создайтС гипотСтичСский индСкс:

postgres=# SELECT * FROM hypopg_create_index('CREATE INDEX hypo_idx ON hypo (id)');

 indexrelid |      indexname      

------------+----------------------

      13495 | <13495>btree_hypo_id

(1 строка)

Имя гипотСтичСского индСкса гСнСрируСтся автоматичСски, это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ индСкс Π½Π΅ создаётся, ΠΊΠΎΠΌΠ°Π½Π΄Π° выполняСтся ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ.

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список гипотСтичСских индСксов:

postgres=# SELECT * FROM hypopg_list_indexes;

 indexrelid |      index_name      | schema_name | table_name | am_name

------------+----------------------+-------------

      13495 | <13495>btree_hypo_id | public      | hypo       | btree

(1 строка)

Какой ΠΏΠ»Π°Π½ выполнСния сСйчас?

7) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# EXPLAIN SELECT * FROM hypo WHERE id = 1;

                                     QUERY PLAN                                    

--------------------------------------------------------------------------

 Index Scan using "<13495>btree_hypo_id" on hypo  (cost=0.04..8.05 rows=1 width=13)

   Index Cond: (id = 1)

(2 строки)

План ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ индСкс Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

РСального индСкса Π½Π΅Ρ‚, поэтому ΠΏΠ»Π°Π½ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сканированиС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

postgres=# EXPLAIN (analyze) SELECT * FROM hypo WHERE id = 1;

                                           QUERY PLAN                                            

----------------------------------------------------------------------------

 Seq Scan on hypo  (cost=0.00..180.00 rows=1 width=13) (actual time=0.025..0.875 rows=1 loops=1)

   Filter: (id = 1)

   Rows Removed by Filter: 9999

 Planning Time: 0.077 ms

 Execution Time: 1.074 ms

(5 строк)

8) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ индСкс:

postgres=# CREATE UNIQUE INDEX hypo_id ON hypo(id);

CREATE INDEX

План выполнСния остался ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ:

postgres=# EXPLAIN SELECT * FROM hypo WHERE id = 1;

                                     QUERY PLAN                                    

------------------------------------------------------------------------

 Index Scan using "<13495>btree_hypo_id" on hypo  (cost=0.04..8.05 rows=1 width=13)

   Index Cond: (id = 1)

(2 строки)

9) Π£Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты:

postgres=# SELECT hypopg_reset();

 hypopg_reset

--------------

 

(1 строка)

ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ стал ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ созданный индСкс:

postgres=# EXPLAIN SELECT * FROM hypo WHERE id = 1;

                             QUERY PLAN                              

---------------------------------------------------------------------

 Index Scan using hypo_id on hypo  (cost=0.29..8.30 rows=1 width=13)

   Index Cond: (id = 1)

(2 строки)

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ позволяСт ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ индСксы:

postgres=# SELECT hypopg_hide_index('hypo_id'::regclass);

 hypopg_hide_index

-------------------

 t

(1 строка)

Π‘ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… сСссии ΠΈ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… сСссий Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ влияниС.

ГипотСтичСскиС индСксы Ρ‚Π°ΠΊΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… сСссии.

ГипотСтичСскиС индСксы ΠΏΡ€ΠΈ этом ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚:

postgres=# SELECT * FROM hypopg_list_indexes;

 indexrelid | index_name | schema_name | table_name | am_name

------------+------------+-------------

(0 строк)

План выполнСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сканированиС:

postgres=# EXPLAIN SELECT * FROM hypo WHERE id = 1;

                      QUERY PLAN                      

-------------------------------------------------------

 Seq Scan on hypo  (cost=0.00..180.00 rows=1 width=13)

   Filter: (id = 1)

(2 строки)

Π•ΡΡ‚ΡŒ прСдставлСниС со списком скрытых Π² Π΄Π°Π½Π½ΠΎΠΉ сСссии индСксов:

postgres=# SELECT * FROM hypopg_hidden_indexes;

 indexrelid | index_name | schema_name | table_name | am_name | is_hypo

------------+------------+-------------

      17402 | hypo_id    | public      | hypo       | btree   | f

(1 строка)

10) Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ скрытиС индСксов ΠΈ гипотСтичСскиС индСксы ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… сСссии:

postgres=# SELECT * FROM hypopg_create_index('CREATE INDEX hypo_idx ON hypo (id)');

 indexrelid |      indexname      

------------+----------------------

      13495 | <13495>btree_hypo_id

(1 строка)

postgres=# SELECT * FROM hypopg_list_indexes;

 indexrelid |      index_name      | schema_name | table_name | am_name

------------+----------------------+-------------

      13495 | <13495>btree_hypo_id | public      | hypo       | btree

(1 строка)

postgres=# \q

postgres@tantor:~$ psql

psql (16.1)

11) Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Β«helpΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=# SELECT * FROM hypopg_list_indexes;

 indexrelid | index_name | schema_name | table_name | am_name

------------+------------+-------------

(0 строк)

postgres=# SELECT * FROM hypopg_hidden_indexes;

 indexrelid | index_name | schema_name | table_name | am_name | is_hypo

------------+------------+-------------

(0 строк)


Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запросов

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для запросов
  2. Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ
  3. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ индСксу
  4. Низкая ΡΠ΅Π»Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ
  5. ИспользованиС статистики
  6. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ pg_stat_statements

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для запросов

1) Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ psql:

astra@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#

2) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

postgres=# CREATE TABLE test (col1 integer, col2 integer, name text);

CREATE TABLE

postgres=# INSERT INTO test VALUES (1,2,'test1');

INSERT 0 1

postgres=# INSERT INTO test VALUES (3,4,'test2');

INSERT 0 1

3) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ прСдставлСниС Π½Π°Π΄ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ.


postgres=# CREATE VIEW v_table AS  

SELECT * FROM test;

CREATE VIEW

postgres=# SELECT col1, col2 FROM v_table WHERE name='test1'::text ;

 col1 | col2

------+------

    1 |    2

(1 строка)

Π§Π°ΡΡ‚ΡŒ 2. Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ

1) C ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Explain ΠΏΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΏΠ»Π°Π½ выполнСния запроса.

postgres=# EXPLAIN  

         SELECT col1, col2 FROM v_table WHERE name='test1'::text

                    QUERY PLAN                      

-----------------------------------------------------

Seq Scan on test  (cost=0.00..25.00 rows=6 width=8)

  Filter: (name = 'test1'::text)

(2 строки)

Π’ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ использовалось ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ test. Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ прСдставлСниС Π±Ρ‹Π»ΠΎ раскрыто, Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹ нСпосрСдствСнно с Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

2) ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ analyze ΠΈ buffers. Они ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‡Ρ‚ΠΎ запрос Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΈ ΠΊΠ°ΠΊΠΎΠ΅ количСство страниц Π±Ρ‹Π»ΠΎ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΠΎ.

postgres=# EXPLAIN(analyze, buffers, costs off, timing off) 

SELECT col1, col2 FROM v_table WHERE name='test1'::text ;

               QUERY PLAN                

------------------------------------------

Seq Scan on test (actual rows=1 loops=1)

  Filter: (name = 'test1'::text)

  Rows Removed by Filter: 1

  Buffers: shared read=1

Planning Time: 0.063 ms

Execution Time: 9.569 ms

(6 строк)

Π§Π°ΡΡ‚ΡŒ 3. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ индСксу

1) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ индСкс ΠΏΠΎ столбцу col1.

postgres=# CREATE INDEX ON test (col1);

CREATE INDEX

postgres=# \d test

                           Π’Π°Π±Π»ΠΈΡ†Π° "public.test"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |   Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

---------+---------+--------------------

 col1    | integer |                    |                   |

 col2    | integer |                    |                   |

 name    | text    |                    |                   |

Π˜Π½Π΄Π΅ΠΊΡΡ‹:

   "test_col1_idx" btree (col1)

2) МоТно убСдится, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ индСкса производится автоматичСски,

Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

postgres=# INSERT INTO test(col1,col2)

SELECT generate_series(3,1003), generate_series(4,1004);

INSERT 0 1001

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ получится Ссли Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΌΠ°Π»ΠΎΠ΅ количСство строк. Π’ΠΎ Π΅ΡΡ‚ΡŒ, случай ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ высокая ΡΠ΅Π»Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ малСнькая ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

postgres=# EXPLAIN(analyze, buffers, costs off, timing off)  

SELECT col1, col2 FROM test WHERE col1<20;

                          QUERY PLAN                            

-----------------------------------------------------------------

Index Scan using test_col1_idx on test (actual rows=19 loops=1)

   Index Cond: (col1 < 20)

   Buffers: shared hit=3

 Planning:

   Buffers: shared hit=17

 Planning Time: 0.179 ms

 Execution Time: 0.117 ms

(7 строк)

УбСдились, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ индСксный доступ.

Π§Π°ΡΡ‚ΡŒ 4. Низкая ΡΠ΅Π»Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚Π±Π΅Ρ€Π΅ΠΌ большоС количСство строк.

postgres=# SELECT count(*) FROM test;

count  

-------

 1003

(1 строка)

ВсСго строк 1003

postgres=# EXPLAIN(analyze, buffers, costs off, timing off)  

SELECT col1, col2 FROM test WHERE col1>20;

                QUERY PLAN                

--------------------------------------------

 Seq Scan on test (actual rows=983 loops=1)

   Filter: (col1 > 20)

   Rows Removed by Filter: 20

   Buffers: shared hit=5

 Planning:

   Buffers: shared hit=3

 Planning Time: 0.157 ms

 Execution Time: 0.201 ms

(8 строк)

ΠžΡ‚ΠΎΠ±Ρ€Π°Π½ΠΎ 983 строки. Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ низкая ΡΠ΅Π»Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ высокая ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

УбСдились, Ρ‡Ρ‚ΠΎ Π² этом случаС индСксный доступ становится Π΄ΠΎΡ€ΠΎΠ³ΠΈΠΌ ΠΈ Π‘Π£Π‘Π” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ доступу.

Π§Π°ΡΡ‚ΡŒ 5. ИспользованиС статистики

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΡ€ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ test Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ столбСц Π±Ρ‹Π» Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL

ΠŸΠ΅Ρ€Π΅ΡΠΎΠ±Π΅Ρ€Π΅ΠΌ статистику.

postgres=# ANALYZE test;

ANALYZE

postgres=# SELECT stanullfrac  FROM pg_statistic WHERE starelid = 'test'::regclass AND staattnum = 3;  

stanullfrac  

-------------

  0.9981884

(1 row)

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ pg_statistic 99%

Π§Π°ΡΡ‚ΡŒ 6. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ pg_stat_statements

1) УбСдимся Ρ‡Ρ‚ΠΎ прСдставлСниС установлСно.

postgres=# \dx pg_stat_statements

                                        Бписок установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

      Имя         | ВСрсия | Π‘Ρ…Π΅ΠΌΠ°  |                                ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅                                

--------------------+--------+--------+-----

pg_stat_statements| 1.10  | public | track planning and execution statistics of all SQL statements executed

(1 строка)

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ столбцы Π΅ΡΡ‚ΡŒ Π² прСдставлСнии.

postgres=# \d pg_stat_statements

                            ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ "public.pg_stat_statements"

        Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ†         |       Π’ΠΈΠΏ        | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

------------------------+------------------+--------------------

 userid                 | oid              |                    |                   |

 dbid                   | oid              |                    |                   |

 toplevel               | boolean          |                    |                   |

 queryid                | bigint           |                    |                   |

 query                  | text             |                    |                   |

 plans                  | bigint           |                    |                   |

 total_plan_time        | double precision |                    |                   |

 min_plan_time          | double precision |                    |                   |

 max_plan_time          | double precision |                    |                   |

 mean_plan_time         | double precision |                    |                   |

 stddev_plan_time       | double precision |                    |                   |

 calls                  | bigint           |                    |                   |

 total_exec_time        | double precision |                    |                   |

 min_exec_time          | double precision |                    |                   |

 max_exec_time          | double precision |                    |                   |

 mean_exec_time         | double precision |                    |                   |

 stddev_exec_time       | double precision |                    |                   |

 rows                   | bigint           |                    |                   |

 shared_blks_hit        | bigint           |                    |                   |

 shared_blks_read       | bigint           |                    |                   |

 shared_blks_dirtied    | bigint           |                    |                   |

 shared_blks_written    | bigint           |                    |                   |

 local_blks_hit         | bigint           |                    |                   |

 local_blks_read        | bigint           |                    |                   |

 local_blks_dirtied     | bigint           |                    |                   |

 local_blks_written     | bigint           |                    |                   |

 temp_blks_read         | bigint           |                    |                   |

 temp_blks_written      | bigint           |                    |                   |

 blk_read_time          | double precision |                    |                   |

 blk_write_time         | double precision |                    |                   |

 temp_blk_read_time     | double precision |                    |                   |

 temp_blk_write_time    | double precision |                    |                   |

 wal_records            | bigint           |                    |                   |

 wal_fpi                | bigint           |                    |                   |

 wal_bytes              | numeric          |                    |                   |

 jit_functions          | bigint           |                    |                   |

 jit_generation_time    | double precision |                    |                   |

 jit_inlining_count     | bigint           |                    |                   |

 jit_inlining_time      | double precision |                    |                   |

 jit_optimization_count | bigint           |                    |                   |

 jit_optimization_time  | double precision |                    |                   |

 jit_emission_count     | bigint           |                    |                   |

 jit_emission_time      | double precision |                    |                   |

3) Ббросим статистику примСнСния прСдставлСния.

postgres=# SELECT pg_stat_statements_reset();

pg_stat_statements_reset  

--------------------------

 

(1 строка)

4) ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ test.

postgres=# EXPLAIN (analyze)                        

SELECT col1, col2 FROM test WHERE col1>20;

                                           QUERY PLAN                  

                         

--------------------------------------------------------------------------------------------

 Seq Scan on test  (cost=0.00..17.54 rows=984 width=8) (actual time=0.022..0.132 rows=983 loops=1)

   Filter: (col1 > 20)

   Rows Removed by Filter: 20

 Planning Time: 0.190 ms

 Execution Time: 0.234 ms

(5 строк)

        

5) Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСдставлСния pg_stat_statements посмотрим сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ заняло Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запроса ΠΈ сколько страниц Π±Ρ‹Π»ΠΎ задСйствовано.

postgres=# SELECT queryid, substring(query FOR 100) as query, total_exec_time as ms, shared_blks_hit as blocks

from pg_stat_statements

WHERE query LIKE '%col1, col2%';

      queryid         |                   query                   |    ms    | blocks

----------------------+----------------------------

 -3250261183448805182 | EXPLAIN (analyze)                        +| 0.491265 |     11

                      | SELECT col1, col2 FROM test WHERE col1>$1 |          |

(1 строка)


Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ

  1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ
  2. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ
  3. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ доступных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ
  4. Установка ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ обновлСния
  5. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ доступных вСрсий Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. ОбновлСниС Π΄ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии
  6. ΠžΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…

Π§Π°ΡΡ‚ΡŒ 1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ

1) ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ postgres.


astra@education:~$ sudo su - postgres

2) Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_config.

postgres@education:~$ pg_config --sharedir

/opt/tantor/db/16/share/postgresql

3) Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅ΠΌΡƒΡΡ ΠΏΡƒΡ‚ΠΈ extension.

postgres@education:~$ ls -l /opt/tantor/db/16/share/postgresql/extension/

ΠΈΡ‚ΠΎΠ³ΠΎ 9768

-rw-r--r-- 1 root root    274 Apr 18  2023 adminpack--1.0--1.1.sql

-rw-r--r-- 1 root root   1535 Apr 18  2023 adminpack--1.0.sql

-rw-r--r-- 1 root root   1682 Apr 18  2023 adminpack--1.1--2.0.sql

-rw-r--r-- 1 root root    595  Apr 18  2023 adminpack--2.0--2.1.sql

-rw-r--r-- 1 root root    176 Apr 18  2023 adminpack.control

&hellip;&hellip;&hellip;&hellip;

&hellip;&hellip;&hellip;

4) Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ psql.

postgres@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#

5) ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΏΡƒΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pg_config().

postgres=# SELECT setting FROM pg_config()  

where name = 'SHAREDIR';

             setting                

------------------------------------

/opt/tantor/db/16/share/postgresql

(1 row)

Π§Π°ΡΡ‚ΡŒ 2. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

postgres=# \dx

                                          Бписок установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

        Имя         | ВСрсия |   Π‘Ρ…Π΅ΠΌΠ°    |                                ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅                                

--------------------+--------+------------

 pg_stat_statements | 1.10   | public     | track planning and execution statistics of all SQL statements executed

 pg_store_plans     | 1.6.4  | public     | track plan statistics of all SQL statements executed

 plpgsql            | 1.0    | pg_catalog | PL/pgSQL procedural language

(3 строки)

Π§Π°ΡΡ‚ΡŒ 3. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ доступных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ pg_available_extensions.

postgres=# SELECT * from pg_available_extensions;

        name        | default_version | installed_version |                                            comment                                            

--------------------+-----------------+-------------------

 plpgsql            | 1.0             | 1.0               | PL/pgSQL procedural language

 page_repair        | 1.0             |                   | Individual page reparing

 pg_hint_plan       | 1.6.0           |                   |

 dblink             | 1.2             |                   | connect to other PostgreSQL databases from within a database

 tcn                | 1.0             |                   | Triggered change notifications

 pg_trgm            | 1.6             |                   | text similarity measurement and index searching based on trigrams

 pg_buffercache     | 1.4             |                   | examine the shared buffer cache

-----------------

 dict_xsyn          | 1.0             |                   | text search dictionary template for extended synonym processing

 pg_variables       | 1.2             |                   | session variables with various types

 old_snapshot       | 1.0             |                   | utilities in support of old_snapshot_threshold

 pgcrypto           | 1.3             |                   | cryptographic functions

 file_fdw           | 1.0             |                   | foreign-data wrapper for flat file access

 amcheck            | 1.3             |                   | functions for verifying relation integrity

 seg                | 1.4             |                   | data type for representing line segments or floating-point intervals

 pg_background      | 1.2             |                   | Run SQL queries in the background

(69 строк)

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ установлСно 69 Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ кластСрС Π‘Π”. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² любой Π‘Π”.

Π§Π°ΡΡ‚ΡŒ 4. Установка ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ обновлСния

1) НапримСр, установим Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ pg_surgery.

postgres=# CREATE EXTENSION pg_surgery;

CREATE EXTENSION

postgres=# \dx

                                    Бписок установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

        Имя         | ВСрсия |   Π‘Ρ…Π΅ΠΌΠ°    |                       ОписаниС                                

--------------------+--------+------------

 pg_stat_statements | 1.10   | public     | track planning and execution statistics of all SQL statements executed

 pg_store_plans     | 1.6.4  | public     | track plan statistics of all SQL statements executed

 pg_surgery         | 1.0    | public     | extension to perform surgery on a damaged relation

 plpgsql            | 1.0    | pg_catalog | PL/pgSQL procedural language

(4 строки)


        2)
ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ содСрТимоС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

postgres=# \dx+ pg_surgery

     ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ "pg_surgery"

             ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°              

-------------------------------------------

 Ρ„ункция heap_force_freeze(regclass,tid[])

 Ρ„ункция heap_force_kill(regclass,tid[])

(2 строки)

3) Π£Π΄Π°Π»ΠΈΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅.

postgres=# DROP EXTENSION pg_surgery;

DROP EXTENSION

Π§Π°ΡΡ‚ΡŒ 5. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ доступных вСрсий Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. ОбновлСниС Π΄ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии

1) Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ прСдставлСниСм pg_available_extension_versions

postgres=# SELECT name, version FROM pg_available_extension_versions WHERE name = 'adminpack';

  name    | version

-----------+---------

 adminpack | 1.0

 adminpack | 1.1

 adminpack | 2.0

 adminpack | 2.1

(4 строки)

2) Для Π½Π°Ρ‡Π°Π»Π° установим Π²Π΅Ρ€ΡΠΈΡŽ 1.0

postgres=# CREATE EXTENSION adminpack VERSION '1.0';

CREATE EXTENSION

postgres=# \dx adminpack  

                    Бписок установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

    Имя    | ВСрсия |   Π‘Ρ…Π΅ΠΌΠ°    |                ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅                

-----------+--------+------------+-----------------------------------------

 adminpack | 1.0    | pg_catalog | administrative functions for PostgreSQL

(1 строка)

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ содСрТимоС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

postgres=# \dx+ adminpack  

    ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ "adminpack"

             ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°            

------------------------------------------

 Ρ„ункция pg_file_length(text)

 Ρ„ункция pg_file_read(text,bigint,bigint)

 Ρ„ункция pg_file_rename(text,text)

 Ρ„ункция pg_file_rename(text,text,text)

 Ρ„ункция pg_file_unlink(text)

 Ρ„ункция pg_file_write(text,text,boolean)

 Ρ„ункция pg_logdir_ls()

 Ρ„ункция pg_logfile_rotate()

(8 строк)

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄ΠΎ вСрсии 2.1. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ pg_extension_update_paths.

postgres=# SELECT * FROM pg_extension_update_paths('adminpack');                  

source | target |        path        

--------+--------+--------------------

 1.0    | 1.1    | 1.0--1.1

 1.0    | 2.0    | 1.0--1.1--2.0

 1.0    | 2.1    | 1.0--1.1--2.0--2.1

 1.1    | 1.0    |

 1.1    | 2.0    | 1.1--2.0

 1.1    | 2.1    | 1.1--2.0--2.1

 2.0    | 1.0    |

 2.0    | 1.1    |

 2.0    | 2.1    | 2.0--2.1

 2.1    | 1.0    |

 2.1    | 1.1    |

 2.1    | 2.0    |

(12 строк)

5) Обновим Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π΄ΠΎ вСрсии 2.1.

postgres=# ALTER EXTENSION adminpack UPDATE;             

ALTER EXTENSION

postgres=# \dx adminpack                    

                     Π‘писок установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

    Имя    | ВСрсия |   Π‘Ρ…Π΅ΠΌΠ°    |                ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅                

-----------+--------+------------+-----------------------------------------

 adminpack | 2.1    | pg_catalog | administrative functions for PostgreSQL

(1 строка)

postgres=# \dx+ adminpack                    

    ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ "adminpack"

             ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°            

------------------------------------------

 Ρ„ункция pg_file_rename(text,text)

 Ρ„ункция pg_file_rename(text,text,text)

 Ρ„ункция pg_file_sync(text)

 Ρ„ункция pg_file_unlink(text)

 Ρ„ункция pg_file_write(text,text,boolean)

 Ρ„ункция pg_logdir_ls()

(6 строк)

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, содСрТимоС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ измСнилось.

6) Π£Π΄Π°Π»ΠΈΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅.

postgres=# DROP EXTENSION adminpack;

DROP EXTENSION

Π§Π°ΡΡ‚ΡŒ 6. ΠžΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… (FDW).

postgres=# SELECT * FROM pg_available_extensions              

WHERE name LIKE '%fdw%';

    name     | default_version | installed_version |                      comment                      

--------------+-----------------+-------------------

 postgres_fdw | 1.1             |                   | foreign-data wrapper for remote PostgreSQL servers

 file_fdw     | 1.0             |                   | foreign-data wrapper for flat file access

(2 строки)

2) Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΎΠΉ внСшнСй Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π‘Π£Π‘Π” PostgreSQL.

postgres=# CREATE EXTENSION postgres_fdw;

CREATE EXTENSION

postgres=# \dx postgres_fdw  

                          Бписок установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

     Π˜ΠΌΡ      | ВСрсия | Π‘Ρ…Π΅ΠΌΠ°  |                      ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅                      

--------------+--------+--------+----------------------------------------------------

 postgres_fdw | 1.1    | public | foreign-data wrapper for remote PostgreSQL servers

(1 строка)

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡ‚ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

postgres=# \l

                                                        Бписок Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…

    Имя    | Π’Π»Π°Π΄Π΅Π»Π΅Ρ† | ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° | ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ Π»ΠΎΠΊΠ°Π»ΠΈ | LC_COLLATE  |  LC_CTYPE   | локаль ICU | ΠŸΡ€Π°Π²ΠΈΠ»Π° ICU |     ΠŸΡ€Π°Π²Π° доступа    

-----------+----------+-----------+------------------+-------------+-------------+------------+-------------+-----------------------

 postgres  | postgres | UTF8      | libc             | ru_RU.UTF-8 | ru_RU.UTF-8 |            |             |

 template0 | postgres | UTF8      | libc             | ru_RU.UTF-8 | ru_RU.UTF-8 |            |             | =c/postgres          +

           |          |           |                  |             |             |            |             | postgres=CTc/postgres

 template1 | postgres | UTF8      | libc             | ru_RU.UTF-8 | ru_RU.UTF-8 |            |             | =c/postgres          +

           |          |           |                  |             |             |            |             | postgres=CTc/postgres

 test_db   | postgres | UTF8      | libc             | ru_RU.UTF-8 | ru_RU.UTF-8 |            |             |

(4 строки)

4) ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌΡΡ ΠΈ Π²Π΅Ρ€Π½Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ с Π‘Π” test_db. Для Π½Π°Ρ‡Π°Π»Π° создадим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ сСрвСра.

postgres=# CREATE SERVER test FOREIGN DATA WRAPPER postgres_fdw  

                 OPTIONS (host 'localhost', port '5432', dbname 'test_db');

CREATE SERVER

postgres=# \des

         Π‘писок сторонних сСрвСров

 Π˜ΠΌΡ  | Π’Π»Π°Π΄Π΅Π»Π΅Ρ† | ΠžΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° сторонних Π΄Π°Π½Π½Ρ‹Ρ…

------+----------+--------------------------

 test | postgres | postgres_fdw

(1 строка)

5) ПослС этого создадим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько.

postgres=# CREATE USER MAPPING FOR postgres SERVER test  

OPTIONS ( user 'postgres', password 'postgres' );

CREATE USER MAPPING

postgres=# \deu

Бписок сопоставлСний ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

 Π‘Π΅Ρ€Π²Π΅Ρ€ | Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

--------+------------------

 test   | postgres

(1 строка)

6) ПослС, создадим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ.

postgres=# CREATE FOREIGN TABLE order_remote  

( id bigint, name varchar(32))

server test  

OPTIONS ( schema_name 'public', table_name 'order_items_1'  

);

CREATE FOREIGN TABLE

postgres=# \det

   Π‘писок сторонних Ρ‚Π°Π±Π»ΠΈΡ†

 Π‘Ρ…Π΅ΠΌΠ°  |   Π’Π°Π±Π»ΠΈΡ†Π°    | Π‘Π΅Ρ€Π²Π΅Ρ€

--------+--------------+--------

 public | order_remote | test

(1 строка)

7) ΠžΠ±Ρ€Π°Ρ‰Π°Π΅ΠΌΡΡ ΠΊ этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΊΠ°ΠΊ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

postgres=# SELECT * FROM order_remote LIMIT 10;

id | name  

----+------

 0 |  

 1 |  

 2 |  

 3 |  

 4 |  

 5 |  

 6 |  

 7 |  

 8 |  

 9 |  

(10 строк)

8) ОписаниС ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ.

postgres=# \d order_remote  

                                Бторонняя Ρ‚Π°Π±Π»ΠΈΡ†Π° "public.order_remote"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |          Π’ΠΈΠΏ          | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ | ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠžΠ‘Π”

---------+-----------------------+--------------------+-------------------+--------------+---------------

 id      | bigint                |                    |                   |              |

 name    | character varying(32) |                    |                   |              |

Π‘Π΅Ρ€Π²Π΅Ρ€: test

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠžΠ‘Π”: (schema_name 'public', table_name 'order_items_1')

9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΎΡ‚ΠΊΡƒΠ΄Π° приходят Π΄Π°Π½Π½Ρ‹Π΅.

postgres=# EXPALIN SELECT * FROM order_remote LIMIT 10;

                             QUERY PLAN                              

----------------------------------------------------------------------

Foreign Scan on order_remote  (cost=100.00..100.42 rows=10 width=90)

(1 строка)


10) ΠžΡ‡ΠΈΡΡ‚ΠΈΠΌ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

postgres=# DROP FOREIGN TABLE order_remote;

DROP FOREIGN TABLE

postgres=# DROP USER MAPPING FOR postgres server test;

DROP USER MAPPING

postgres=# DROP SERVER test;

DROP SERVER

postgres=# DROP EXTENSION postgres_fdw;

DROP EXTENSION


Π Π°Π·Π΄Π΅Π» 3. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

  1. ΠžΠ±Π·ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
  2. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ измСрСния
  3. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ логичСского Ρ‚ΠΈΠΏΠ°
  4. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  5. Π€Π°ΠΉΠ» слуТб

Π§Π°ΡΡ‚ΡŒ 1. ΠžΠ±Π·ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

1) Бколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ имССтся?

postgres=# select count(*) from pg_settings;

 count

-------

   404

(1 строка)

2) Бколько имССтся систСмных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²? Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ запрос:

postgres=# select count(name) from pg_settings where name not like '%.%';

 count

-------

   371

(1 строка)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… имССтся Ρ‚ΠΎΡ‡ΠΊΠ° относятся ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ, прилоТСниям (customized options, внСсистСмныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ настройки) ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство. Π—Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

3) КакиС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π±Ρ‹Π»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹?

postgres=# show shared_preload_libraries;

            shared_preload_libraries            

------------------------------------------------

 pg_store_plans,pg_stat_statements,auto_explain

(1 строка)

Π‘Ρ‹Π»ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ Ρ‚Ρ€ΠΈ модуля.

4) Бколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ (Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ) ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΅ΡΡ‚ΡŒ? Π’ Π½Π°Π·Π²Π°Π½ΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ°. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ запрос:

postgres=# select distinct split_part(name,'.', 1), count(name) from pg_settings where name like '%.%' group by split_part(name,'.', 1) order by 1;

     split_part     | count

--------------------+-------

 auto_explain       |    13

 pg_stat_statements |     5

 pg_store_plans     |    15

(3 строк)

5) КакиС ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²? Π­Ρ‚ΠΎ интСрСсно Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° с Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒΡŽ (сколько Π±Π°ΠΉΡ‚ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅). Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ запрос:

postgres=# select vartype, min_val, max_val, count(name) from pg_settings group by vartype, min_val, max_val order by length(max_val) desc, vartype;

 vartype |   min_val   |       max_val       | count

---------+-------------+---------------------+-------

 bool    |             |                     |   122

 enum    |             |                     |    44

 string  |             |                     |    68

 int64   | 10000       | 9223372036854775807 |     1

 int64   | 100000      | 9223372036854775807 |     1

 int64   | 0           | 9223372036854775807 |     4

 real    | -1          | 1.79769e+308        |     3

 real    | 0           | 1.79769e+308        |     7

 int64   | 0           | 2100000000          |     2

 integer | 100         | 1073741823          |     2

 integer | -1          | 2147483647          |    13

 integer | 1           | 2147483647          |     6

 integer | -2147483648 | 2147483647          |     1

 integer | -1          | 1073741823          |     2

...

Для продолТСния Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <z>.

МаксимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ int64: 9223372036854775807 = 2 Π² стСпСни 63 минус 1, Ρ‡Ρ‚ΠΎ соотвСтствуСт максимуму для цСлочислСнного Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒΡŽ 64 Π±ΠΈΡ‚Π°.

Π£ Ρ‚ΠΈΠΏΠΎΠ² с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ integer ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2147483647, Ρ‡Ρ‚ΠΎ соотвСтствуСт максимуму для цСлочислСнного Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒΡŽ 32 Π±ΠΈΡ‚Π°.

6) ΠšΠΎΠ½Ρ‚Скст ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ссли ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΠΌ способом. КакиС контСксты ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΅ΡΡ‚ΡŒ ΠΈ сколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ контСкстС?


postgres=# select context, count(name) from pg_settings where name not like '%.%' group by context order by 1;

      context      | count

-------------------+-------

 backend           |     2

 internal          |    18

 postmaster        |    64

 sighup            |    96

 superuser         |    44

 superuser-backend |     4

 user              |   143

(7 строк)

Π‘ΠΎΠ»ΡŒΡˆΠ΅ всСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² контСкста user. Π˜Π·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² контСкста postmaster ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ рСстарт экзСмпляра. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ контСкста internal Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния (Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ SET, ALTER SYSTEM, ΠΏΡƒΡ‚Π΅ΠΌ установки значСния Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ) ΠΈ ΠΈΡ… Π½Π΅Ρ‚ смысла ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ΠœΠΎΠ³ΡƒΡ‚ Π»ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² контСкста internal? ΠœΠΎΠ³ΡƒΡ‚. Бпособ измСнСния зависит ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. НапримСр, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° wal_segment_size ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_resetwal, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° data_checksums ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_checksums.

7) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΅ΡΡ‚ΡŒ:

postgres=# select category, count(*) from pg_settings group by category order by 2 desc;

                             category                              | count

-------------------------------------------------------------------+-------

 Customized Options                                                |    33

 Client Connection Defaults / Statement Behavior                   |    31

 Developer Options                                                 |    25

 Resource Usage / Memory                                           |    22

 Query Tuning / Planner Method Configuration                       |    22

 Reporting and Logging / What to Log                               |    21

 Preset Options                                                    |    18

 Write-Ahead Log / Settings                                        |    15

 Connections and Authentication / SSL                              |    14

 Query Tuning / Planner Cost Constants                             |    13

 Reporting and Logging / Where to Log                              |    13

 Autovacuum                                                        |    13

 Client Connection Defaults / Locale and Formatting                |    12

 Connections and Authentication / Connection Settings              |    11

 Replication / Standby Servers                                     |    11

 Resource Usage / Asynchronous Behavior                            |     9

 Write-Ahead Log / Recovery Target                                 |     8

 Query Tuning / Other Planner Options                              |     8

 Statistics / Cumulative Query and Index Statistics                |     7

 Query Tuning / Genetic Query Optimizer                            |     7

 Reporting and Logging / When to Log                               |     7

 Connections and Authentication / Authentication                   |     7

 Version and Platform Compatibility / Previous PostgreSQL Versions |     7

 Replication / Sending Servers                                     |     6

 Write-Ahead Log / Checkpoints                                     |     6

 Lock Management                                                   |     5

 Statistics / Monitoring                                           |     5

 File Locations                                                    |     5

 Connections and Authentication / TCP Settings                     |     5

 Resource Usage / Cost-Based Vacuum Delay                          |     5

 Error Handling                                                    |     4

 Client Connection Defaults / Shared Library Preloading            |     4

 Resource Usage / Background Writer                                |     4

 Write-Ahead Log / Archiving                                       |     4

 Client Connection Defaults / Other Defaults                       |     3

 Write-Ahead Log / Archive Recovery                                |     3

 Replication / Subscribers                                         |     3

 Write-Ahead Log / Recovery                                        |     2

 Reporting and Logging / Process Title                             |     2

 Version and Platform Compatibility / Other Platforms and Clients  |     1

 Resource Usage / Kernel Resources                                 |     1

 Replication / Primary Server                                      |     1

 Resource Usage / Disk                                             |     1

(43 строки)

Для продолТСния Π²Ρ‹Π²ΠΎΠ΄Π° (вмСсто ΠΏΡ€ΠΎΠΌΠΏΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅) ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ клавиши <z><q>.

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ Customized Options - это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

8) Бколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² установлСно Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ?

postgres=# select sourcefile, count(*) from pg_settings group by sourcefile;

                             sourcefile                              | count

---------------------------------------------------------------------+-------

                                                                     |   384

 /var/lib/postgresql/tantor-se-16-replica/data1/postgresql.conf      |    14

 /var/lib/postgresql/tantor-se-16-replica/data1/postgresql.auto.conf |     6

(3 строки)

Π’ Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ установлСно 14+6=20 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

9) Π’ Ρ„Π°ΠΉΠ»Π΅ postgresql.conf Π±ΠΎΠ»ΡŒΡˆΠΎΠ΅ количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ ΠΎΡ‚ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ - это короткая, качСствСнная, удобная (ΠΏΠΎΠ΄ Ρ€ΡƒΠΊΠΎΠΉ) справка.

КакиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ считаны ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΡ€ΠΈ запускС экзСмпляра?

postgres=# select name, setting, sourceline from pg_settings where sourcefile like '%l.conf' order by sourceline;

            name            |                    setting                     | sourceline

----------------------------+------------------------------------------------+------------

 max_connections            | 100                                            |         65

 shared_buffers             | 16384                                          |        131

 dynamic_shared_memory_type | posix                                          |        154

 min_wal_size               | 80                                             |        258

 log_timezone               | Europe/Moscow                                  |        613

 DateStyle                  | ISO, DMY                                       |        727

 TimeZone                   | Europe/Moscow                                  |        729

 lc_messages                | ru_RU.UTF-8                                    |        743

 lc_monetary                | ru_RU.UTF-8                                    |        745

 lc_numeric                 | ru_RU.UTF-8                                    |        746

 lc_time                    | ru_RU.UTF-8                                    |        747

 default_text_search_config | pg_catalog.russian                             |        753

 shared_preload_libraries   | pg_stat_statements,pg_store_plans,auto_explain |        834

 logging_collector          | on                                             |        835

(14 ΡΡ‚Ρ€ΠΎΠΊ)

sourceline - Π½ΠΎΠΌΠ΅Ρ€ строки ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Ρ„Π°ΠΉΠ»Π°. НомСр строки ΡƒΠ΄ΠΎΠ±Π΅Π½ для поиска ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π΅Π³ΠΎ рСдактирования.

Π’Ρƒ ΠΆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² прСдставлСнии pg_file_settings.

10) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# select name, setting, sourceline, applied from pg_file_settings where sourcefile like '%l.conf';

            name            |                    setting                     | sourceline | applied 

----------------------------+------------------------------------------------+------------+--

 max_connections            | 100                                            |         65 | t

 shared_buffers             | 128MB                                          |        131 | t

 dynamic_shared_memory_type | posix                                          |        154 | t

 max_wal_size               | 1GB                                            |        257 | f

 min_wal_size               | 80MB                                           |        258 | t

 log_timezone               | Europe/Moscow                                  |        613 | t

 datestyle                  | iso, dmy                                       |        727 | t

 timezone                   | Europe/Moscow                                  |        729 | t

 lc_messages                | ru_RU.UTF-8                                    |        743 | t

 lc_monetary                | ru_RU.UTF-8                                    |        745 | t

 lc_numeric                 | ru_RU.UTF-8                                    |        746 | t

 lc_time                    | ru_RU.UTF-8                                    |        747 | t

 default_text_search_config | pg_catalog.russian                             |        753 | t

 listen_addresses           | *                                              |        833 | f

 shared_preload_libraries   | pg_stat_statements,pg_store_plans,auto_explain |        834 | t

 logging_collector          | on                                             |        835 | t

(15 rows)

По ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ расхоТдСниС Π² количСствС строк, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14 ΠΈ 15?

Π’ pg_file_settings присутствуСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ max_wal_size. Π£ вас расхоТдСния ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ…. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ установлСн Π² Ρ„Π°ΠΉΠ»Π΅ postgresql.auto.conf.

11) ΠŸΡ€ΠΈΠΌΠ΅Ρ€ содСрТимого Ρ„Π°ΠΉΠ»ΠΎΠ²:

postgres=# \! cat $PGDATA/postgresql.conf | grep max_wal_size

max_wal_size = 1GB

postgres=# \! cat $PGDATA/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

listen_addresses = '*'

max_wal_size = '512MB'

max_slot_wal_keep_size = '1024MB'

Π’ ΠΎΠ±ΠΎΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… присутствуСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ max_wal_size. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ pg_file_settings Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ всС Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ· всСх Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ столбцС applied Π΄Π»Ρ 257 строки стоит "f" ΡΡ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ данная строка пСрСопрСдСляСтся ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкой с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (ΠΈΠ»ΠΈ строкой Π² Ρ„Π°ΠΉΠ»Π΅ postgresql.auto.conf ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пСрСопрСдСляСт значСния ΠΈΠ· postgresql.conf).Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ строку 257 ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π»Π° строка 4 ΠΈΠ· Ρ„Π°ΠΉΠ»Π° postgresql.auto.conf Π’ запросах ΠΌΡ‹ Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΈ содСрТимоС этого (postgresql.auto.conf) Ρ„Π°ΠΉΠ»Π° (ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ sourcefile like '%l.conf').

12) Π’ прСдставлСниях Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ имССтся ΠΌΠ½ΠΎΠ³ΠΎ столбцов ΠΈ ΠΏΡ€ΠΈ построчном Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅. МоТно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Π²Ρ‹Π²ΠΎΠ΄Π°. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

postgres=# select * from pg_settings where name = 'max_wal_size'\gx

-[ RECORD 1 ]---+--------------------------------------------------

name            | max_wal_size

setting         | 512

unit            | MB

category        | Write-Ahead Log / Checkpoints

short_desc      | Sets the WAL size that triggers a checkpoint.

extra_desc      |

context         | sighup

vartype         | integer

source          | configuration file

min_val         | 2

max_val         | 2147483647

enumvals        |

boot_val        | 1024

reset_val       | 512

sourcefile      | /var/lib/postgresql/tantor-se-16/data/postgresql.auto.conf

sourceline      | 4

pending_restart | f

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²ΠΈΠ΄Π½Ρ‹ всС Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: катСгория, ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ описаниС, контСкст.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ ΠΈΠ· 4 ΡΡ‚Ρ€ΠΎΠΊΠΈ Ρ„Π°ΠΉΠ»Π° postgresql.auto.conf

        


        13) ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±Π΅Π· ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°):

postgres=# select name, setting, substring(sourcefile, 39) file, sourceline, applied from pg_file_settings where name='max_wal_size';

     name     | setting |         file         | sourceline | applied

--------------+---------+----------------------+------------+---------

 max_wal_size | 1GB     | postgresql.conf      |        257 | f

 max_wal_size | 512MB   | postgresql.auto.conf |          4 | t

(2 строки)

        ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ pg_file_settings ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΡΠ΅ строки Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ,  Π³Π΄Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ нСпустыС строки). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько строк Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π΄Π°ΡŽΡ‚ΡΡ значСния этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, это Π½Π΅ являСтся ошибкой, хотя этого стоит ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ нСоднозначности).

        ΠŸΡ€ΠΈ запускС экзСмпляра (ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π±Π΅Π· рСстарта экзСмпляра) примСняСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° postgresql.auto.conf ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ΄Ρ‘Ρ‚ самым послСдним. Π’ этом Ρ„Π°ΠΉΠ»Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ повторСния, ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, pg_basebackup), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ строки Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°, зная Ρ‡Ρ‚ΠΎ установлСнноС Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π²Π°Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

        Π•ΡΠ»ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ postgresql.auto.conf ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ отсутствуСт, Ρ‚ΠΎ примСняСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ Ρ„Π°ΠΉΠ»Π° postgresql.conf.

        ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ pg_settings ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ строку для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Ρƒ, которая ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π°.

Π’ столбцС pending_restart Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "t" ΠΏΠΎΡΠ²ΠΈΡ‚ся, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ρ„Π°ΠΉΠ»Ρ‹ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Π½Ρ‹ (Π±Π΅Π· пСрСчитывания содСрТимоС pg_settings Π½Π΅ мСняСтся) ΠΈ послС пСрСчитывания трСбуСтся пСрСзапуск экзСмпляра (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° context=postmaster). Π’ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ pending_restart="f".

        Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ pg_settings ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ pg_file_settings ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ содСрТимоС Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π² столбцС error ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π΅Ρ‚ Π»ΠΈ ошибок послС рСдактирования Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ нСвозмоТности запуска экзСмпляра.

        14) Ошибок Π² этих Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π΅Ρ‚, Ссли запрос Ρ‚ΠΈΠΏΠ°
select sourcefile, sourceline, error from pg_file_settings where error is not null Π½Π΅ выдаст Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки.

        Π•ΡΠ»ΠΈ запрос выдаст ΠΎΠ΄Π½Ρƒ строку, это Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ошибка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС, ошибок ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ. ПослС исправлСния ошибки Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ запрос добиваясь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ запрос Π½Π΅ Π²Ρ‹Π΄Π°Π» Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибки ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ нСвозмоТности запуска экзСмпляра послС Π΅Π³ΠΎ остановки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ (Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ этого ΠΏΡƒΠ½ΠΊΡ‚Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ):

ошибка Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

postgres=# \! cat $PGDATA/postgresql.auto.conf | grep max_wal

max_wal_size = '512mB'

postgres=# select substring(sourcefile, 39) file, sourceline, error from pg_file_settings where error is not null;

         file         | sourceline |            error            

----------------------+------------+------------------------------

 postgresql.auto.conf |          4 | setting could not be applied

(1 строка)

        ΠΠ΅ исправив ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ошибка Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

postgres=# \! cat $PGDATA/postgresql.conf | grep 512MB

max_wol_size = 512MB

postgres=# select substring(sourcefile, 39) file, sourceline, error from pg_file_settings where error is not null;

      file       | sourceline |                error                

-----------------+------------+--------------------------------------

 postgresql.conf |        836 | unrecognized configuration parameter

(1 строка)

НС исправив ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ошибки Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ошибка Π² синтаксисС строки:

postgres=# \! cat $PGDATA/postgresql.conf | grep max_wol

max_wol_size = 512MB

max_wol_size - 512MB

postgres=# select substring(sourcefile, 39) file, sourceline, error from pg_file_settings where error is not null;

      file       | sourceline |    error    

-----------------+------------+--------------

 postgresql.conf |        837 | syntax error

(1 строка)

        Π•ΡΠ»ΠΈ Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΈΠ· пСрСчислСнных ошибок Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ экзСмпляр Π½Π΅ смоТСт Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ послС остановки ΠΈΠ»ΠΈ Π² процСссС пСрСзапуска:

postgres@tantor:~$ sudo systemctl restart tantor-se-server-16

Job for tantor-se-server-16.service failed because the control process exited with error code.

See "systemctl status tantor-se-server-16.service" and "journalctl -xe" for details.

Ошибки "setting could not be applied" Π½Π΅ всСгда ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска экзСмпляра.

Π§Π°ΡΡ‚ΡŒ 2. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ измСрСния

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ измСрСния.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ свойства ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° shared_buffers

postgres=# select * from pg_settings where name = 'shared_buffers' \gx

-[ RECORD 1 ]---+-----------------------------------------------------

name            | shared_buffers

setting         | 16384

unit            | 8kB

category        | Resource Usage / Memory

short_desc      | Sets the number of shared memory buffers used by the server.

extra_desc      |

context         | postmaster

vartype         | integer

source          | configuration file

min_val         | 16

max_val         | 1073741823

enumvals        |

boot_val        | 16384

reset_val       | 16384

sourcefile      | /var/lib/postgresql/tantor-se-16/data/postgresql.conf

sourceline      | 131

pending_restart | f

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ измСряСтся Π² Π±Π»ΠΎΠΊΠ°Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 8Кб. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ цСлочислСнный.

2) УстановитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° 12800:

        

postgres=# alter system set shared_buffers = 12800;

ALTER SYSTEM

3) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ записано Π² Ρ„Π°ΠΉΠ» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

postgres=# \! cat $PGDATA/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

...

shared_buffers = '12800'

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΎ Π±Π΅Π· апострофов, Π² Ρ„Π°ΠΉΠ»Π΅ Π±Ρ‹Π»ΠΎ установлСно Π² апострофах.

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π΅Ρ‚ Π»ΠΈ ошибок Π² установлСнном Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

postgres=# select substring(sourcefile, 39) file, sourceline, error from pg_file_settings where error is not null;

         file         | sourceline |            error            

----------------------+------------+------------------------------

 postgresql.auto.conf |          6 | setting could not be applied

(1 строка)

Ошибка ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ значСния с Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ измСрСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ '100MB'.

ЭкзСмпляр ΠΏΡ€ΠΈ этом ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ пСрСзапустится ΠΈ ошибка исчСзнСт.

4) ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ контСкст postmaster, Π·Π½Π°Ρ‡ΠΈΡ‚ для измСнСния значСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ рСстарт экзСмпляра. ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚Π΅ экзСмпляр:

postgres=# \q

postgres@tantor:~$ sudo systemctl restart tantor-se-server-16

[sudo] password for postgres: postgres

postgres@tantor:~$ psql

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° послС рСстарта экзСмпляра:

postgres=# show shared_buffers;

 shared_buffers

----------------

 100MB

(1 строка)

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выдаётся Π² ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π°Ρ…. Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ '12800'.

12800 * 8192 (8Кб) = 104857600. 104857600 / 1024 / 1024 = 100. 12800 Π±Π»ΠΎΠΊΠΎΠ² - это Ρ€ΠΎΠ²Π½ΠΎ 100ΠœΠ‘.

6) Π‘Π΅Π· Π΅Π΄ΠΈΠ½ΠΈΡ† измСрСния этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ измСряСтся Π² Π±Π»ΠΎΠΊΠ°Ρ….

Установим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π°Ρ…. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# alter system set shared_buffers = 100mb;

ERROR:  trailing junk after numeric literal at or near "100m"

БВРОКА 1: alter system set shared_buffers = 100mb;

                                            ^

НС получаСтся. Для Π΅Π΄ΠΈΠ½ΠΈΡ† измСрСния Π²Π°ΠΆΠ΅Π½ рСгистр. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# alter system set shared_buffers = 100MB;

ERROR:  trailing junk after numeric literal at or near "100M"

БВРОКА 1: alter system set shared_buffers = 100MB;

                                            ^

НС получаСтся. ΠŸΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ апострофы:

postgres=# alter system set shared_buffers = '100MB';

ALTER SYSTEM

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ.

Π’Ρ‹ выполняли нСсколько Ρ€Π°Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π²Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ: Π²Π°ΠΆΠ΅Π½ рСгистр Π΅Π΄ΠΈΠ½ΠΈΡ† измСрСния ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ апострофы. НС Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠ² этого для этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° часто ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ввСсти число, ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ полагая, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ задаётся Π² Π±Π°ΠΉΡ‚Π°Ρ… (Π° ΠΎΠ½ΠΎ Π² Π±Π»ΠΎΠΊΠ°Ρ…) ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΡƒ памяти ΠΏΡ€ΠΈ рСстартС экзСмпляра.

ΠœΠ΅ΠΆΠ΄Ρƒ числом ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ измСрСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ это Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ошибок. НапримСр (Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ):

postgres=# alter system set shared_buffers = '100       MB';

postgres=# \! cat $PGDATA/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

listen_addresses = '*'

max_wal_size = '512MB'

max_slot_wal_keep_size = '1024MB'

shared_buffers = '100       MB'

ΠŸΡ€ΠΎΠ±Π΅Π»Ρ‹ ΡƒΡ…ΡƒΠ΄ΡˆΠ°ΡŽΡ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ.

7) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ записано Π² Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ значСния с Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ измСрСния ΠΈ Π² апострофах:

postgres=# \! cat $PGDATA/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

..

shared_buffers = '100MB'

8) Π£Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ· postgresql.auto.conf ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ shared_buffers:

postgres=# alter system reset shared_buffers;

ALTER SYSTEM

postgres=# \! cat $PGDATA/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

&hellip;

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ (Ссли ΠΈΡ… Π±Ρ‹Π»ΠΎ нСсколько, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ) с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ shared_buffers исчСзнут.

Π’ этом ΠΏΡƒΠ½ΠΊΡ‚Π΅ ΠΌΡ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΡƒΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ· postgresql.auto.conf.

Π§Π°ΡΡ‚ΡŒ 3. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ логичСского Ρ‚ΠΈΠΏΠ°

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ логичСского Ρ‚ΠΈΠΏΠ° (bool).

postgres=# select * from pg_settings where name = 'hot_standby_feedback'\gx

-[ RECORD 1 ]---+---------------------------------------------------------

name            | hot_standby_feedback

setting         | off

unit            |

category        | Replication / Standby Servers

short_desc      | Allows feedback from a hot standby to the primary that will avoid query conflicts.

extra_desc      |

context         | sighup

vartype         | bool

source          | default

min_val         |

max_val         |

enumvals        |

boot_val        | off

reset_val       | off

sourcefile      |

sourceline      |

pending_restart | f

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ sighup ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ для примСнСния Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния достаточно ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

2) Β«Π’ΠΊΠ»ΡŽΡ‡ΠΈΠΌΒ» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ установим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² true:

postgres=# alter system set hot_standby_feedback = o;

ERROR:  parameter "hot_standby_feedback" requires a Boolean value

Ошибка ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ нСльзя ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Π’ качСствС значСния Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ on ΠΈ off.

postgres=# alter system set hot_standby_feedback = on;

ALTER SYSTEM

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ on допустимо для логичСских ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ допустимы ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния:

postgres=# alter system set hot_standby_feedback = 1;

ALTER SYSTEM

postgres=# alter system set hot_standby_feedback = '1';

ALTER SYSTEM

Π•Π΄ΠΈΠ½ΠΈΡ†Π° Ρ‚ΠΎΠΆΠ΅ допустима.

postgres=# alter system set hot_standby_feedback = tr;

ALTER SYSTEM

Π”ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ сокращСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π½Π΅Ρ‚ нСоднозначности.

ΠΠ΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° с сокращСниСм Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ "o".

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ записано Π² Ρ„Π°ΠΉΠ» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

postgres=# \! cat $PGDATA/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

..

hot_standby_feedback = 'tr'

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² сокращСнном Π²ΠΈΠ΄Π΅ Π±Ρ‹Π»ΠΎ записано Π² апострофах.

БокращСния Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹ для чтСния. Для логичСских ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ каноничСскиС значСния on, off.

4) ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ:

postgres=# select pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 строка)

postgres=# show hot_standby_feedback;

 hot_standby_feedback

----------------------

 on

(1 строка)

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π§Π°ΡΡ‚ΡŒ 4. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

Β«ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΒ» (settings) ΠΈ Β«ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹Β» (config) созвучны. Π’ этой части ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ рассмотрим Β«ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹Β».

Π•ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ способа ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки pg_config, прСдставлСниС pg_config ΠΈ функция pg_config().

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_config:

postgres@tantor:~$ pg_config --help

pg_config прСдоставляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± установлСнной вСрсии PostgreSQL.

ИспользованиС:

  pg_config [ΠŸΠΠ ΠΠœΠ•Π’Π ]...

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  --bindir            ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ²

  --docdir            ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ

  --htmldir           ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС HTML-Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ

  --includedir        ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ²-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² (.h) для

                      клиСнтских интСрфСйсов Π½Π° языкС C

  --pkgincludedir     ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² (.h)

  --includedir-server ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ²-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² (.h) для сСрвСра

  --libdir            ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°

  --pkglibdir         ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

  --localedir         ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² описания Π»ΠΎΠΊΠ°Π»Π΅ΠΉ

  --mandir            ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС справочных страниц

  --sharedir          ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎ-нСзависимых Ρ„Π°ΠΉΠ»ΠΎΠ²

  --sysconfdir        ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС общСсистСмных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

  --pgxs              ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ располоТСниС makefile для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

  --configure         ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ скрипта "configure", с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ

                      Π±Ρ‹Π» собран PostgreSQL

  --cc                ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ CC собран PostgreSQL

  --cppflags          ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ CPPFLAGS собран PostgreSQL

  --cflags            ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌΠΈ Ρ„Π»Π°Π³Π°ΠΌΠΈ C собран PostgreSQL

  --cflags_sl         ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ CFLAGS_SL собран PostgreSQL

  --ldflags           ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ LDFLAGS собран PostgreSQL

  --ldflags_ex        ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ LDFLAGS_EX собран PostgreSQL

  --ldflags_sl        ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ LDFLAGS_SL собран PostgreSQL

  --libs              ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ LIBS собран PostgreSQL

  --version           ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ PostgreSQL

  -?, --help          ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ эту справку ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ

ΠŸΡ€ΠΈ запускС Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² выводятся всС извСстныС значСния.

Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ сборкС Π‘Π£Π‘Π” Π’Π°Π½Ρ‚ΠΎΡ€ ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. Они ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ для сборок BE, SE, SE1C. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ названия Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΈ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ слоТно, Ρ‚ΠΎ польза ΠΎΡ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_config Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ зная Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ.

2) ЗапуститС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° выдаст значСния всСх ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

postgres@tantor:~$ pg_config

BINDIR = /opt/tantor/db/16/bin

DOCDIR = /opt/tantor/db/16/share/doc/postgresql

HTMLDIR = /opt/tantor/db/16/share/doc/postgresql

INCLUDEDIR = /opt/tantor/db/16/include

PKGINCLUDEDIR = /opt/tantor/db/16/include/postgresql

INCLUDEDIR-SERVER = /opt/tantor/db/16/include/postgresql/server

LIBDIR = /opt/tantor/db/16/lib

PKGLIBDIR = /opt/tantor/db/16/lib/postgresql

LOCALEDIR = /opt/tantor/db/16/share/locale

MANDIR = /opt/tantor/db/16/share/man

SHAREDIR = /opt/tantor/db/16/share/postgresql

SYSCONFDIR = /opt/tantor/db/16/etc/postgresql

PGXS = /opt/tantor/db/16/lib/postgresql/pgxs/src/makefiles/pgxs.mk

CONFIGURE =  '--prefix=/opt/tantor/db/16' '--enable-tap-tests' '--enable-nls=en ru' '--with-python' '--with-icu' '--with-lz4' '--with-zstd' '--with-ssl=openssl' '--with-ldap' '--with-pam' '--with-uuid=e2fs' '--with-libxml' '--with-libxslt' '--with-gssapi' '--with-selinux' '--with-systemd' '--with-llvm' 'CFLAGS=-O2 -pipe -Wno-missing-braces' 'LLVM_CONFIG=/usr/bin/llvm-config-11' 'CLANG=/usr/bin/clang-11' 'PYTHON=/usr/bin/python3'

CC = gcc

CPPFLAGS = -D_GNU_SOURCE -I/usr/include/libxml2

CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wshadow=compatible-local -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -O2 -pipe -Wno-missing-braces

CFLAGS_SL = -fPIC

LDFLAGS = -L/usr/lib/llvm-11/lib -Wl,--as-needed -Wl,-rpath,'/opt/tantor/db/16/lib',--enable-new-dtags

LDFLAGS_EX =

LDFLAGS_SL =

LIBS = -lpgcommon -lpgport -lselinux -lzstd -llz4 -lxslt -lxml2 -lpam -lssl -lcrypto -lgssapi_krb5 -lz -lreadline -lpthread -lrt -ldl -lm

VERSION = PostgreSQL 16.1

ΠœΠ΅ΡΡ‚ΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с внСшними Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹ΠΌΠΈ модулями, PKGLIBDIR) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --pkglibdir.

3) Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ запускС экзСмпляра ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ shared_preload_libraries ΠΈΠ»ΠΈ, Ссли Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ запускС экзСмпляра, Π½ΠΎ ΠΈ динамичСски сСрвСрным процСссом, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ LOAD 'имя_Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ';

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ доступны:

postgres@tantor:~$ ls $(pg_config --pkglibdir)

adminpack.so            latin_and_mic.so       pg_visibility.so

amcheck.so              libpqwalreceiver.so    pg_wait_sampling.so

auth_delay.so           llvmjit.so             pg_walinspect.so

auto_explain.so         llvmjit_types.bc       pgxml.so

autoinc.so              lo.so                  pgxs

basebackup_to_shell.so  ltree_plpython3.so     plpgsql.so

basic_archive.so        ltree.so               plpython3.so

bitcode                 moddatetime.so         postgres_fdw.so

bloom.so                old_snapshot.so        refint.so

btree_gin.so            orafce.so              seg.so

btree_gist.so           pageinspect.so         sepgsql.so

citext.so               page_repair.so         sslinfo.so

credcheck.so            passwordcheck.so       tablefunc.so

cube.so                 pgauditlogtofile.so    tcn.so

cyrillic_and_mic.so     pgaudit.so             test_decoding.so

dblink.so               pg_background.so       tsm_system_rows.so

dict_int.so             pg_buffercache.so      tsm_system_time.so

dict_snowball.so        pg_columnar.so         unaccent.so

dict_xsyn.so            pg_cron.so             utf8_and_big5.so

earthdistance.so        pgcrypto.so            utf8_and_cyrillic.so

euc2004_sjis2004.so     pg_freespacemap.so     utf8_and_euc2004.so

euc_cn_and_mic.so       pg_hint_plan.so        utf8_and_euc_cn.so

euc_jp_and_sjis.so      pgoutput.so            utf8_and_euc_jp.so

euc_kr_and_mic.so       pg_partman_bgw.so      utf8_and_euc_kr.so

euc_tw_and_big5.so      pg_prewarm.so          utf8_and_euc_tw.so

file_fdw.so             pgq_lowlevel.so        utf8_and_gb18030.so

fuzzystrmatch.so        pgq_triggers.so        utf8_and_gbk.so

hstore_plpython3.so     pg_qualstats.so        utf8_and_iso8859_1.so

hstore.so               pg_repack.so           utf8_and_iso8859.so

http.so                 pgrowlocks.so          utf8_and_johab.so

hypopg.so               pg_stat_statements.so  utf8_and_sjis2004.so

insert_username.so      pgstattuple.so         utf8_and_sjis.so

_int.so                 pg_store_plans.so      utf8_and_uhc.so

isn.so                  pg_surgery.so          utf8_and_win.so

jsonb_plpython3.so      pg_trgm.so             uuid-ossp.so

latin2_and_win1250.so   pg_variables.so

4) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ раздСляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ динамичСски. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pg_hint_plan:

postgres=# show pg_hint_plan.enable_hint;

ERROR:  unrecognized configuration parameter "pg_hint_plan.enable_hint"

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ процСсс Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ Π±Ρ‹Π» Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π½ΠΈ сСрвСрным процСссом, Π½ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ экзСмпляра. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ сСрвСрного процСсса, ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сСссию:

postgres=# LOAD 'pg_hint_plan';

LOAD

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»Π°ΡΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ сСрвСрного процСсса, ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ сСссию, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»Π° Π΄Π°Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°. Π’ этой сСссии ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ модуля.

5) Π’ частности, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² сСссии доступны ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ модуля. ΠŸΡ€ΠΈ Π½Π°Π±ΠΎΡ€Π΅ тСкста ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ табуляции Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ <TAB>, psql ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π·Π° вас Π½Π°Π±ΠΎΡ€ тСкста Ссли Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΉ Π½Π΅Ρ‚, Π° ΠΏΡ€ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ список Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

НабСритС show pg_hint<TAB>.<TAB>:

postgres=# show pg_hint_plan.enable_hint;

 pg_hint_plan.enable_hint

--------------------------

 on

(1 строка)

6) Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ просмотра ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

postgres=# \dconfig pg_hint_plan.*

      Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

            ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€            | Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

--------------------------------+----------

 pg_hint_plan.debug_print       | off

 pg_hint_plan.enable_hint       | on

 pg_hint_plan.enable_hint_table | off

 pg_hint_plan.hints_anywhere    | off

 pg_hint_plan.message_level     | log

 pg_hint_plan.parse_messages    | info

(6 строк)

ΠŸΡ€ΠΈ инсталляции Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ PKGLIBDIR ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ динамичСски Π»ΠΈΠ½ΠΊΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (*.so), Ссли Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ содСрТит раздСляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Вторая полСзная дирСктория ΠΏΡ€ΠΈ администрировании Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ это SHAREDIR. Π’ эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ CREATE EXTENSION.

7) Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ кластСра ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ установкС Π² Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…:

postgres@tantor:~$ ls $(pg_config --sharedir)/extension | grep .control

adminpack.control

amcheck.control

...

xml2.control

8) Бписок Ρ‚Π΅Ρ… ΠΆΠ΅ самых Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² прСдставлСнии pg_available_extensions:

postgres=# select count(*) from pg_available_extensions;

 count

-------

    69

9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ прСдставлСния:

postgres=# \sv pg_available_extensions

CREATE OR REPLACE VIEW pg_catalog.pg_available_extensions AS

 SELECT e.name,

    e.default_version,

    x.extversion AS installed_version,

    e.comment

   FROM pg_available_extensions() e(name, default_version, comment)

     LEFT JOIN pg_extension x ON e.name = x.extname

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pg_available_extensions(), ΠΊΠΎΡ‚орая Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ содСрТимоС Ρ„Π°ΠΉΠ»ΠΎΠ² *.control Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ SHAREDIR.

9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

postgres=# \sf pg_available_extensions()

CREATE OR REPLACE FUNCTION pg_catalog.pg_available_extensions(OUT name name, OUT default_version text, OUT comment text)

 RETURNS SETOF record

 LANGUAGE internal

 STABLE PARALLEL SAFE STRICT COST 10 ROWS 100

AS $function$pg_available_extensions$function$

Командой \sv Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ тСксты прСдставлСний: Командой \sf Ρ‚Сксты ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π² Ρ‚ΠΎΠΌ числС систСмного ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

Π§Π°ΡΡ‚ΡŒ 5. Π€Π°ΠΉΠ» слуТб

Если Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ затруднСния с ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π° ΠΈΠ·-Π·Π° ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈΠ»ΠΈ с Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‚ΠΎ эту Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ, Π° ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π½ΠΈΠΆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΊΠ°ΠΊΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ SYSCONFDIR. Π’ этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ находятся Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

postgres@tantor:~$ pg_config --sysconfdir

/opt/tantor/db/16/etc/postgresql

2) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ:

postgres@tantor:~$ sudo mkdir /opt/tantor/db/16/etc

postgres@tantor:~$ sudo chown postgres.postgres /opt/tantor/db/16/etc

postgres@tantor:~$ mkdir /opt/tantor/db/16/etc/postgresql

3) Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ (ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΠ΄Π½ΠΎΠΉ строкой):

postgres@tantor:~$ cp $(pg_config --sharedir)/pg_service.conf.sample $(pg_config --sysconfdir)/pg_service.conf

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ содСрТимоС Ρ„Π°ΠΉΠ»Π° слуТб:

postgres@tantor:~$ cat $(pg_config --sysconfdir)/pg_service.conf

#

#       Connection configuration file

#

# A service is a set of named connection parameters.  You may specify

# multiple services in this file.  Each starts with a service name in

# brackets.  Subsequent lines have connection configuration parameters of

# the pattern "param=value" or LDAP URLs starting with "ldap://"

# to look up such parameters.  A sample configuration for postgres is

# included in this file.  Lines beginning with '#' are comments.

#

# Copy this to your sysconf directory (typically /usr/local/pgsql/etc) and

# rename it pg_service.conf.

#

#

#[postgres]

#dbname=postgres

#user=postgres

5) ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» /opt/tantor/db/16/etc/postgresql/pg_service.conf:

postgres@tantor:~$ mcedit /opt/tantor/db/16/etc/postgresql/pg_service.conf

6) Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Ρ„Π°ΠΉΠ» строки:

[postgres]

dbname=postgres

user=postgres

host=/var/run/postgresql

port=5432

Π’Π΅ΠΏΠ΅Ρ€ΡŒ имССтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ слуТбы с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«postgresΒ». МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ нСсколько слуТб Π² этом Ρ„Π°ΠΉΠ»Π΅. Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ host ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ IP-адрСс ΠΈΠ»ΠΈ имя хоста. ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся локальноС соСдинСниС Ρ‡Π΅Ρ€Π΅Π· Unix-сокСт.

7) Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ этим ΠΈΠΌΠ΅Π½Π΅ΠΌ слуТбы для соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres@tantor:~$ psql service=postgres

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=# \conninfo

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5432"

Если Π² Ρ„Π°ΠΉΠ»Π΅ слуТб Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚ ΠΊΠ°ΠΊ 5435, Ρ‚ΠΎ выдастся ошибка:

postgres@tantor:~$ psql service=postgres

psql: ошибка: ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру Ρ‡Π΅Ρ€Π΅Π· сокСт "/var/run/postgresql/.s.PGSQL.5435" Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ: НСт Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

Π‘Π΅Ρ€Π²Π΅Ρ€ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ локально ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· этот сокСт?

8) Π€Π°ΠΉΠ» слуТб Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы (~/.pg_service.conf) Π’ΠΎΡ‡ΠΊΠ° Π² Π½Π°Ρ‡Π°Π»Π΅ названия Ρ„Π°ΠΉΠ»Π° Π½ΡƒΠΆΠ½Π°.

ДирСктория SYSCONFDIR Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ„Π°ΠΉΠ»Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ "psqlrc". ΠŸΡ€ΠΈ запускС Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° -X ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° psql ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈ выполняСт ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· "psqlrc", Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ~/.psqlrc (Ссли эти Ρ„Π°ΠΉΠ»Ρ‹ Π΅ΡΡ‚ΡŒ). Π­Ρ‚ΠΈΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для настройки свойств сСссии psql.


Π Π°Π·Π΄Π΅Π» 4. Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

ЛогичСская структура кластСра

  1. Установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях

  2. Установка ΠΏΡƒΡ‚ΠΈ поиска Π² функциях ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…

Π§Π°ΡΡ‚ΡŒ 1. Установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях

ЦСль этой части ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях, ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ ΠΏΡ€Π΅Π²Π°Π»ΠΈΡ€ΡƒΡŽΡ‚.

1) УстановитС ΠΏΡ€ΠΎΠΌΠΏΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создана сСссия (тСкст послС \set Π²Π²ΠΎΠ΄ΠΈΡ‚ся ΠΎΠ΄Π½ΠΎΠΉ строкой):

postgres=# \set PROMPT1 '%[%033[0;31m%]%n%[%033[0m%]@%[%033[0;36m%]%/%[%033[0m%] %[%033[0;33m%]%[%033[5m%]%x%[%033[0m%]%[%033[0m%]%R%# '

postgres=# \set PROMPT2 '%[%033[0;31m%]%n%[%033[0m%]@%[%033[0;36m%]%/%[%033[0m%] %[%033[0;33m%]%[%033[5m%]%x%[%033[0m%]%[%033[0m%]%R%# '

2) Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° postgresql.conf ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:

postgres=# \! echo "my.level = 'Pgconf'" >> $PGDATA/postgresql.conf

ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Π²Π΅ ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скоби, Π° Π½Π΅ ΠΎΠ΄Π½Ρƒ: >> ΠΈΠ½Π°Ρ‡Π΅ Π·Π°Ρ‚Ρ€Ρ‘Ρ‚Π΅ содСрТимоС Ρ„Π°ΠΉΠ»Π°.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ my.level ΡΡ‚ΠΎ Β«ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ прилоТСния», имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ сами ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π»ΠΈ. Π’ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ°, ΠΈΠ½Π°Ρ‡Π΅ экзСмпляр Π½Π΅ запустится.

Если Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² postgresql.conf ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ALTER SYSTEM SET my.level = 'строка'; выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ:

ERROR:  unrecognized configuration parameter "my.level"

Вакая ошибка выдаётся, Ссли с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° запуска экзСмпляра Π½Π΅ Π±Ρ‹Π»Π° Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π° раздСляСмая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая Π±Ρ‹ зарСгистрировала Π±Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° осущСствляСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ shared_preload_libraries ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ LOAD.

3) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ строка добавилась:

postgres=# \! tail -n 1 $PGDATA/postgresql.conf

my.level = 'Pgconf'

5) ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

postgres=# select pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 строка)

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ (context) ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΅ΡΡ‚ΡŒ:

postgres=# select distinct context from pg_settings;

      context      

-------------------

 postmaster

 superuser-backend

 user

 internal

 backend

 sighup

 superuser

(7 строк)

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠ° "user" ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° всСх уровнях. Однако, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΡŽΠ°Π½ΡΡ‹. НапримСр, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ application_name ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ клиСнтскоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ послС создания сСссии. Для ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ psql ΡΡ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ psql. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ кластСра, Π±Π°Π·Ρ‹, Ρ€ΠΎΠ»ΠΈ, Ρ€ΠΎΠ»ΠΈ Π² Π±Π°Π·Π΅ бСссмыслСнно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ установка Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСссии ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ эти значСния. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСссии, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ temp_tablespaces ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° любом ΡƒΡ€ΠΎΠ²Π½Π΅, Π½ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ: ΠΏΡ€ΠΈ создании ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС plpgsql (Ρƒ этого языка Π΅ΡΡ‚ΡŒ функция-Β«ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ°Β», ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰Π°Ρ Ρ‚Π΅Π»ΠΎ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания) провСряСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… пространств ΠΈ Ссли ΠΈΡ… Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ создаётся.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° internal Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° postmaster ΠΌΠ΅Π½ΡΡŽΡ‚ся с пСрСзапуском экзСмпляра ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ALTER SYSTEM.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° sighup ΠΌΠ΅Π½ΡΡŽΡ‚ся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ALTER SYSTEM, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ пСрСчитывания Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

7) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ:

drop database IF EXISTS bob;

drop ROLE IF EXISTS bob;

drop database IF EXISTS rob;

drop user IF EXISTS rob;

CREATE USER bob SUPERUSER LOGIN;

CREATE ROLE rob SUPERUSER LOGIN;

CREATE DATABASE bob OWNER bob STRATEGY WAL_LOG;

CREATE DATABASE rob OWNER rob STRATEGY FILE_COPY;

\c bob bob

CREATE SCHEMA IF NOT EXISTS bob AUTHORIZATION bob;

CREATE SCHEMA IF NOT EXISTS rob AUTHORIZATION rob;

\dconfig my.level

alter system set my.level = 'System';

select pg_reload_conf();

alter database bob set my.level = 'Database';

alter role bob set my.level = 'Role';

alter role bob in database bob set my.level = 'RoleInDatabase';

CREATE OR REPLACE FUNCTION bob.bob()

 RETURNS text

 LANGUAGE plpgsql

 SET my.level TO 'Function'

AS $function$

 BEGIN

  RAISE NOTICE 'my.level %', current_setting('my.level');

  RAISE NOTICE 'search_path %', current_schemas(true);

  RETURN current_setting('my.level');

 END;

$function$

;

CREATE OR REPLACE FUNCTION bob.bobdef()

 RETURNS text

 LANGUAGE plpgsql

 SECURITY DEFINER

AS $function$

 BEGIN

  RAISE NOTICE 'my.level %', current_setting('my.level');

  RAISE NOTICE 'search_path %', current_schemas(true);

  RAISE NOTICE 'current_user %', current_user;

  RAISE NOTICE 'session_user %', session_user;

  RAISE NOTICE 'user %', user;

  RETURN current_setting('my.level');

 END;

$function$

;

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, с ΠΊΠ°ΠΊΠΎΠ³ΠΎ уровня Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всС ΡƒΡ€ΠΎΠ²Π½ΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ (ΠΊΡ€ΠΎΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) это ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ SET LOCAL.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ - сСссии. Если Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SECURITY DEFINER, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ справами Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, Ρ‚ΠΎ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сСссии Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡ€ΠΎΠ΅Ρ‚ значСния сСссии Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°.

А Ссли Π½Π° сСссии Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Ρ‡ΡŒΡ‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ - Ρ€ΠΎΠ»ΠΈ-Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° (DEFINER)?

НСт, Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠ΅Π΅ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСссии Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π±Ρ‹Π» установлСн Π½Π° Β«Ρ€ΠΎΠ»ΡŒ Π² Π±Π°Π·Π΅Β», Ρ‚ΠΎ ΠΎΠ½ ΠΈ установится Π² сСссии. Если Π½Π΅ Π±Ρ‹Π» установлСн, Ρ‚ΠΎ установится Β«Π½Π° Ρ€ΠΎΠ»ΡŒΒ». Π”Π°Π»ΡŒΡˆΠ΅ Β«Π½Π° Π±Π°Π·ΡƒΒ». Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ. Для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ особСнно Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° search_path ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² постгрСс Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ.

Вторая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρƒ search_path="$user", public.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $user Π² Ρ‚Π΅Π»Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρƒ SECURITY DEFINER ΠΈΠΌΡ Ρ€ΠΎΠ»ΠΈ-Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ $user ΠΏΡƒΡ‚ΡŒ поиска Ρƒ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с DEFINER ΠΈ INVOKER Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹. ΠŸΡ€ΠΈ этом Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² своСй сСссии search_path Π±Π΅Π· $user ΠΏΡƒΡ‚ΡŒ поиска станСт Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π² Ρ‚Π΅Π»Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ с SECURITY DEFINER ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΡƒΡ‚ΡŒ поиска, Π° всСгда ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ поиска Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСфикс с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ схСм ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π² Ρ‚Π΅Π»Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ прСфикс ΠΈ Π² Ρ‚Π΅Π»Π΅ всСх ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚, Π² Ρ‚ΠΎΠΌ числС ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ систСмного ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π˜Π½Π°Ρ‡Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ search_path = myschema, public, pg_catalog ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ систСмного ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π½Π° свою Π² схСмС myschema. Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅ΠΊΡ€ΠΎΠ΅Ρ‚ Π»ΡŽΠ±Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, поэтому ΠΏΡ€ΠΈ создании SECURITY DEFINER ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎ pg_temp ΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ явно ΠΈ послСдним, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: search_path = pg_catalog, схСма_Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, pg_temp.

ВСкст каТСтся слоТным для понимания? АрхитСктурныС уязвимости часто нСпонятны Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… систСм, ΠΈΠ½Π°Ρ‡Π΅ Π±Ρ‹ ΠΎΠ½ΠΈ ΠΈΡ… Π½Π΅ допускали. Π’ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bobdef() Ρ ΠΏΡ€Π°Π²Π°ΠΌΠΈ создатСля Π·Π°Π»ΠΎΠΆΠ΅Π½Π° ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ. ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ bobdef() ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ схСма.current_setting(text), ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ bobdef Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set search_path=схСма, public, pg_catalog ΠΈ bobdef() Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° bobdef.

8) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ установлСны Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄:

postgres=# \drds

          Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

 Π ΠΎΠ»ΡŒ | Π‘Π”  |        ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹        

------+-----+-------------------------

 bob  | bob | my.level=RoleInDatabase

 bob  |     | my.level=Role

      | bob | my.level=Database

(3 строки)

Если Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… уровнях, Ρ‚ΠΎ стоит Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ \drds.

9) ИзмСнСния Π½Π°Ρ‡Π½ΡƒΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠΉ сСссии. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΡŒ посмотрим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠ°ΠΊΠΎΠ³ΠΎ уровня Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π² сСссии. ПодсоСдинимся ΠΏΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ rob ΠΊ Π±Π°Π·Π΅ bob:

bob@bob =# \c bob rob

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "bob" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "rob".

10) Ѐункция bob() Π² схСмС bob Π±Ρ‹Π»Π° создана с установкой ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Function. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ вызываСтся функция ΠΈ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ INVOKER ΠΎΠ½Π° ΠΈΠ»ΠΈ DEFINER Π² Π΅Ρ‘ Ρ‚Π΅Π»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ установлСно Π² Π΅Ρ‘ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ:

rob@bob =# SELECT bob.bob() as "my.level";

NOTICE:  my.level Function

NOTICE:  search_path {pg_catalog,rob,public}

 my.level

----------

 Function

(1 строка)

ΠŸΡƒΡ‚ΡŒ поиска Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Π΅Ρ‘ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (rob), вСдь функция Ρ‚ΠΈΠΏΠ° INVOKER.

11) Π’Ρ‹Π·ΠΎΠ²Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ DEFINER:

rob@bob =# SELECT bob.bobdef() as "my.level";

NOTICE:  my.level Database

NOTICE:  search_path {pg_catalog,bob,public}

NOTICE:  current_user bob

NOTICE:  session_user rob

NOTICE:  user bob

 my.level

----------

 Database

(1 строка)

ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Database?

Π—Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ вопросами ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠœΡ‹ ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌ Ρ…ΠΎΡ‚ΡŒ ΠΈ простыС ΠΏΡ€Π°Π²ΠΈΠ»Π°, Π½ΠΎ Ρƒ Π½ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ. Π‘Ρ…ΠΎΠΆΠΈΠ΅ утвСрТдСния Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΏΠ»ΠΎΡ…ΠΎ ΠΈ просто Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ нСинтСрСсно.

12) Для ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° вопрос ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСно Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сСссии:

rob@bob =# SHOW my.level;

 my.level

----------

 Database

(1 строка)

УстановлСн ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Database, поэтому ΠΈ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ примСняСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с этого уровня.

ΠœΡ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ»ΠΈ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ вопрос, Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊ Π½ΠΎΠ²Ρ‹ΠΉ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ взят с уровня Π±Π°Π·Ρ‹?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ устанавливали значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ rob (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ 7, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ дСлались настройки) Π½ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ€ΠΎΠ»ΠΈ, Π½ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ€ΠΎΠ»ΠΈ Π² Π±Π°Π·Π΅. ΠœΡ‹ это Π΄Π΅Π»Π°Π»ΠΈ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ bob.

Но Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΡ‹ устанавливали ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π±Π°Π·Ρ‹. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ Π±Π°Π·Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ кластСра (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "System").

13) ПомСняСм Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сСссии Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

rob@bob =# SET my.level = 'Session';

SET

rob@bob =# SELECT bob.bobdef() as "my.level";

NOTICE:  my.level Session

NOTICE:  search_path {pg_catalog,bob,public}

NOTICE:  current_user bob

NOTICE:  session_user rob

NOTICE:  user bob

 my.level

----------

 Session

(1 строка)

Ѐункция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π² сСссии.

ΠŸΡƒΡ‚ΡŒ поиска Ρƒ DEFINER Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - Π΅Ρ‘ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° ΠΈΠ·-Π·Π° search_path = '$user, public' установлСнного ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ кластСра.

Ѐункция current_user Ρ‚ΠΎΠΆΠ΅ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ для DEFINER Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. А session_user - Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ. ΠŸΡ€ΠΈ написании ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ имя Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π΅Ρ‘ Ρ€ΠΎΠ»ΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Π·Π½Π°Π½ΠΈΠ΅.

14) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bob.bob():

rob@bob =# SELECT bob.bob() as "my.level";

NOTICE:  my.level Function

NOTICE:  search_path {pg_catalog,rob,public}

 my.level

----------

 Function

(1 строка)

Для Π½Π΅Ρ‘ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ помСнялось, ΠΎΠ½Π° Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Function.

15) Π’Π΄Ρ€ΡƒΠ³ Π²Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ помСнял Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Function Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСссии ΠΈ Π½Π΅ Π²Π΅Ρ€Π½ΡƒΠ» Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ? ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ:

rob@bob =# SHOW my.level;

 my.level

----------

 Session

(1 строка)

Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠΌΠ΅Π» Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ повлияло Π½Π° сСссию.

16) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ current_setting:

rob@bob =# SELECT current_setting('my.level');

 current_setting

-----------------

 Session

(1 строка)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅.

17) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΡ€ΠΎΠ΅Ρ‚ Π»ΠΈ установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, установлСнный Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

rob@bob =# BEGIN TRANSACTION;

BEGIN

rob@bob *=# SET LOCAL my.level = 'Transaction';

SET

rob@bob *=# SELECT bob.bob() as "my.level";

NOTICE:  my.level Function

NOTICE:  search_path {pg_catalog,rob,public}

 my.level

----------

 Function

(1 строка)

НС повлияСт. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ установлСнный Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π²Π°Π»ΠΈΡ€ΡƒΠ΅Ρ‚.

18) Для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π³Π΄Π΅ Π½Π΅Ρ‚ установки Π½Π° ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ:

rob@bob *=# SELECT bob.bobdef() as "my.level";

NOTICE:  my.level Transaction

NOTICE:  search_path {pg_catalog,bob,public}

NOTICE:  current_user bob

NOTICE:  session_user rob

NOTICE:  user bob

  my.level  

-------------

 Transaction

(1 строка)

19) Π—Π°Π²Π΅Ρ€ΡˆΠΈΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

rob@bob *=# END;

COMMIT

rob@bob =# SHOW my.level;

 my.level

----------

 Session

(1 строка)

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π΅Ρ€Π½ΡƒΠ»ΠΎΡΡŒ Π² Session Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π΄ΠΎ измСнСния Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ (SET LOCAL).

20) ПодсоСдинимся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ bob ΠΊ Π±Π°Π·Π΅ postgres. На ΡƒΡ€ΠΎΠ²Π½Π΅ этой Π±Π°Π·Ρ‹ ΠΌΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ мСняли. ΠžΡ‚ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π±Ρ€Π°Ρ‚ΡŒΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅?

rob@bob =# \c postgres bob

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "bob".

bob@postgres =# SHOW my.level;

 my.level

----------

 Role

(1 строка)

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ бСрСтся ΠΈΠ· установлСнного для Ρ€ΠΎΠ»ΠΈ bob.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ? Для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… postgres ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ устанавливался.

21) Π£Π±Π΅Ρ€Π΅ΠΌ установку ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° для Ρ€ΠΎΠ»ΠΈ bob:

bob@postgres =# ALTER ROLE bob RESET my.level;

ALTER ROLE

Если ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ, Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ взят с уровня кластСра, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ System. ΠΠ΅ Π±ΡƒΠ΄Π΅ΠΌ это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ.

22) ПодсоСдинимся ΠΊ Π±Π°Π·Π΅ bob. ΠžΡ‚ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ взят ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€?

bob@postgres =# \c bob bob

You are now connected to database "bob" as user "bob".

bob@bob =# SHOW my.level;

    my.level    

----------------

 RoleInDatabase

(1 строка)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ установлСн ΠΈ Π½Π° Π±Π°Π·Ρƒ ΠΈ Π½Π° Ρ€ΠΎΠ»ΡŒ Π² Π±Π°Π·Π΅. Π‘ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€Π΅Π²Π°Π»ΠΈΡ€ΡƒΠ΅Ρ‚.

23) ПодсоСдинимся к базС rob:

bob@bob =# \c rob bob

You are now connected to database "rob" as user "bob".

bob@rob =# SHOW my.level;

 my.level

----------

 System

(1 строка)

На Π±Π°Π·Π΅ rob ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΎΠΊ Π½Π΅Ρ‚, Π° для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ bob ΠΌΡ‹ Ρ‡ΡƒΡ‚ΡŒ Ρ€Π°Π½ΡŒΡˆΠ΅ (ΠΏΡƒΠ½ΠΊΡ‚ 21) ΡƒΠ±Ρ€Π°Π»ΠΈ установку со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ "Role".        

24) Π£Π±Π΅Ρ€Π΅ΠΌ установку Π½Π° Ρ€ΠΎΠ»ΡŒ Π² Π±Π°Π·Π΅:

bob@rob =# ALTER ROLE bob IN DATABASE bob RESET my.level;

ALTER ROLE

bob@rob =# SHOW my.level;

 my.level

----------

 System

(1 строка)

Π’ этой Π±Π°Π·Π΅ ΠΈ Π±Π΅Π· убирания Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‚ΠΎ ΠΆΠ΅ самоС.

25) А Π² Π±Π°Π·Π΅ bob? ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ:

bob@rob =# \c bob bob

You are now connected to database "bob" as user "bob".

bob@bob =# SHOW my.level;

 my.level

----------

 Database

(1 строка)

ПослС убирания ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Β«Ρ€ΠΎΠ»ΡŒ Π² Π±Π°Π·Π΅Β» стал Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π±Π°Π·Ρ‹.

26) Π£Π±Π΅Ρ€Ρ‘ΠΌ Π΅Π³ΠΎ ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π±Π°Π·Ρ‹ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ:

bob@bob =# ALTER DATABASE bob RESET my.level;

ALTER DATABASE

bob@bob =# SHOW my.level;

 my.level

----------

 Database

(1 строка)

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π·Π°Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ.

27) ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌΡΡ:

bob@bob =# \c bob bob

You are now connected to database "bob" as user "bob".

bob@bob =# SHOW my.level;

 my.level

----------

 System

(1 строка)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ бСрётся с уровня кластСра.

28) Π£Π±Π΅Ρ€Ρ‘ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° postgresql.auto.conf:

bob@bob =# alter system reset my.level;

ALTER SYSTEM

bob@bob =# select pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 строка)

Но Ρƒ нас ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ установлСн Π² postgresql.conf ΠΈ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° ΠΌΡ‹ Π΅Π³ΠΎ Π½Π΅ ΡƒΠ±ΠΈΡ€Π°Π»ΠΈ.

29) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² случаС ΠΎΡ‚ΠΊΠ°Ρ‚Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ откатываСтся ΠΊΠΎΠΌΠ°Π½Π΄Π° установки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСссии:

bob@bob =# begin;

BEGIN

bob@bob *=# set my.level='forRollback';

SET

bob@bob *=# show my.level;

  my.level  

-------------

 forRollback

(1 строка)

bob@bob *=# rollback;

ROLLBACK

bob@bob =# show my.level;

 my.level

----------

 Pgconf

(1 строка)

bob@bob =# end;

WARNING:  there is no transaction in progress

COMMIT

Команда end эквивалСнтна ΠΊΠΎΠΌΠ°Π½Π΄Π΅ commit, Π½ΠΎ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

30) МоТно Π·Π°Π΄Π°Ρ‚ΡŒΡΡ вопросом, Ρ‡Ρ‚ΠΎ с установками Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ кластСра?

ΠžΡ‚Π²Π΅Ρ‚: ΠΊΠΎΠΌΠ°Π½Π΄Π° установки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ кластСра Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, поэтому ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ:

bob@bob =# begin;

BEGIN

bob@bob *=# alter system set my.level = 'forRollback';

ERROR:  ALTER SYSTEM cannot run inside a transaction block

bob@bob !=# end;

ROLLBACK

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ end ΡΠ΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ процСсс Π²Π΅Ρ€Π½ΡƒΠ» сообщСниС ROLLBACK? Π•ΡΠ»ΠΈ Π±Ρ‹ вмСсто end Π±Ρ‹Π»Π° Π±Ρ‹ Π΄Π°Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° commit, сообщСниС Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‚ΠΎΠΆΠ΅ ROLLBACK, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ транзакция ΠΏΠ΅Ρ€Π΅ΡˆΠ»Π° Π² состояниС сбоя, Π½Π° Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ символ "!".

31) Π£Π΄Π°Π»ΠΈΡ‚Π΅ созданныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

\c bob postgres

drop schema rob;

\c postgres postgres

drop database if exists rob;

drop database if exists bob;

drop user if exists bob;

drop database if exists rob;

drop user if exists rob;

Π§Π°ΡΡ‚ΡŒ 2. Установка ΠΏΡƒΡ‚ΠΈ поиска Π² функциях ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…

1) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

CREATE USER rob LOGIN;

CREATE OR REPLACE FUNCTION bobdef()

 RETURNS text

 LANGUAGE plpgsql

 SECURITY DEFINER

AS $function$

 BEGIN

  RAISE NOTICE 'search_path %', current_schemas(true);

  RAISE NOTICE 'current_user %', current_user;

  RAISE NOTICE 'session_user %', session_user;

  RAISE NOTICE 'user %', user;

  RETURN now();

 END;

$function$

;

grant create on schema public to rob;

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½Π΅ΠΏΡ€ΠΈΠ²Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ rob Ρ ΠΏΡ€Π°Π²ΠΎΠΌ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ ΠΊ Π±Π°Π·Π°ΠΌ ΠΈ Π΄Π°ΡŽΡ‚ Π΅ΠΌΡƒ ΠΏΡ€Π°Π²ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² схСмС public Π±Π°Π·Ρ‹ postgres.

2) ΠŸΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ rob ΠΊ Π±Π°Π·Π΅ postgres ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ функция bobdef() Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅Ρ‚ся ΠΊΠ°ΠΊ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΏΡ€ΠΈ Π΅Π΅ создании:

postgres=# \c postgres rob

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "rob".

postgres=> SELECT bobdef();

NOTICE:  search_path {pg_catalog,public}

NOTICE:  current_user postgres

NOTICE:  session_user rob

NOTICE:  user postgres

            bobdef            

-------------------------------

...44.401115+03

(1 строка)

3) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄ Π½Π΅ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈΠ³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ rob ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

postgres=>

CREATE OR REPLACE FUNCTION public.now() RETURNS text

LANGUAGE plpgsql

AS $$

BEGIN

  RAISE NOTICE 'now() user %', user;

  ALTER USER ROB SUPERUSER;

  RETURN 'done';

END;

$$;

4) ΠŸΠΎΠΌΠ΅Π½ΡΠΉΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ поиска, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bobdef(). Ѐункция Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ rob Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ now() ΠΊΠΎΡ‚орая выполнится с ΠΏΡ€Π°Π²Π°ΠΌΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bobdef(), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ postgres:

postgres=> set search_path = public, pg_catalog;

SET

postgres=> SELECT bobdef();

NOTICE:  search_path {public,pg_catalog}

NOTICE:  current_user postgres

NOTICE:  session_user rob

NOTICE:  user postgres

NOTICE:  now() user postgres

 bobdef

--------

 done

(1 строка)

5) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ rob послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

postgres=> \du rob

         Π‘писок Ρ€ΠΎΠ»Π΅ΠΉ

 Π˜ΠΌΡ Ρ€ΠΎΠ»ΠΈ |     Атрибуты      

----------+-------------------

 rob      | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° SECURITY DEFINER Π±Ρ‹Π»Π° бСзопасна, search_path Π΄ΠΎΠ»ΠΆΠ΅Π½:

1) Π±Ρ‹Ρ‚ΡŒ установлСн Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ опрСдСлСния (Π° Π½Π΅ послС BEGIN) ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;

2) ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ схСмы, доступныС для создания ΠΈΠ»ΠΈ измСнСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ с мСньшим ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ, Ρ‡Π΅ΠΌ Ρƒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;

3) схСма pg_temp Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π° явно Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡƒΡ‚ΠΈ поиска ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½ΠΎΠ³ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ установки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

\c postgres postgres

CREATE OR REPLACE FUNCTION bobdef()

 RETURNS text

 LANGUAGE plpgsql

 SECURITY DEFINER

 SET search_path = pg_catalog, pg_temp

AS $function$

 BEGIN

  RAISE NOTICE 'search_path %', current_schemas(true);

  RAISE NOTICE 'current_user %', current_user;

  RAISE NOTICE 'session_user %', session_user;

  RAISE NOTICE 'user %', user;

  RETURN now();

 END;

$function$

;

Π­Ρ‚Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° бСзопасна.

6) Π£Π΄Π°Π»ΠΈΡ‚Π΅ созданныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

\c postgres postgres

drop function if exists public.now();

revoke create on schema public from rob;

drop user rob;


ЀизичСская структура кластСра

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…
  2. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства
  3. Π€Π°ΠΉΠ» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Β«ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΒ»
  4. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство
  5. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_repack

  6.  Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pgcompacttable 

  7.  Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ORC (ΠšΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Citus columnar)

  1. Установка ΠΈ использованиС

  2. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сТатия

  3. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…

1) НастройтС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ хранСния WAL-сСгмСнтов.

postgres=# alter system set max_slot_wal_keep_size = '128MB';

ALTER SYSTEM

postgres=# alter system set max_wal_size = '128MB';

ALTER SYSTEM

postgres=# ALTER SYSTEM SET idle_in_transaction_session_timeout = '100min';

ALTER SYSTEM

postgres=# select pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 строка)

postgres=# select pg_switch_wal();

 pg_switch_wal

---------------

 7/941FBFF2

(1 строка)

Π­Ρ‚ΠΈ настройки Π½ΡƒΠΆΠ½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ с большими объСмами Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ мСста Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² PGDATA/pg_wal.

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ сСтСвому адрСсу осущСствляСтся ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅:

postgres=# \dconfig list*

List of configuration parameters

    Parameter     |   Value  

------------------+-----------

 listen_addresses | localhost

(1 строка)

ΠŸΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ осущСствляСтся ΠΏΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ сСтСвому интСрфСйсу.

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠΎΡ€Ρ‚Ρƒ осущСствляСтся ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅:

postgres=# \dconfig port 

List of configuration parameters

 Parameter | Value

-----------+-------

 port      | 5432

(1 строка)

На ΠΏΠΎΡ€Ρ‚Ρƒ 5432, это ΠΏΠΎΡ€Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ адрСсу ΠΌΡ‹ подсоСдинились:

postgres=# \conninfo

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5432".

ΠœΡ‹ подсоСдинились Ρ‡Π΅Ρ€Π΅Π· Unix-сокСт.

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ выглядит Ρ„Π°ΠΉΠ», создаваСмый процСссом postgres:

postgres=# \! ls -al /var/run/postgresql

total 4

drwxrwsr-x  2 postgres postgres  80  .

drwxr-xr-x 29 root     root     800  ..

srwxrwxrwx  1 postgres postgres   0  .s.PGSQL.5432

-rw-------  1 postgres postgres  80  .s.PGSQL.5432.lock

Боздаётся Π΄Π²Π° Ρ„Π°ΠΉΠ»Π°, ΠΈΡ… нСльзя ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ.

6) ΠœΠ΅ΡΡ‚ΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² опрСдСляСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ unix_socket_directories. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

postgres=# \dconfig unix_socket*

        Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

        ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€         |      Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅      

-------------------------+---------------------

 unix_socket_directories | /var/run/postgresql

 unix_socket_group       |

 unix_socket_permissions | 0777

(3 строки)

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ локальноС подсоСдинСниС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0777 Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°ΠΏΡƒΡ‰Π΅Π½ экзСмпляр. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ имя Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΡƒΡΡ‚ΠΎ ΠΈ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ для Ρ„Π°ΠΉΠ»Π° сокСта являСтся основная Π³Ρ€ΡƒΠΏΠΏΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ экзСмпляр: postgres.

ПолноС описаниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΅ΡΡ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

https://docs.tantorlabs.ru/tdb/ru/15_4/se/runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-SETTINGS 

7) Если сообщСния psql Π²Ρ‹Π΄Π°ΡŽΡ‚ся Π½Π° английском языкС, Ρ‚ΠΎ Π² ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы () установитС Π²Ρ‹Π²ΠΎΠ΄ сообщСний ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Π½Π° русском языкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π±Ρ‹Π»ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚:

postgres=# \q

postgres@tantor:~$ locale -a | grep ru

ru_RU.utf8

postgres@tantor:~$ export LC_MESSAGES=ru_RU.utf8

8) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ с ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…:

postgres@tantor:~$ createdb --help

createdb создаёт Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL.

ИспользованиС:

  createdb [ΠŸΠΠ ΠΠœΠ•Π’Π ]... [ИМЯ_Π‘Π”] [ΠžΠŸΠ˜Π‘ΠΠΠ˜Π•]

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  -D, --tablespace=ВАБЛ_ПРОБВР Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

  -e, --echo                   ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, отправляСмыС сСрвСру

  -E, --encoding=ΠšΠžΠ”Π˜Π ΠžΠ’ΠšΠ     ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

  -l, --locale=Π›ΠžΠšΠΠ›Π¬          Π»ΠΎΠΊΠ°Π»ΡŒ для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

      --lc-collate=Π›ΠžΠšΠΠ›Π¬      ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ LC_COLLATE для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

      --lc-ctype=Π›ΠžΠšΠΠ›Π¬        ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ LC_CTYPE для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

      --icu-locale=Π›ΠžΠšΠΠ›Π¬      Π»ΠΎΠΊΠ°Π»ΡŒ ICU для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

      --icu-rules=ΠŸΠ ΠΠ’Π˜Π›Π      Π½Π°ΡΡ‚Ρ€ΠΎΠΉΠΊΠ° ΠΏΡ€Π°Π²ΠΈΠ» сортировки ICU

      --locale-provider={libc|icu}

                               ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ Π»ΠΎΠΊΠ°Π»ΠΈ для основного ΠΏΡ€Π°Π²ΠΈΠ»Π° сортировки Π‘Π”

  -O, --owner=ВЛАДЕЛЕЦ         ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ-Π²Π»Π°Π΄Π΅Π»Π΅Ρ† Π½ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

  -S, --strategy=STRATEGY      ΡΡ‚ратСгия создания Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…: wal_log ΠΈΠ»ΠΈ file_copy

  -T, --template=Π¨ΠΠ‘Π›ΠžΠ        ΠΈΡΡ…одная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… для копирования

  -V, --version                ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ

  -?, --help                   ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ эту справку ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

  -h, --host=ИМЯ               имя сСрвСра Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ сокСтов

  -p, --port=ПОРВ              ΠΏΠΎΡ€Ρ‚ сСрвСра Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…

  -U, --username=ИМЯ           имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ сСрвСру

  -w, --no-password            Π½Π΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ

  -W, --password               Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ

  --maintenance-db=ИМЯ_Π‘Π”      ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠΎΡ€Π½ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… считаСтся имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

-T Π·Π°Π΄Π°Π΅Ρ‚ имя Π±Π°Π·Ρ‹ ΠΊΠ»ΠΎΠ½ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хочСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ.

-S ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ сущСствСнно ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ объСм ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Ссли шаблон ΠΈΠ»ΠΈ клонируСмая Π±Π°Π·Π° -T Π΄Π°Π½Π½Ρ‹Ρ… большого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

--maintenance-db ΠΊ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π±Π°Π· кластСра Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ CREATE DATABASE.

Π§Π°ΡΡ‚ΡŒ 2. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства

1) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ:

postgres=# \! mkdir $PGDATA/../u01

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ postgres ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ-ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ:

postgres=# \! ls -al $PGDATA/../u01

ΠΈΡ‚ΠΎΠ³ΠΎ 8

drwxr-xr-x 2 postgres postgres 4096  .

drwxr-xr-x 6 postgres postgres 4096  ..

2) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство:

postgres=# CREATE TABLESPACE u01tbs LOCATION '/var/lib/postgresql/tantor-se-16/u01';

CREATE TABLESPACE

3)  ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ содСрТимоС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства:

postgres=# \! ls -al $PGDATA/../u01

ΠΈΡ‚ΠΎΠ³ΠΎ 12

drwx------ 3 postgres postgres 4096 .

drwxr-xr-x 6 postgres postgres 4096 ..

drwx------ 2 postgres postgres 4096 PG_16_202307071

Π‘Ρ‹Π»Π° создана поддирСктория с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ PG_16_202307071. Π’ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ присутствуСт Π½ΠΎΠΌΠ΅Ρ€ основной вСрсии ΠΏΠΎΡΡ‚грСс. Π’Π°ΠΊΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ автоматичСски, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ.

4) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌ пространствС Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

postgres=# drop table if exists t;

NOTICE:  table "t" does not exist, skipping

DROP TABLE

postgres=# CREATE TABLE t (id bigserial, t text) TABLESPACE u01tbs;

CREATE TABLE

5) НаполнитС Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

postgres=# INSERT INTO t(t) SELECT encode((floor(random()*1000)::numeric ^ 100::numeric)::text::bytea, 'base64') from generate_series(1,5000000);

INSERT 0 5000000

Π‘Ρ‹Π»ΠΎ вставлСно 5 ΠΌΠ»Π½. строк.

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ появились. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ postgres ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…:

postgres@tantor:~$ cd $PGDATA/../u01/PG_16_202307071/5

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ ls -al

total 1952072

drwxr-x--- 2 postgres postgres       4096 12:02 .

drwxr-x--- 3 postgres postgres       4096 11:47 ..

-rw-r----- 1 postgres postgres 1073741824 12:03 365769

-rw-r----- 1 postgres postgres  924581888 12:04 365769.1

-rw-r----- 1 postgres postgres     507904 12:02 365769_fsm

-rw-r----- 1 postgres postgres      65536 12:04 365769_vm

-rw-r----- 1 postgres postgres          0 12:01 365773

-rw-r----- 1 postgres postgres       8192 12:01 365774

Π€Π°ΠΉΠ» с суффиксом ".1". Π­Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ» основного слоя (main fork).

7) Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π΅Ρ‰Ρ‘ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ строк:

postgres=# INSERT INTO t(t) SELECT encode((floor(random()*1000)::numeric ^ 100::numeric)::text::bytea, 'base64') from generate_series(1,1000000);

INSERT 0 1000000

8) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ появились Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства:

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ ls -al

total 2342372

drwxr-x--- 2 postgres postgres       4096 12:06 .

drwxr-x--- 3 postgres postgres       4096 11:47 ..

-rw-r----- 1 postgres postgres 1073741824 12:05 365769

-rw-r----- 1 postgres postgres 1073741824 12:06 365769.1

-rw-r----- 1 postgres postgres  250404864 12:06 365769.2

-rw-r----- 1 postgres postgres     606208 12:06 365769_fsm

-rw-r----- 1 postgres postgres      65536 12:06 365769_vm

-rw-r----- 1 postgres postgres          0 12:01 365773

-rw-r----- 1 postgres postgres       8192 12:01 365774

Добавился Ρ„Π°ΠΉΠ» с суффиксом ".2". Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Ρ„Π°ΠΉΠ» основного слоя.

9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ oid2name ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»Π΅:

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ oid2name -f 365769

From database "postgres":

  Filenode  Table Name

----------------------

    365769           t

Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² случаС, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, находящийся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΊΠ°ΠΊΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚носится Ρ„Π°ΠΉΠ». НапримСр, Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ большоС количСство Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ 2Π“Π± основного слоя ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ разросся (bloat) ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.        Π’Π°ΠΊΠΆΠ΅ это ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство, Π° ΠΎΠ½ΠΎ Π½Π΅ удаляСтся ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π½Ρ‘ΠΌ Π² ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Бписок ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π° удалСния Π½Π΅ выдаст:

postgres=# drop tablespace u01tbs;

ERROR:  tablespace "u01tbs" is not empty

Бписок Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹. Названия ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ это oid Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….

10) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ oid2name ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ oid2name -t t

From database "postgres":

  Filenode  Table Name

----------------------

    365769           t

Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ названия Ρ„Π°ΠΉΠ»ΠΎΠ² основного слоя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

11) Π’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΅Ρ‰Ρ‘ Ρ„Π°ΠΉΠ»Ρ‹.

Π’Π° ΠΆΠ΅ типичная Π·Π°Π΄Π°Ρ‡Π°: Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, хочСтся ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ„Π°ΠΉΠ» относится.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΏΡ€ΠΎ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Ρ„Π°ΠΉΠ»Ρ‹:

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ oid2name -f 365773

From database "postgres":

  Filenode       Table Name

---------------------------

    365773  pg_toast_365769

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ oid2name -f 365774

From database "postgres":

  Filenode             Table Name

---------------------------------

    365774  pg_toast_365769_index

Π­Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ TOAST Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ TOAST-индСкса. Для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° heap) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создана ΠΎΠ΄Π½Π° TOAST Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈ ΠΎΠ΄ΠΈΠ½ индСкс Π½Π° эту TOAST Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

20) Π’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ слоёв vm ΠΈ fsm:

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ ls

365769  365769.1  365769.2  365769_fsm  365769_vm  365773  365774

12) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹.

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ экзСмпляр:

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ pg_ctl stop

waiting for server to shut down.... done

server stopped

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ rm *_*

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ ls

365769  365769.1  365769.2  365773  365774

Π€Π°ΠΉΠ»Ρ‹ _vm ΠΈ _fsm ΡƒΠ΄Π°Π»Π΅Π½Ρ‹.

13) ЗапуститС экзСмпляр:

postgres@tantor:~/tantor-se-16/u01/PG_16_202307071/5$ sudo systemctl start tantor-se-server-16.service

[sudo] password for postgres: postgres

ПослС запуска экзСмпляра Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ появились.

14) Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π³Π΄Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ psql пСрСподсоСдинимся ΠΈ обратимся ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

postgres=# select count(*) from t;

  count  

---------

 6000000

(1 строка)

Команда ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ просмотрСла страницы Ρ„Π°ΠΉΠ»ΠΎΠ² основного слоя ΠΈ Π½Π΅ Π²Ρ‹Π΄Π°Π»Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π€Π°ΠΉΠ»Ρ‹ _vm ΠΈ _fsm ΠΎΠΏΡΡ‚ΡŒ Π½Π΅ появились. ΠœΠΎΠΆΠ΅Ρ‚ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΈ Π±Π΅Π· Π½ΠΈΡ… всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

15) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π²Π°ΠΊΡƒΡƒΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

postgres=# vacuum verbose analyze t;

INFO:  vacuuming "postgres.public.t"

INFO:  finished vacuuming "postgres.public.t": index scans: 0

pages: 0 removed, 292711 remain, 292711 scanned (100.00% of total)

tuples: 0 removed, 6000001 remain, 0 are dead but not yet removable, oldest xmin: 2117

removable cutoff: 2117, which was 0 XIDs old when operation ended

new relminmxid: 250029, which is 732 MXIDs ahead of previous value

frozen: 0 pages from table (0.00% of total) had 0 tuples frozen

index scan not needed: 0 pages from table (0.00% of total) had 0 dead item identifiers removed

avg read rate: 367.632 MB/s, avg write rate: 367.745 MB/s

buffer usage: 292841 hits, 292617 misses, 292707 dirtied

WAL usage: 292712 records, 10 full page images, 19106735 bytes

system usage: CPU: user: 3.40 s, system: 2.04 s, elapsed: 6.21 s

INFO:  vacuuming "postgres.pg_toast.pg_toast_365769"

INFO:  finished vacuuming "postgres.pg_toast.pg_toast_365769": index scans: 0

pages: 0 removed, 0 remain, 0 scanned (100.00% of total)

tuples: 0 removed, 0 remain, 0 are dead but not yet removable, oldest xmin: 2117

removable cutoff: 2117, which was 0 XIDs old when operation ended

new relfrozenxid: 2117, which is 41 XIDs ahead of previous value

new relminmxid: 250029, which is 732 MXIDs ahead of previous value

frozen: 0 pages from table (100.00% of total) had 0 tuples frozen

index scan not needed: 0 pages from table (100.00% of total) had 0 dead item identifiers removed

avg read rate: 12.480 MB/s, avg write rate: 0.000 MB/s

buffer usage: 19 hits, 1 misses, 0 dirtied

WAL usage: 1 records, 0 full page images, 202 bytes

system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s

INFO:  analyzing "public.t"

INFO:  "t": scanned 30000 of 292711 pages, containing 614828 live rows and 0 dead rows; 30000 rows in sample, 5998897 estimated total rows

VACUUM

Π€Π°ΠΉΠ»Ρ‹ _vm ΠΈ _fsm появились.

Π€Π°ΠΉΠ»Ρ‹ этих слоёв ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ сразу послС создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π€Π°ΠΉΠ» fsm ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан сСрвСрным процСссом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот Ρ„Π°ΠΉΠ» для поиска Π±Π»ΠΎΠΊΠ° со свободным мСстом для вставки строк. Π€Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒΡΡ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ процСсс Π°Π²Ρ‚ΠΎΠ²Π°ΠΊΡƒΡƒΠΌΠ° Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π°Π²Ρ‚ΠΎΠ²Π°ΠΊΡƒΡƒΠΌΠ° Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ послС вставки ΠΈΠ»ΠΈ измСнСния ΠΈ удалСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ (устанавливаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹) количСства строк Π² этом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.

Π£Π΄Π°Π»ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ vm ΠΈ fsm Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, Ρ‚Π°ΠΊΠΎΠΉ потрСбности Π½Π΅Ρ‚.

Доступ ΠΊ Π±Π»ΠΎΠΊΠ°ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² постоянного хранСния всСх слоёв ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ся Ρ‡Π΅Ρ€Π΅Π· Π±ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ кэш Π² раздСляСмой области памяти, поэтому ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΡ‹ останавливали экзСмпляр.

Π§Π°ΡΡ‚ΡŒ 3. Π€Π°ΠΉΠ» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Β«ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΒ»

ΠŸΡ€ΠΈ создании Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ столбца Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠ°ΠΊ bigserial. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ столбца заполняСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

postgres=# \d t

                                    Π’Π°Π±Π»ΠΈΡ†Π° "public.t"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |  Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL |         По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ          

---------+--------+--------------------+-------------------+-------------------------------

 id      | bigint |                    | not null          | nextval('t_id_seq'::regclass)

 t       | text   |                    |                   |

Π’Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство: "u01tbs"

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

postgres=# \ds+

                                    Бписок ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

 Π‘Ρ…Π΅ΠΌΠ°  |   Имя    |        Π’ΠΈΠΏ         | Π’Π»Π°Π΄Π΅Π»Π΅Ρ† |  Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅  |   Π Π°Π·ΠΌΠ΅Ρ€   | ОписаниС

--------+----------+--------------------+----------+------------+------------+----------

 public | t_id_seq | ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ | postgres | постоянноС | 8192 bytes |

(1 строка)

Π£ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ физичСски ΠΎΠ½Π° прСдставляСт собой Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ.

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ характСристики ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠ°ΠΊ Β«ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Β» (ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ, класса):

postgres=# select * from pg_class where relname='t_id_seq' \gx

-[ RECORD 1 ]-------+---------

oid                 | 374239

relname             | t_id_seq

relnamespace        | 2200

reltype             | 0

reloftype           | 0

relowner            | 10

relam               | 0

relfilenode         | 374239

reltablespace       | 0

relpages            | 1

reltuples           | 1

relallvisible       | 0

reltoastrelid       | 0

relhasindex         | f

relisshared         | f

relpersistence      | p

relkind             | S

relnatts            | 3

relchecks           | 0

relhasrules         | f

relhastriggers      | f

relhassubclass      | f

relrowsecurity      | f

relforcerowsecurity | f

relispopulated      | t

relreplident        | n

relispartition      | f

relrewrite          | 0

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ oid, Π½ΠΎΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°, oid Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства (ноль ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…). Π’Π°ΠΊΠΆΠ΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ физичСски прСдставляСт собой ΠΎΠ΄Π½Ρƒ запись (reltuples) Π² ΠΎΠ΄Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ (relpages).

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

postgres=# SELECT pg_relation_filepath(374239);

 pg_relation_filepath

----------------------

 base/5/374239

(1 строка)

5) Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ pg_class Π·Π° oid ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²:

postgres=# SELECT pg_relation_filepath('t_id_seq'::text::regclass);

 pg_relation_filepath

----------------------

 base/5/374239

(1 строка)

Π€Π°ΠΉΠ» ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Ρ‹Π» создан ΠΈ располагаСтся Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌ пространствС pg_default, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΌ пространством ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… postgres:

postgres=# select dattablespace, datname from pg_database;

 dattablespace |  datname  

---------------+-----------

          1663 | postgres

          1663 | test_db

          1663 | template1

          1663 | template0

(4 строки)

postgres=# select oid, spcname from pg_tablespace;

  oid  |  spcname  

-------+------------

  1663 | pg_default

  1664 | pg_global

 18651 | u01tbs

(3 строки)

Π§Π°ΡΡ‚ΡŒ 4. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ t Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство pg_default.

Π’ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ сколько мСста Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ кластСр.

1) Π’ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ /var/lib/postgresql/tantor-se-16:

postgres@tantor:~$ cd $PGDATA/..

postgres@tantor:~/tantor-se-16$ du -hs

3.2G

Π’ этом ΠΎΠΊΠ½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ стрСлку Π²Π²Π΅Ρ€Ρ… ΠΈ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <ENTER> ΠΏΠΎΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π° пСрСмСщСния.

2) Π’ ΠΎΠΊΠ½Π΅ psql Π² цСлях ΠΎΡ†Π΅Π½ΠΊΠΈ сколько ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… сгСнСрируСтся посмотрим Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ LSN:

postgres=# SELECT pg_current_wal_lsn();

 pg_current_wal_lsn

--------------------

 4/E2BFA2A0

(1 строка)

3) Π’ ΠΎΠΊΠ½Π΅ psql Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ пСрСмСщСния. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, синтаксисом пСрСмСщСния всСх Ρ‚Π°Π±Π»ΠΈΡ†:

postgres=# alter table ALL IN TABLESPACE u01tbs SET TABLESPACE pg_default;

4) Пока ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π² ΠΎΠΊΠ½ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° стрСлкой Π²Π²Π΅Ρ€Ρ… Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΈ <ENTER> повторяйтС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ du -hs Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, сколько мСста Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ кластСр Π² процСссС пСрСноса Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

postgres@tantor:~/tantor-se-16$ du -hs

4.1G    .

postgres@tantor:~/tantor-se-16$ du -hs

4.4G    .

postgres@tantor:~/tantor-se-16$ du -hs

4.6G    .

postgres@tantor:~/tantor-se-16$ du -hs

4.9G    .

postgres@tantor:~/tantor-se-16$ du -hs

5.1G    .

postgres@tantor:~/tantor-se-16$ du -hs

5.4G    .

postgres@tantor:~/tantor-se-16$ du -hs

3.2G    .

ЗанятоС кластСром мСсто ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° 2.2Gb, с 3.2G Π΄ΠΎ 5.4G.

Если Π²Ρ‹ Π½Π΅ успСли Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ числа. Если интСрСсно ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

alter table t SET TABLESPACE u01tbs;

alter table t SET TABLESPACE pg_default;

пСрСмСщая Ρ„Π°ΠΉΠ»Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

На врСмя пСрСмСщСния Ρ€Π°Π·ΠΌΠ΅Ρ€ кластСра увСличился ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² сСгмСнтов ΠΆΡƒΡ€Π½Π°Π»Π° Π±Ρ‹Π»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½ΠΈ Π±Ρ‹ Π΅Ρ‰Ρ‘ большС ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»ΠΈ занятоС мСсто Π² процСссС выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ пСрСмСщСния.

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ LSN:

postgres=# SELECT pg_current_wal_lsn();

 pg_current_wal_lsn

--------------------

 5/731A7860

(1 строка)

6) ΠŸΠΎΡΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ объСм Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡˆΠ΅Π» Ρ‡Π΅Ρ€Π΅Π· ΠΆΡƒΡ€Π½Π°Π»Ρ‹:

postgres=# select pg_size_pretty('5/731A7860'::pg_lsn - '4/E2BFA2A0'::pg_lsn);

 pg_size_pretty

----------------

 2310 MB

(1 строка)

7) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

postgres=# select pg_size_pretty(pg_total_relation_size('t'));

 pg_size_pretty

----------------

 2287 MB

(1 строка)

Π§Π΅Ρ€Π΅Π· ΠΆΡƒΡ€Π½Π°Π» кластСра ΠΏΡ€ΠΎΡˆΠ΅Π» вСсь объСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Если Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ установлСно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ max_wal_size Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, Ρ‚ΠΎ использовалось Π±Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСсто Β«Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Β» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (4.5Gb), Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_repack.

Π§Π°ΡΡ‚ΡŒ 5. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_repack

1) УстановитС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅:

postgres=# create extension pg_repack;

CREATE EXTENSION

2) ЗапуститС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ:

postgres@tantor:~$ pg_repack -t t

WARNING: relation "public.t" must have a primary key or not-null unique keys

3) Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Π±Π΅Π· ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡:

postgres=# ALTER TABLE t ADD CONSTRAINT t_pk PRIMARY KEY (id);

ALTER TABLE

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° создало ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ индСкс.

4) Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство u01tbs:

postgres@tantor:~$ pg_repack -t t -s u01tbs

INFO: repacking table "public.t"

ОбъСм мСста, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ занято Π½Π° врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ (2.3G) Π½Π΅ измСнится ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ALTER TABLE - Π² ΠΏΠΈΠΊΠ΅ занято ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 5.6G с 3.3G.

ИндСкс Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΏΡ€ΠΈ этом Π½Π΅ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Ρ‘Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ использовали ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ "-t".

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ "- I":

postgres@tantor:~$ pg_repack -I t -s u01tbs

INFO: repacking table "public.t"

ОбъСм мСста увСличивался Π΄ΠΎ 5.7G.

6) Π€Π°ΠΉΠ»ΠΎΠ² Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌ пространствС стало большС:

postgres@tantor:~$ ls $PGDATA/../u01/PG_16_202307071/5

374064  374067  374068  374085  374085.1  374085.2  374085_fsm  374088  374089

Π€Π°ΠΉΠ» слоя vm ΠΎΡ‚сутствуСт, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ Π±Ρ‹Π»ΠΎ вакуумирования.

7) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π°Π½Π°Π»ΠΈΠ· (сбор статистики для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π°) Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ t:

postgres=# analyze t;

ANALYZE

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ помСнялось.

Анализ Π½Π΅ создал Ρ„Π°ΠΉΠ» слоя vm.

7) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π²Π°ΠΊΡƒΡƒΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ t:

postgres=# vacuum t;

VACUUM

Добавился Ρ„Π°ΠΉΠ» 374085_vm.

Π§Π°ΡΡ‚ΡŒ 6. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pgcompacttable

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка.

1) Π”Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹:

postgres@tantor:~$ sudo chmod 755 -R /opt/tantor/db/16/tools/pgcompacttable

2) УстановитС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ стандартноС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅:

postgres=# create extension pgstattuple;

CREATE EXTENSION

3) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° запускаСтся:

postgres@tantor:~$ /opt/tantor/db/16/tools/pgcompacttable/bin/pgcompacttable --help

Name:

    pgcompacttable - PostgreSQL bloat reducing tool.

Usage:

    pgcompacttable [OPTION...]

    General options:

        [-?mV] [(-q | -v LEVEL)]

    Connection options:

        [-h HOST] [-p PORT] [-U USER] [-W PASSWD] [-P PATH]

    Targeting options:

        (-a | -d DBNAME...) [-n SCHEMA...] [-t TABLE...] [-N SCHEMA...] [-T

        TABLE...]

Examples:

    Shows usage manual.

      pgcompacttable --man

    Compacts all the bloated tables in all the database in the cluster plus their bloated indexes. Prints additional progress information.

      pgcompacttable --all --verbose info

    Compacts all the bloated tables in the billing database and their

    bloated indexes excepts ones that are in the pgq schema.

      pgcompacttable --dbname billing --exclude-schema pgq

4) Если ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π½Π΅ запускаСтся, Ρ‚ΠΎ установитС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

postgres@tantor:~$ sudo apt-get install libdbi-perl libdbd-pg-perl

        Π§Ρ‚Π΅Π½ΠΈΠ΅ списков ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²&hellip; Π“ΠΎΡ‚ΠΎΠ²ΠΎ

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ Π΄Π΅Ρ€Π΅Π²Π° зависимостСй      

Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ состоянии&hellip; Π“ΠΎΡ‚ΠΎΠ²ΠΎ

Π£ΠΆΠ΅ установлСн ΠΏΠ°ΠΊΠ΅Ρ‚ libdbd-pg-perl самой Π½ΠΎΠ²ΠΎΠΉ вСрсии (3.7.4-3).

Π£ΠΆΠ΅ установлСн ΠΏΠ°ΠΊΠ΅Ρ‚ libdbi-perl самой Π½ΠΎΠ²ΠΎΠΉ вСрсии (1.642-1+deb10u2).

ОбновлСно 0 ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², установлСно 0 Π½ΠΎΠ²Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², для удалСния ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ 0 ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΈ 2 ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ.

5) ВнСситС измСнСния Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

postgres=# update t set id = id+6000000;

UPDATE 6000000

postgres=# delete from t where id < 11000000;

DELETE 4999999

6) ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ Π΅Ρ‘ индСксов:

postgres=# select pg_size_pretty(pg_total_relation_size('t'));

 pg_size_pretty

----------------

 4881 MB

(1 строка)

7) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

 postgres=# \! ls -l --color -w 1 $PGDATA/../u01/PG_16_202307071/5

ΠΈΡ‚ΠΎΠ³ΠΎ 4671504

-rw------- 1 postgres postgres 1073741824  12:13 18797

-rw------- 1 postgres postgres 1073741824  12:13 18797.1

-rw------- 1 postgres postgres 1073741824  12:13 18797.2

-rw------- 1 postgres postgres 1073741824  12:13 18797.3

-rw------- 1 postgres postgres  487276544  12:11 18797.4

-rw------- 1 postgres postgres    1196032  12:10 18797_fsm

-rw------- 1 postgres postgres     147456  12:11 18797_vm

-rw------- 1 postgres postgres          0  11:51 18800

-rw------- 1 postgres postgres       8192  11:51 18801

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΈΡ… ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΈΡΡŒ.

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ»Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для использования с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ влияниСм Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ экзСмпляра ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ сСссии ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΠ½Π° устанавливаСт ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ. Если ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ затянСтся ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляр ΠΈ ΡƒΡΠ΅Ρ‡ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ TRUNCATE.

8) ЗапуститС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ с числом Ρ†ΠΈΠΊΠ»ΠΎΠ² 1 (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 10):

postgres@tantor:~$ /opt/tantor/db/16/tools/pgcompacttable/bin/pgcompacttable -T t -o 1 -E 0

[12:17:56] (postgres) Connecting to database

[12:17:57] (postgres) Postgres backend pid: 15709

[12:17:57] (postgres) Handling tables. Attempt 1

[12:17:57] (postgres:public.demo2) SQL Error: ERROR:  only heap AM is supported

[12:17:57] (postgres:public.demo2) Table handling interrupt.

[12:17:57] (postgres:columnar_internal.chunk) Statistics: 22 pages (48 pages including toasts and indexes)

[12:17:57] (postgres:columnar_internal.chunk) Reindex: columnar_internal.chunk_pkey, initial size 18 pages(144.000KB), has been reduced by 61% (88.000KB), duration 0 seconds.

[12:17:57] (postgres:columnar_internal.chunk) Processing results: 22 pages left (34 pages including toasts and indexes), size reduced by 0.000B (112.000KB including toasts and indexes) in total.

[12:17:58] (postgres:public.hypo) Statistics: 55 pages (90 pages including toasts and indexes)

[12:17:58] (postgres:public.perf_columnar) SQL Error: ERROR:  only heap AM is supported

[12:17:58] (postgres:public.perf_columnar) Table handling interrupt.

[12:17:58] (postgres:public.perf_row) Statistics: 6312 pages (7691 pages including toasts and indexes), it is expected that ~0.570% (35 pages) can be compacted with the estimated space saving being 286.746KB.

[12:18:09] (postgres:public.t) Statistics: 583770 pages (624835 pages including toasts and indexes), it is expected that ~91.220% (532515 pages) can be compacted with the estimated space saving being 4.063GB.

[12:19:09] (postgres:public.t) Progress: 14%,  75560 pages completed.

[12:20:09] (postgres:public.t) Progress: 31%,  165855 pages completed.

[12:21:09] (postgres:public.t) Progress: 53%,  282255 pages completed.

[12:22:09] (postgres:public.t) Progress: 64%,  341475 pages completed.

[12:23:09] (postgres:public.t) Progress: 82%,  437160 pages completed.

[12:23:59] (postgres:public.t) Reindex: public.t_pk, initial size 40888 pages(319.438MB), has been reduced by 93% (297.992MB), duration 0 seconds.

[12:23:59] (postgres:public.t) Processing results: 48736 pages left (51498 pages including toasts and indexes), size reduced by 4.082GB (4.374GB including toasts and indexes) in total.

[12:23:59] (postgres) Processing complete.

[12:23:59] (postgres) Processing results: size reduced by 4.082GB (4.374GB including toasts and indexes) in total.

[12:23:59] (postgres) Disconnecting from database

[12:23:59] Processing complete: 1 retries to process has been done

[12:23:59] Processing results: size reduced by 4.082GB (4.374GB including toasts and indexes) in total, 4.082GB (4.374GB) postgres.

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° дольшС, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ - 6 ΠΌΠΈΠ½ΡƒΡ‚ ΠΈ освободила 4.374GB Π² ΠΎΠ±ΠΎΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… пространствах (Ρ‚Π°Π±Π»ΠΈΡ†Π°, индСкс, TOAST, TOAST-индСкс).

9) Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° (Ссли ΡƒΡΠΏΠ΅Ρ‚ΡŒ) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ установлСны:

postgres=# select locktype, database, relation, mode, granted from pg_locks;

  locktype  | database | relation |       mode       | granted

------------+----------+----------+------------------+---------

 relation   |        5 |    12073 | AccessShareLock  | t

 virtualxid |          |          | ExclusiveLock    | t

 relation   |        5 |    18761 | RowExclusiveLock | t

 relation   |        5 |    18706 | AccessShareLock  | t

 relation   |        5 |    18706 | RowExclusiveLock | t

 relation   |        5 |    12104 | AccessShareLock  | t

 virtualxid |          |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

 advisory   |        5 |          | ExclusiveLock    | t

(19 строк)

postgres=# select relname, oid from pg_class where oid in (12073,18761,18706,12104);

   relname   |  oid  

-------------+-------

 t           | 18706

 pg_settings | 12104

 pg_locks    | 12073

(3 строки)

На Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ установлСна Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° самого щадящСго уровня ACCESS SHARE. Π’Π°ΠΊΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ устанавливаСт ΠΊΠΎΠΌΠ°Π½Π΄Π° SELECT. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ слуТСбныС ΠΈ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° свой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ (virtualxid) всСгда устанавливаСт любая транзакция. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (advisory) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ самой ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Ρ‘ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ запуск.

10) МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ мСняСтся Π»ΠΈ объСм занятого кластСром мСста. Π’ процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ мСсто занятоС кластСром ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»ΠΎΡΡŒ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ постСпСнно ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ. Π­Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· основных прСимущСств ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹.

postgres@tantor:~/tantor-se-16$ du -hs

5.6G

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ мСсто освободилось:

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ мСсто:

postgres@tantor:~/tantor-se-16$ du -hs

1.3G

ΠœΠ΅ΡΡ‚ΠΎ освободилось.

11) РаспрСдСлСниС Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ процСссор разумная (75% ΠΈ 20%), использованиС языка perl Π½Π΅ являСтся ΡƒΠ·ΠΊΠΈΠΌ мСстом:

postgres@tantor:~$ top

для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎ процСссорам Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° <1>

для Π²Ρ‹Ρ…ΠΎΠ΄Π° Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ с Π±ΡƒΠΊΠ²ΠΎΠΉ <q>

12) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

postgres=# drop table t;

DROP TABLE

Π§Π°ΡΡ‚ΡŒ 7. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ORC (ΠšΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Citus columnar)

Π§Π°ΡΡ‚ΡŒ 7a. Установка ΠΈ использованиС

1) УстановитС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ pg_columnar:

postgres=# create extension pg_columnar;

CREATE EXTENSION

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ добавляСт Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ доступа columnar:

postgres=# SELECT * FROM pg_am WHERE amtype = 't';

  oid  |  amname  |             amhandler              | amtype

-------+----------+------------------------------------+--------

     2 | heap     | heap_tableam_handler               | t

 18276 | columnar | columnar_internal.columnar_handler | t

(2 строки)

2) Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° языкС ΠΏΠΈΡ‚ΠΎΠ½, которая Π³Π΅Π½Π΅Π½Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅. УстановитС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ языка:

postgres=# create extension plpython3u;

CREATE EXTENSION

3) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ВСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ создания Ρ‚Π°Π±Π»ΠΈΡ† ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

https://docs.tantorlabs.ru/tdb/ru/15_4/se/citus.html 

CREATE OR REPLACE FUNCTION random_words(n INT4) RETURNS TEXT LANGUAGE plpython3u AS $$

import random

t = ''

words = ['ноль','ΠΎΠ΄ΠΈΠ½','Π΄Π²Π°','Ρ‚Ρ€ΠΈ', 'Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅','ΠΏΡΡ‚ΡŒ','ΡˆΠ΅ΡΡ‚ΡŒ','сСмь','восСмь','Π΄Π΅Π²ΡΡ‚ΡŒ','Π΄Π΅ΡΡΡ‚ΡŒ']

for i in range (0,n):

  if (i != 0):

    t += ' '

  r = random.randint(0,len(words)-1)

  t += words[r]

return t

$$;

4) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для сравнСния:

CREATE TABLE perf_row(

    id INT8,

    ts TIMESTAMPTZ,

    customer_id INT8,

    vendor_id INT8,

    name TEXT,

    description TEXT,

    value NUMERIC,

    quantity INT4

) WITH (fillfactor = 100);

5) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΊΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½Ρ‹ΠΌ способом хранСния:

CREATE TABLE perf_columnar(LIKE perf_row) USING COLUMNAR;

6) Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

INSERT INTO perf_row

   SELECT

    g, -- id

    '2024-01-01'::timestamptz + ('1 minute'::interval * g), -- ts

    (random() * 1000000)::INT4, -- customer_id

    (random() * 100)::INT4, -- vendor_id

    random_words(5), -- name

    random_words(30), -- description

    (random() * 100000)::INT4/100.0, -- value

    (random() * 100)::INT4 -- quantity

   FROM generate_series(1,400000) g;

ΠŸΡ€ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… значСниях срСднСС количСство строк Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС 18:

postgres=# select (ctid::text::point)[0]::int block, count((ctid::text::point)[1]::int) from perf_row group by block limit 1;

 block | count

-------+-------

  1552 |    18

(1 строка)

6) Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΊΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ хранСния:

INSERT INTO perf_columnar SELECT * FROM perf_row;

7) Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ двумя Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ:

postgres=# SELECT pg_total_relation_size('perf_row')::numeric / pg_total_relation_size('perf_columnar');

      ?column?      

--------------------

 6.6730711498048634

(1 строка)

Π Π°Π·ΠΌΠ΅Ρ€ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Π² ΠΊΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ мСньшС Π² 6.6 Ρ€Π°Π·.

8) Команда вауумирования ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π΅Ρ‚ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ сТатия Π΄Π°Π½Π½Ρ‹Ρ…:

postgres=# VACUUM VERBOSE perf_columnar;

postgres=# VACUUM VERBOSE perf_columnar;

INFO:  statistics for "perf_columnar":

storage id: 10000000004

total file size: 27303936, total data size: 27191296

compression rate: 6.14x

total row count: 400000, stripe count: 3, average rows per stripe: 133333

chunk count: 320, containing data for dropped columns: 0, zstd compressed: 320

Алгоритм сТатия ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ zstd.

9) ΠžΡ†Π΅Π½ΠΈΠΌ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†. Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ статистику для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄:

postgres=# VACUUM ANALYZE perf_columnar;

VACUUM

postgres=# VACUUM ANALYZE perf_row;

VACUUM

postgres=# \timing on

Π‘Π΅ΠΊΡƒΠ½Π΄ΠΎΠΌΠ΅Ρ€ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½.

10)  Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†:

postgres=# SELECT vendor_id, SUM(quantity) FROM perf_row GROUP BY vendor_id OFFSET 1000;

 vendor_id | sum

-----------+-----

(0 строк)

ВрСмя: 134.842 мс

postgres=# SELECT vendor_id, SUM(quantity) FROM perf_columnar GROUP BY vendor_id OFFSET 1000;

 vendor_id | sum

-----------+-----

(0 строк)

ВрСмя: 75.612 мс

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ сканированиС ΠΈ индСкс Π½Π΅ Π½ΡƒΠΆΠ΅Π½. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ ΠΈΠ· perf_row ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ распараллСливаниС. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с perf_columnar ΠΏΠ»Π°Π½ Π±Π΅Π· распараллСливания.

11) Π‘Ρ€Π°Π²Π½ΠΈΠΌ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния запросов:

postgres=# explain (analyze, verbose, buffers) select ts from perf_row 

where ts < '2024-01-01 10:00:00'::timestamp with time zone and ts > '2024-01-01 10:00:05'::timestamp with time zone;

                                                                         QUERY PLAN                        

----------------------------------------------------------------------------

 Gather  (cost=1000.00..25719.10 rows=1 width=8) (actual time=97.565..100.336 rows=0 loops=1)

   Output: ts

   Workers Planned: 2

   Workers Launched: 2

   Buffers: shared hit=12583 read=9636

   ->  Parallel Seq Scan on public.perf_row  (cost=0.00..24719.00 rows=1 width=8) (actual time=38.320..38.32

         Output: ts

         Filter: ((perf_row.ts < '2024-01-01 10:00:00+03'::timestamp with time zone) AND (perf_row.ts > '202

         Rows Removed by Filter: 133333

         Buffers: shared hit=12583 read=9636

         Worker 0:  actual time=0.004..0.007 rows=0 loops=1

         Worker 1:  actual time=31.721..31.724 rows=0 loops=1

           Buffers: shared hit=5808 read=3796

 Query Identifier: 2186672309236281157

 Planning:

   Buffers: shared hit=5 dirtied=2

 Planning Time: 0.161 ms

 Execution Time: 100.509 ms

(18 строк)

ВрСмя: 101.194 мс

postgres=# explain (analyze, verbose, buffers) select ts from perf_columnar where ts < '2024-01-01 10:00:00'::timestamp with time zone and ts > '2024-01-01 10:00:05'::timestamp with time zone; 

                                                                           QUERY PLAN                      

----------------------------------------------------------------------------- Custom Scan (ColumnarScan) on public.perf_columnar  (cost=0.00..138.24 rows=1 width=8) (actual time=1.776..

   Output: ts

   Filter: ((perf_columnar.ts < '2024-01-01 10:00:00+03'::timestamp with time zone) AND (perf_columnar.ts >

   Rows Removed by Filter: 10000

   Columnar Projected Columns: ts

   Columnar Chunk Group Filters: ((ts < '2024-01-01 10:00:00+03'::timestamp with time zone) AND (ts > '2024-

   Columnar Chunk Groups Removed by Filter: 39

   Buffers: shared hit=196 read=4

 Query Identifier: -8278109995448103328

 Planning:

   Buffers: shared hit=51

 Planning Time: 0.225 ms

 Execution Time: 2.094 ms

(13 строк)

ВрСмя: 2.983 мс

        

УскорСниС Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π² 50 Ρ€Π°Π·.

12) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

drop table if exists perf_row;

drop table if exists perf_columnar;

Π§Π°ΡΡ‚ΡŒ 7b. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сТатия

1) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

create table perf_row

( id int

, name varchar(15)

, number int

, time timestamp

, text1 varchar(64)

) WITH (fillfactor = 100);

create table perf_columnar

( id int

, name varchar(15)

, number int

, time timestamp

, text1 varchar(64)

) USING COLUMNAR;

2) Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ perf_row Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:        

DO $$

DECLARE

 names varchar(10)[7] := '{"ОлСг", "Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ", "АлСксандр", "Π”Π°Ρ€ΡŒΡ", "Эмиль", "Π’Π°Π΄ΠΈΠΌ", "АнТСлика"}';

 n int;

 interv varchar(20);

BEGIN

 for i in 0..5e5 loop n:=trunc(random()*1000+1);

  interv := n||' days';

  insert into perf_row values( i, names[floor((random()*7))+1::int]

  , n

  , current_timestamp + interv::interval

  , md5(i::text)

  );

  end loop;

END$$;

3) Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ статистику:

ANALYZE perf_row;

4) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ рССрСнсныС запросы Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

select id,name,number from perf_row where id = 50;

select sum(number), avg(id) from perf_row where id between 777 and 7777777;

5) Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅ индСкс ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ запрос с использованиСм индСкса:

create index i on perf_row(id);

select id,name,number from perf_row where id = 50;

6) Π―Π²Π½ΠΎ Π·Π°Π΄Π°ΠΉΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сТатия:

ALTER TABLE perf_columnar SET (columnar.compression = zstd);

7) Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:        

INSERT INTO perf_columnar SELECT * FROM perf_row;

8) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ запросы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ хранСния ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния Π΄Π²ΡƒΡ… запросов:

postgres=# SELECT pg_total_relation_size('perf_row')::numeric / pg_total_relation_size('perf_columnar');

      ?column?      

--------------------

 3.7006444053895723

(1 строка)

select id,name,number from perf_columnar where id = 50;

select sum(number), avg(id) from perf_columnar where id between 777 and 7777777;

9) ИзмСняя Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сТатия ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

TRUNCATE perf_columnar;

ALTER TABLE perf_columnar SET (columnar.compression = pglz);

INSERT INTO perf_columnar SELECT * FROM perf_row;

SELECT pg_total_relation_size('perf_row')::numeric / pg_total_relation_size('perf_columnar');

select id,name,number from perf_columnar where id = 50;

select sum(number), avg(id) from perf_columnar where id between 777 and 7777777;

TRUNCATE perf_columnar;

ALTER TABLE perf_columnar SET (columnar.compression = lz4);

INSERT INTO perf_columnar SELECT * FROM perf_row;

SELECT pg_total_relation_size('perf_row')::numeric / pg_total_relation_size('perf_columnar');

select id,name,number from perf_columnar where id = 50;

select sum(number), avg(id) from perf_columnar where id between 777 and 7777777;

ВрСмя выполнСния ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ perf_row: пСрвая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎ индСксу 0.46мс; Π±Π΅Π· индСкса 29мс; Π²Ρ‚орая ΠΊΠΎΠΌΠ°Π½Π΄Π°: 41мс.

Π‘ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ сТатия zstd: Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² 3.7 Ρ€Π°Π·Π° мСньшС; врСмя 1.7 ΠΈ 52

Π‘ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ сТатия pglz: 2.7; 1.2 ΠΈ 56

Π‘ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ сТатия lz4: 2.56; 1.4 ΠΈ 45

Алгоритм сТатия ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ zstd являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивным.

Π§Π°ΡΡ‚ΡŒ 7c. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒ строки нСльзя. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

postgres=# delete from perf_columnar where id=0;

ERROR:  UPDATE and CTID scans not supported for ColumnarScan

postgres=# update perf_columnar set id=0 where id=0;

ERROR:  UPDATE and CTID scans not supported for ColumnarScan

Выдаётся ошибка.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ всСх строк Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ выполняСтся:

postgres=# delete from perf_columnar;

ERROR:  UPDATE and CTID scans not supported for ColumnarScan

2) ΠŸΡΠ΅Π²Π΄ΠΎΡΡ‚ΠΎΠ»Π±Ρ†Ρ‹ CTID, xmin, xmax ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ хранСния heap ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ columnar.

xmin - Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ (xid) создавшСй строку.

ctid Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° tid (Tuple ID, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ строки), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт физичСский адрСс строки, состоит ΠΈΠ· Π½ΠΎΠΌΠ΅Ρ€Π° Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° слота (записи Π² спискС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ°) Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ°.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ описаниС Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… tid:

postgres=# \dT tid

                      Бписок Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…

   Π‘Ρ…Π΅ΠΌΠ°    | Имя |                  ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅                  

------------+-----+---------------------------------------------

 pg_catalog | tid | (block, offset), physical location of tuple

(1 строка)

postgres=# \x

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½.

postgres=# \dT+ tid

Бписок Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…

-[ RECORD 1 ]--+--------------------------------------------

Π‘Ρ…Π΅ΠΌΠ°          | pg_catalog

Имя            | tid

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ имя | tid

Π Π°Π·ΠΌΠ΅Ρ€         | 6

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹       |

Π’Π»Π°Π΄Π΅Π»Π΅Ρ†       | postgres

ΠŸΡ€Π°Π²Π° доступа  |

ОписаниС       | (block, offset), physical location of tuple

postgres=# \x

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½.

        

Π Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ tid ΡˆΠ΅ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚. Π§Π΅Ρ‚Ρ‹Ρ€Π΅ Π±Π°ΠΉΡ‚Π° Π½Π° Π½ΠΎΠΌΠ΅Ρ€ страницы, Π΄Π²Π° Π±Π°ΠΉΡ‚Π° Π½Π° Π½ΠΎΠΌΠ΅Ρ€ слота Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ°. Π§Π΅Ρ‚Ρ‹Ρ€Π΅ Π±Π°ΠΉΡ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ 2^32-2=0xFFFFFFFE Π±Π»ΠΎΠΊΠΎΠ², Ρ‡Ρ‚ΠΎ соотвСтствуСт 32Π’Π± (ΠΈ минус 2 Π±Π°ΠΉΡ‚Π°) для 8Кб Π±Π»ΠΎΠΊΠ°, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ исходного ΠΊΠΎΠ΄Π° src/include/storage/block.h ΠΊΠ°ΠΊ #define MaxBlockNumber ((BlockNumber) 0xFFFFFFFE)

Π’Π°Π±Π»ΠΈΡ†Π° (ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹) хранится Π² Ρ„Π°ΠΉΠ»Π°Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π΄ΠΎ 2Π“Π±, Π½ΠΎΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° указываСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, нумСрация Π±Π»ΠΎΠΊΠΎΠ² начинаСтся с нуля: ctid=(0,*).

Командой \dT+ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ физичСского мСста, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ поля Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… нСбольшого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. НапримСр date, boolean, timestamp, timestamptz, point.

3) Π’ heap Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ псСвдостолбцы:

postgres=# select ctid, xmin, xmax, * from perf_row where id=0;

 ctid  | xmin | xmax | id |   name   | number |            time            |  text1            

-------+------+------+----+----------+--------+----------------------------+-----------

 (0,1) | 1006 |    0 |  0 | АнТСлика |    962 | 2026-12-08 15:39:59.029462 |cfcd20849..

(1 строка)

4) Π’ columnar Ρ‚Π°Π±Π»ΠΈΡ†Π΅ псСвдостолбцы ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚:

postgres=# select ctid, * from perf_columnar where id=0;           

ERROR:  UPDATE and CTID scans not supported for ColumnarScan

postgres=# select xmin, xmax, * from perf_columnar where id=0;   

ERROR:  UPDATE and CTID scans not supported for ColumnarScan

postgres=# select xmin, * from perf_columnar where id=0;     

ERROR:  UPDATE and CTID scans not supported for ColumnarScan

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ псСвдостолбцами Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. ΠŸΡΠ΅Π²Π΄ΠΎΡΡ‚ΠΎΠ»Π±Π΅Ρ† ctid ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ диагностикС ошибок.

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ограничСния цСлостности. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ цСлостности PRIMARY KEY ΠΈ UNIQUE ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ индСкс Π΄Π»Ρ быстрой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ соотвСтствия вставляСмой строки ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡŽ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ автоматичСски создаётся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ индСкс. PRIMARY KEY ΠΎΡ‚личаСтся ΠΎΡ‚ UNIQUE Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ добавляСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ цСлостности NOT NULL Π½Π° столбцы ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² PRIMARY KEY (Β«ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ столбцы»). ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ограничСния цСлостности индСкс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ цСлостности удаляСтся. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ индСкса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ рСсурсоСмким ΠΈ Π΄ΠΎΠ»Π³ΠΈΠΌ, администраторам Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ эти особСнности ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ цСлостности.

postgres=# alter table perf_columnar alter column id drop not null;

ALTER TABLE

postgres=# alter table perf_columnar add unique (id) deferrable;

ERROR:  Foreign keys and AFTER ROW triggers are not supported for columnar tables

ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Consider an AFTER STATEMENT trigger instead.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ цСлостности с ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ (ΠΏΡ€ΠΈ фиксации Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ) Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ.

postgres=# alter table perf_columnar add unique (id);

ALTER TABLE

postgres=# \d perf_columnar

                                Π’Π°Π±Π»ΠΈΡ†Π° "public.perf_columnar"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |             Π’ΠΈΠΏ             | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

---------+-----------------------------+--------------------+-------------------+--------------

 id      | integer                     |                    |                   |

 name    | character varying(15)       |                    |                   |

 number  | integer                     |                    |                   |

 time    | timestamp without time zone |                    |                   |

 text1   | character varying(64)       |                    |                   |

Π˜Π½Π΄Π΅ΠΊΡΡ‹:

 "perf_columnar_id_key" UNIQUE CONSTRAINT, btree (id)

Названия индСкса ΠΈ ограничСния цСлостности ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅, Π½ΠΎ автоматичСски создаваСмоС имя ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятно.

postgres=# \d perf_columnar_id_key 

    ИндСкс "public.perf_columnar_id_key"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |   Π’ΠΈΠΏ   | ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ? | ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

---------+---------+-----------+-------------

 id      | integer | Π΄Π°        | id

ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ, btree, для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "public.perf_columnar"

postgres=# alter table perf_columnar drop constraint perf_columnar_id_key;

ALTER TABLE

postgres=# alter table perf_columnar add primary key (id);

ALTER TABLE

postgres=# \d perf_columnar

                                Π’Π°Π±Π»ΠΈΡ†Π° "public.perf_columnar"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |             Π’ΠΈΠΏ             | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

---------+-----------------------------+--------------------+-------------------+--------------

 id      | integer                     |                    | not null          |

 name    | character varying(15)       |                    |                   |

 number  | integer                     |                    |                   |

 time    | timestamp without time zone |                    |                   |

 text1   | character varying(64)       |                    |                   |

Π˜Π½Π΄Π΅ΠΊΡΡ‹:

    "perf_columnar_pkey" PRIMARY KEY, btree (id)

6) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ индСкс:

postgres=# explain select id from perf_columnar where id = 10000;

                                   QUERY PLAN                                  

------------------------------------------------------------------------

 Custom Scan (ColumnarScan) on perf_columnar  (cost=0.00..84.88 rows=1 width=4)

   Filter: (id = 10000)

   Columnar Projected Columns: id

   Columnar Chunk Group Filters: (id = 10000)

(4 строки)

ИндСкс Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ ΠΎΠ½ нСэффСктивСн. Для использования индСкса ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

SET columnar.enable_custom_scan TO OFF;

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ использования индСкса Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠ·ΠΊΠ°: врСмя выполнСния увСличится Π² 2 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π· ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Custom Scan (ColumnarScan). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ columnar.enable_custom_scan скрыт.

7) Π£Π΄Π°Π»ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡:

postgres=# alter table perf_columnar drop constraint perf_columnar_pkey;

ALTER TABLE

postgres=# \d perf_columnar

                                Π’Π°Π±Π»ΠΈΡ†Π° "public.perf_columnar"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |             Π’ΠΈΠΏ             | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

---------+-----------------------------+--------------------+-------------------+--------------

 id      | integer                     |                    | not null          |

 name    | character varying(15)       |                    |                   |

 number  | integer                     |                    |                   |

 time    | timestamp without time zone |                    |                   |

 text1   | character varying(64)       |                    |                   |

ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ограничСния цСлостности удаляСтся индСкс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ цСлостности. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ цСлостности NOT NULL Π½Π΅ удаляСтся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² систСмном ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π½Π΅ сохраняСтся сущСствовало Π»ΠΈ ΠΎΠ½ΠΎ Π΄ΠΎ создания ограничСния цСлостности ΠΈΠ»ΠΈ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΡ€ΠΈ создании ограничСния цСлостности Ρ‚ΠΈΠΏΠ° PRIMARY KEY.

8) Π’ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ строки. ΠšΡ€ΠΎΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ INSERT ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ COPY. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# COPY perf_columnar (id) FROM PROGRAM 'echo 500001';

COPY 1

Команда ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ вставила ΠΎΠ΄Π½Ρƒ строку.

9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ:

postgres=# \dconfig columnar.*

      Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

            ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€            | Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

--------------------------------+----------

 columnar.chunk_group_row_limit | 10000

 columnar.compression           | zstd

 columnar.compression_level     | 3

 columnar.planner_debug_level   | debug3

 columnar.stripe_row_limit      | 150000

(5 строк)

Если список пуст, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сСссиСй Π½Π΅ использовался Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Π’ этом ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, которая задСйствуСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. НапримСр:

select id,name from perf_columnar where id = 1;

10) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ значСния ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для Π°Π»Π³ΠΎΡ€ΠΈΠΌΠ° сТатия:

postgres=# set columnar.compression TO <TAB><TAB>

DEFAULT  lz4      "none"   pglz     zstd

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ Ρ‚Ρ€ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° сТатия.

11) Π§Π°ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Π°Π±Π»ΠΈΡ†. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ создаёт прСдставлСниС Π³Π΄Π΅ эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ хранСния ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ:

postgres=# select * from columnar.options;

   relation    | chunk_group_row_limit | stripe_row_limit | compression | compression_level

---------------+-----------------------+------------------+-------------+-------------------

 demo2         |                 10000 |           150000 | zstd        |                 3

 perf_columnar |                 10000 |           150000 | pglz        |                 3

(2 строки)

12) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ установки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# ALTER TABLE perf_columnar RESET (columnar.compression);

ALTER TABLE


Π Π°Π·Π΄Π΅Π» 5. Π–ΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π–ΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

  1. Какая информация ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΆΡƒΡ€Π½Π°Π»
  2. РасполоТСниС ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² сСрвСра
  3. Как информация ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΆΡƒΡ€Π½Π°Π»
  4. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° csv
  5. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π° сообщСний

Π§Π°ΡΡ‚ΡŒ 1. Какая информация ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΆΡƒΡ€Π½Π°Π»

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ psql:

astra@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#


postgres=#
SHOW log_line_prefix;

   log_line_prefix      

------------------------

%m [%p:%v] [%d] %r %a  

(1 row)

%m: Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ сообщСния (DEBUG5, DEBUG4, INFO, WARNING, ERROR, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅).

[%p:%v]: Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса PostgreSQL ΠΈ Π½ΠΎΠΌΠ΅Ρ€ вСрсии ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°.

[%d]: Π˜ΠΌΡ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

%r: Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

%a: IP-адрСс ΠΈ ΠΏΠΎΡ€Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Π§Π°ΡΡ‚ΡŒ 2. РасполоТСниС ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² сСрвСра

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ²

postgres=# SHOW log_directory;

 log_directory

---------------

 log

(1 row)

Какая маска Ρƒ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»Π°?

postgres=# SHOW log_filename;

          log_filename          

--------------------------------

 postgresql-%Y-%m-%d_%H%M%S.log

(1 row)

Π“Π΄Π΅ находятся Π΄Π°Π½Π½Ρ‹Ρ… кластСра Π‘Π”?

postgres=# SHOW data_directory;

            data_directory            

---------------------------------------

 /var/lib/postgresql/tantor-se-14/data

(1 row)

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ содСрТимоС ΠΏΠ°ΠΏΠΊΠΈ ΠΆΡƒΡ€Π½Π°Π»Π°.

postgres=#\! ls -l /var/lib/postgresql/tantor-se-14/data/log

total 148228

-rw------- 1 postgres postgres     1115 Jul  3  2023 postgresql-2023-07-03_130021.log

-rw------- 1 postgres postgres     1112 Jul  3  2023 postgresql-2023-07-03_130033.log

-rw------- 1 postgres postgres     6545 Jul  3  2023 postgresql-2023-07-03_162937.log

-------------------------------

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ содСрТимоС любого ΠΆΡƒΡ€Π½Π°Π»Π°.

postgres=# \! tail -n 10  /var/lib/postgresql/tantor-se-14/data/log/postgresql-2023-07-03_130021.log

2023-07-03 13:00:21.009 MSK [23506] LOG:  listening on IPv6 address "::1", port 5432

2023-07-03 13:00:21.012 MSK [23506] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

2023-07-03 13:00:21.017 MSK [23506] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"

2023-07-03 13:00:21.021 MSK [23508] LOG:  database system was shut down at 2023-07-03 13:00:19 MSK

2023-07-03 13:00:21.027 MSK [23506] LOG:  database system is ready to accept connections

2023-07-03 13:00:33.293 MSK [23506] LOG:  received fast shutdown request

2023-07-03 13:00:33.297 MSK [23506] LOG:  aborting any active transactions

2023-07-03 13:00:33.299 MSK [23506] LOG:  background worker "logical replication launcher" (PID 23514) exited with exit code 1

2023-07-03 13:00:33.300 MSK [23509] LOG:  shutting down

2023-07-03 13:00:33.328 MSK [23506] LOG:  database system is shut down

УбСдились, Ρ‡Ρ‚ΠΎ маска соотвСтствуСт.

Π§Π°ΡΡ‚ΡŒ 3. Как информация ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΆΡƒΡ€Π½Π°Π»

postgres=# CREATE TABLE t (id integer);

CREATE TABLE

postgres=# \! tail -n 10  /var/lib/postgresql/tantor-se-14/data/log/postgresql-2024-02-29_100938.log

2024-02-29 07:49:54.753 MSK [5289:8/30] [postgres] [local] psql LOG:  statement: create table t (id integer);

Π§Π°ΡΡ‚ΡŒ 4. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° csv

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

        

postgres=# SHOW log_destination;

log_destination

-----------------

 stderr

(1 row)

2) ИзмСним ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ.

postgres=# ALTER SYSTEM SET log_destination = 'stderr,csvlog';

ALTER SYSTEM

postgres=# SELECT pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 row)

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ примСняСтся.

postgres=# SHOW log_destination;

 log_destination

-----------------

 stderr,csvlog

(1 row

4) Вставим Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ t.

postgres=# INSERT INTO t VALUES(1);

INSERT 0 1

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ содСрТимоС Ρ„Π°ΠΉΠ»Π°.

postgres=# \! ls -l /var/lib/postgresql/tantor-se-14/data/log/*csv

-rw------- 1 postgres postgres 30749 Feb 29 08:02 /var/lib/postgresql/tantor-se-14/data/log/postgresql-2024-02-29_080122.csv

6) Добавился Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… csv.

        

postgres=#\! tail -n 1 /var/lib/postgresql/tantor-se-14/data/log/postgresql-2024-02-29_080122.csv

2024-02-29 08:08:54.580 MSK,"postgres","postgres",9199,"[local]",65e01024.23ef,3,"idle",2024-02-29 08:03:32 MSK,5/325,0,LOG,00000,"statement: insert into t values(1);",,,,,,,,,"psql","client backend",,0

7) Π‘Ρ€Π°Π²Π½ΠΈΠΌ с содСрТимым ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΆΡƒΡ€Π½Π°Π»Π°.

postgres=# INSERT INTO t VALUES(1);

INSERT 0 1

postgres=# \! tail -n 1 /var/lib/postgresql/tantor-se-14/data/log/postgresql-2024-02-29_080122.log

2024-02-29 08:12:02.631 MSK [9199:5/326] [postgres] [local] psql LOG:  statement: insert into t values(1);

postgres=#

Π§Π°ΡΡ‚ΡŒ 5.  Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π° сообщСний

postgres=# show logging_collector;

 logging_collector

-------------------

 on

(1 row)

Π£Π΄Π°Π»ΠΈΠΌ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹:

postgres=# DROP TABLE t;

DROP TABLE

postgres=# ALTER SYSTEM SET log_destination = 'stderr';        

ALTER SYSTEM

postgres=# SELECT pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 row)


Π Π°Π·Π΄Π΅Π» 6. Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

РолСвая модСль бСзопасности

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ
  2. Установка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²
  3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ
  4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ схСмы ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
  5. Π’Ρ‹Π΄Π°Ρ‡Π° Ρ€ΠΎΠ»ΠΈ доступа ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅
  6. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ

1) Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ инструмСнт psql

astra@alse-vanilla-gui:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=#

2) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ:

postgres=# CREATE ROLE user1;

CREATE ROLE

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡ‚ΡŒ Ρ€ΠΎΠ»ΠΈ Π² Π‘Π£Π‘Π”:

postgres=# \du

                                      Бписок Ρ€ΠΎΠ»Π΅ΠΉ

    Имя Ρ€ΠΎΠ»ΠΈ    |                                ΠΡ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹                                

----------------+-------------------------------------------------------------------------

 anon_test_user | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

 pma_user       | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ

 postgres       | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”, РСпликация, ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ RLS

 replicator     | РСпликация

 user1          | Π’Ρ…ΠΎΠ΄ Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½


Π§Π°ΡΡ‚ΡŒ 2. Установка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

postgres=# ALTER ROLE user1 LOGIN CREATEDB;      

ALTER ROLE

postgres=# \du

                                      Бписок Ρ€ΠΎΠ»Π΅ΠΉ

    Имя Ρ€ΠΎΠ»ΠΈ    |                                ΠΡ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹                                

----------------+-------------------------------------------------------------------------

 anon_test_user | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

 pma_user       | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ

 postgres       | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”, РСпликация, ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ RLS

 replicator     | РСпликация

 user1          | Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”

Π§Π°ΡΡ‚ΡŒ 3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° Ρ€ΠΎΠ»ΡŒ, ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΊ кластСру, Π° ΠΏΠΎΠ΄ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π‘Π” Π½ΠΎ нСльзя Π΄Π΅Π»Π°Ρ‚ΡŒ соСдинСния ΠΊ Π‘Π”.

1) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ

postgres=# CREATE ROLE user2;

CREATE ROLE

postgres=# ALTER ROLE user2 LOGIN;           

ALTER ROLE

2) ΠžΡ‚Π·ΠΎΠ²Π΅ΠΌ лишний Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚:

postgres=# ALTER ROLE user1 NOLOGIN;

ALTER ROLE

postgres=# \du

                                      Бписок Ρ€ΠΎΠ»Π΅ΠΉ

    Имя Ρ€ΠΎΠ»ΠΈ    |                                ΠΡ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹                                

----------------+-------------------------------------------------------------------------

 anon_test_user | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

 pma_user       | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ

 postgres       | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”, РСпликация, ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ RLS

 replicator     | РСпликация

 user1          | Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”, Π’Ρ…ΠΎΠ΄ Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½

 user2          |

3) Π”Π°Π΄ΠΈΠΌ ΠΏΡ€Π°Π²ΠΎ вхоТдСния Π² Π³Ρ€ΡƒΠΏΠΏΡƒ user1 Ρ€ΠΎΠ»ΠΈ user2.

postgres=# GRANT user1 TO user2;

GRANT ROLE  

4) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ условия задания:

5) ΠŸΠ΅Ρ€Π²Π°Ρ Ρ€ΠΎΠ»ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² кластСр Π‘Π”:

postgres=# \c - user1

ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру Ρ‡Π΅Ρ€Π΅Π· сокСт "/var/run/postgresql/.s.PGSQL.5432" Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ: Π’ΠΠ–ΠΠž:  Π΄Π»Ρ Ρ€ΠΎΠ»ΠΈ "user1" Π²Ρ…ΠΎΠ΄ Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

6) Π’Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ΄ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€ΠΎΠ»ΡŒΡŽ:

postgres=# \c - user2

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "user2"

7) ΠŸΡ‹Ρ‚Π°Π΅ΠΌΡΡ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€ΠΎΠ»ΡŒΡŽ

postgres=> CREATE DATABASE  dat1;

ΠžΠ¨Π˜Π‘ΠšΠ:  Π½Π΅Ρ‚ ΠΏΡ€Π°Π² Π½Π° созданиС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

8) ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ€ΠΎΠ»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ

postgres=> SET ROLE user1;

SET

9) Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ

postgres=> CREATE DATABASE  dat1;

CREATE DATABASE

10) ВСрнСмся ΠΊ Ρ€ΠΎΠ»ΠΈ user2

postgres=> RESET ROLE;

RESET

11) ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ Π‘Π” dat1

dat1=> \c dat1

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "dat1" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "user2".

Π§Π°ΡΡ‚ΡŒ 4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ схСмы ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

dat1=> CREATE SCHEMA sch1;

CREATE SCHEMA

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΡ‚ΠΎ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† схСмы

 

dat1=> \dn+

                                      List of schemas

 Name  |       Owner       |           Access privileges            |      Description        

-------+-------------------+----------------------------------------+------------------------

public | pg_database_owner | pg_database_owner=UC/pg_database_owner+| standard public schema

       |                   | =U/pg_database_owner                   |  

sch1   | user2             |                                        |  

(2 строки)

dat1=> CREATE TABLE sch1.a1 (id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, str text);  

CREATE TABLE

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ описаниС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

dat1=>\d sch1.a1

                           Π’Π°Π±Π»ΠΈΡ†Π° "sch1.a1"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |   Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL |         По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ        

---------+---------+--------------------+-------------------+------------------------------

 id      | integer |                    | not null          | generated always as identity

 str     | text    |                    |                   |

Π˜Π½Π΄Π΅ΠΊΡΡ‹:

    "a1_pkey" PRIMARY KEY, btree (id)

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ

dat1=>\dp sch1.a1 

                                                    ΠŸΡ€Π°Π²Π° доступа

 Π‘Ρ…Π΅ΠΌΠ° | Имя |   Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²Π° доступа | ΠŸΡ€Π°Π²Π° для столбцов | ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ

-------+-----+---------+---------------+--------------------+----------

 sch1  | a1  | Ρ‚Π°Π±Π»ΠΈΡ†Π° |               |                    |

(1 строка)

Пока Π½Π΅Ρ‚ Π½ΠΈ Ρƒ ΠΊΠ°ΠΊΠΎΠΉ Ρ€ΠΎΠ»ΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ.

Π§Π°ΡΡ‚ΡŒ 5. Π’Ρ‹Π΄Π°Ρ‡Π° Ρ€ΠΎΠ»ΠΈ доступа ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅

1) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Ρ€ΠΎΠ»ΡŒ:

dat1=> \c - postgres

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "dat1" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres"

dat1=# CREATE ROLE user3 LOGIN;

CREATE ROLE

2) ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ a1.

dat1=# \c - user3

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "dat1" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "user3".

dat1=> \dn

    Бписок схСм

  Имя   |     Π’Π»Π°Π΄Π΅Π»Π΅Ρ†      

--------+-------------------

 public | pg_database_owner

 sch1   | user2

(2 rows)

dat1=> SELECT * FROM sch1.a1;

ΠžΠ¨Π˜Π‘ΠšΠ:  Π½Π΅Ρ‚ доступа ΠΊ схСмС sch1

БВРОКА 1: SELECT * FROM sch1.a1;

3) Π’ доступС ΠΎΡ‚ΠΊΠ°Π·Π°Π½ΠΎ Π½Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ Π½Π° схСму.

dat1=> \c - postgres

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "dat1" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres"

dat1=> GRANT USAGE on SCHEMA sch1 TO user3;

GRANT

dat1=> \dn+ sch1

               Π‘писок схСм

 Π˜ΠΌΡ  | Π’Π»Π°Π΄Π΅Π»Π΅Ρ† | ΠŸΡ€Π°Π²Π° доступа  | ОписаниС

------+----------+----------------+----------

 sch1 | user2    | user2=UC/user2+|

      |          | user3=U/user2  |

(1 строка)

dat1=> \c - user3

You are now connected to database "dat1" as user "user3".

dat1=> SELECT * FROM sch1.a1;

ΠžΠ¨Π˜Π‘ΠšΠ:  Π½Π΅Ρ‚ доступа ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ a1

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚ΠΊΠ°Π· ΠΈΠ·-Π·Π° отсутствия ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π΅ a1.

dat1=> \c - postgres

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "dat1" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres"

dat1=> GRANT SELECT, INSERT (str) ON TABLE sch1.a1 to user3;

GRANT

dat1=> \dp sch1.a1

                               ΠŸΡ€Π°Π²Π° доступа

 Π‘Ρ…Π΅ΠΌΠ° | Имя |   Π’ΠΈΠΏ   |    ΠŸΡ€Π°Π²Π° доступа    | ΠŸΡ€Π°Π²Π° для столбцов | ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ

-------+-----+---------+---------------------+--------------------+----------

 sch1  | a1  | Ρ‚Π°Π±Π»ΠΈΡ†Π° | user2=arwdDxt/user2+| str:              +|

       |     |         | user3=r/user2       |   user3=a/user2    |

(1 строка)

dat1=> \c - user3

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "dat1" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "user3"

dat1=> SELECT * FROM sch1.a1;

id | str

----+-----

(0 строк)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Π² порядкС. Доступ прСдоставлСн Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π²Ρ‹Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ.
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ вставку Π² столбСц.

dat1=> INSERT INTO sch1.a1 (str) VALUES ('пСрвая запись');  

INSERT 0 1

dat1=> SELECT * FROM sch1.a1;

id |      str      

----+---------------

 1 | пСрвая запись

(1 row)

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ вставку Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ столбСц.

dat1=> INSERT INTO sch1.a1 OVERRIDING SYSTEM VALUE values (2);                 

ΠžΠ¨Π˜Π‘ΠšΠ:  Π½Π΅Ρ‚ доступа ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ a1

НС Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ строк ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ - Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΈΠ»ΠΈ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

dat1=> DELETE FROM sch1.a1;                                     

ΠžΠ¨Π˜Π‘ΠšΠ:  Π½Π΅Ρ‚ доступа ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ a1

dat1=> DROP TABLE sch1.a1;  

ΠžΠ¨Π˜Π‘ΠšΠ:  Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ a1

Π§Π°ΡΡ‚ΡŒ 6. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π£Π΄Π°Π»ΠΈΠΌ схСму.

dat1=> \c - user2

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "dat1" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "user2".

dat1=> DROP SCHEMA sch1;

ΠžΠ¨Π˜Π‘ΠšΠ:  ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ схСма sch1 нСльзя, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ‚ Π½Π΅Π³ΠΎ зависят Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Ρ‚Π°Π±Π»ΠΈΡ†Π° sch1.a1 зависит ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° схСма sch1

ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π”ля удалСния зависимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ DROP ... CASCADE.

Π‘Ρ…Π΅ΠΌΠ° Π½Π΅ пуста, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ каскадом.

dat1=> DROP SCHEMA sch1 CASCADE;

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•:  ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ распространяСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π° sch1.a1

DROP SCHEMA

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠΌΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΡƒΠ΄Π°Π»ΠΈΠΌ dat1.

dat1=> \c postgres  

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "user2".

postgres=> DROP DATABASE dat1 (force);

DROP DATABASE

Для удалСния Ρ€ΠΎΠ»Π΅ΠΉ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ€ΠΎΠ»ΡŒΡŽ.

        

postgres=> \c - postgres  

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres".

postgres=# DROP ROLE user1, user2, user3;

DROP ROLE


ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ аутСнтификация

  1. РасполоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
  2. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΏΡ€Π°Π²ΠΈΠ» Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
  3. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ измСнСния для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
  4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° коррСктности настройки
  5. ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π§Π°ΡΡ‚ΡŒ 1. РасполоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

1) Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ инструмСнт psql.

astra@alse-vanilla-gui:~$ sudo su - postgres

postgres@alse-vanilla-gui:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ мСсто располоТСниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.


postgres=# SHOW hba_file;

                    hba_file                      

---------------------------------------------------

/var/lib/postgresql/tantor-se-16/data/pg_hba.conf

(1 строка)

3) МоТно ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСдставлСния pg_hba_file_rules


postgres=# \d pg_hba_file_rules;

                ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ "pg_catalog.pg_hba_file_rules"

   Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ†   |   Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

-------------+---------+--------------------+-------------------+--------------

 rule_number | integer |                    |                   |

 file_name   | text    |                    |                   |

 line_number | integer |                    |                   |

 type        | text    |                    |                   |

 database    | text[]  |                    |                   |

 user_name   | text[]  |                    |                   |

 address     | text    |                    |                   |

 netmask     | text    |                    |                   |

 auth_method | text    |                    |                   |

 options     | text[]  |                    |                   |

 error       | text    |                    |                   |


Π§Π°ΡΡ‚ΡŒ 2. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΏΡ€Π°Π²ΠΈΠ» Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

postgres=# SELECT rule_number, type, database, user_name, auth_method FROM  pg_hba_file_rules();   

rule_number | type  |   database    | user_name  | auth_method

-------------+-------+---------------+------------+-------------

           1 | local | {all}         | {pma_user} | md5

           2 | local | {all}         | {all}      | trust

           3 | host  | {all}         | {all}      | trust

           4 | host  | {all}         | {all}      | trust

           5 | local | {replication} | {all}      | trust

           6 | host  | {replication} | {all}      | trust

           7 | host  | {replication} | {all}      | trust

           8 | host  | {all}         | {all}      | md5

(8 строк)

(7 rows)

Π§Π°ΡΡ‚ΡŒ 3. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ измСнСния для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

1) Π›ΡŽΠ±Ρ‹ΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ внСсСм Π΄Π²Π΅ строки.

Π€Π°ΠΉΠ» pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD

local   all             all                                   ident    map=map1

Π€Π°ΠΉΠ» pg_ident.conf

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

map1   astra  user1

postgres@alse-vanilla-gui:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку

postgres=# SELECT pg_reload_conf();

pg_reload_conf  

----------------

t

(1 row)

2) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄Π²ΡƒΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ user1 ΠΈ 2.

postgres=# CREATE ROLE user1 LOGIN;

CREATE ROLE

postgres=# CREATE ROLE user2 LOGIN;

CREATE ROLE

postgres=# \du

                                      Бписок Ρ€ΠΎΠ»Π΅ΠΉ

    Имя Ρ€ΠΎΠ»ΠΈ    |                                ΠΡ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹                                

----------------+-------------------------------------------------------------------------

 anon_test_user | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

 pma_user       | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ

 postgres       | Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ€ΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π‘Π”, РСпликация, ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ RLS

 replicator     | РСпликация

3) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π΅ΡΡ‚ΡŒ Π»ΠΈ ошибки Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

postgres=# \d pg_ident_file_mappings;

              ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ "pg_catalog.pg_ident_file_mappings"

   Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ†   |   Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

-------------+---------+--------------------+-------------------+--------------

 map_number  | integer |                    |                   |

 file_name   | text    |                    |                   |

 line_number | integer |                    |                   |

 map_name    | text    |                    |                   |

 sys_name    | text    |                    |                   |

 pg_username | text    |                    |                   |

 error       | text    |                    |                   |

postgres=# SELECT * FROM pg_ident_file_mappings;

map_number |                      file_name                      | line_number | map_name

| sys_name | pg_username | error

------------+-----------------------------------------------------+-------------+----------

+----------+-------------+-------

          1 | /var/lib/postgresql/tantor-se-16/data/pg_ident.conf |          74 | map1    

| astra    | user1       |

(1 строка)

postgres=# SELECT rule_number, type, database, user_name, auth_method, address, options, error  FROM  pg_hba_file_rules();

rule_number  | type  |   database    | user_name  | auth_method |  address  | options  | error

-------------+-------+---------------+------------+-------------+-----------+----------+---

           1 | local | {all}         | {all}      | peer        |           | {map=m1} |

           2 | local | {all}         | {pma_user} | md5         |           |          |

           3 | local | {all}         | {all}      | trust       |           |          |

           4 | host  | {all}         | {all}      | trust       | 127.0.0.1 |          |

           5 | host  | {all}         | {all}      | trust       | ::1       |          |

           6 | local | {replication} | {all}      | trust       |           |          |

           7 | host  | {replication} | {all}      | trust       | 127.0.0.1 |          |

           8 | host  | {replication} | {all}      | trust       | ::1       |          |

           9 | host  | {all}         | {all}      | md5         | 0.0.0.0   |          |

(9 строк)

Π§Π°ΡΡ‚ΡŒ 4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° коррСктности настройки

astra@alse-vanilla-gui:~$ psql -U user2 -d postgres 

psql: ошибка: ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру Ρ‡Π΅Ρ€Π΅Π· сокСт "/var/run/postgresql/.s.PGSQL.5432" Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ: Π’ΠΠ–ΠΠž:  ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "user2" Π½Π΅ ΠΏΡ€ΠΎΡˆΡ‘Π» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ подлинности (Peer)

astra@alse-vanilla-gui:~$ psql -U user1 -d postgres  

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=> \q

Π§Π°ΡΡ‚ΡŒ 5. ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

postgres=# DROP ROLE user1, user2;

DROP ROLE

Π£Π΄Π°Π»ΠΈΡ‚ΡŒ строки.
        Π€Π°ΠΉΠ»
pg_hba.conf

        

# TYPE  DATABASE        USER            ADDRESS                 METHOD

local   all             all                                   ident    map=map1

Π€Π°ΠΉΠ» pg_ident.conf

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

map1   astra  user1

postgres=# SELECT pg_reload_conf();

pg_reload_conf  

----------------

t

(1 row)

postgres=# SELECT rule_number, type, database, user_name, auth_method, address, options, error  FROM  pg_hba_file_rules();

rule_number | type  |   database    | user_name  | auth_method |  address  | options | error  

------------+-------+---------------+------------+-------------+-----------+---------+-------

          1 | local | {all}         | {pma_user} | md5         |           |         |  

          2 | local | {all}         | {all}      | trust       |           |         |  

          3 | host  | {all}         | {all}      | trust       | 127.0.0.1 |         |  

          4 | host  | {all}         | {all}      | trust       | ::1       |         |  

          5 | local | {replication} | {all}      | trust       |           |         |  

          6 | host  | {replication} | {all}      | trust       | 127.0.0.1 |         |  

          7 | host  | {replication} | {all}      | trust       | ::1       |         |  

(7 строк)

postgres=# select * from pg_ident_file_mappings;

map_number | file_name | line_number | map_name | sys_name | pg_username | error  

-----------+-----------+-------------+----------+----------+-------------+-------

(0 строк)

Π Π°Π·Π΄Π΅Π» 7. Π Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ЀизичСскоС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ кластСра
  2. Запуск экзСмпляра Π½Π° ΠΊΠΎΠΏΠΈΠΈ кластСра
  3. Π€Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π°
  4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° цСлостности Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ
  5. Богласованная рСзСрвная копия
  6. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»Π°
  7. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π° ΠΆΡƒΡ€Π½Π°Π»Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_receivewal
  8. Бинхронная фиксация Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ pg_receivewal
  9. ΠœΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ кластСра

  1. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_basebackup Π½Π΅ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚, Ссли дирСктория ΠΊΡƒΠ΄Π° дСлаСтся бэкап сущСствуСт ΠΈ ΠΏΡ€ΠΈ этом Π½Π΅ пустая. Π£Π΄Π°Π»ΠΈΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ:

postgres@tantor:~$ rm -rf $HOME/backup

  1. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ хост, Π³Π΄Π΅ располагаСтся Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ кластСр. Если Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Π΅ пространства, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ соотвСтствиС (mapping) ΠΈΡ… дирСкториям. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Π΅ пространства Π² кластСрС:

postgres@tantor:~$ ls -l $PGDATA/pg_tblspc

total 0

lrwxrwxrwx 1 postgres postgres 44 Mar 10 13:41 32913 -> /var/lib/postgresql/tantor-se-16/data/../u01

Π’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π΅ΡΡ‚ΡŒ символичСская ссылка, Π·Π½Π°Ρ‡ΠΈΡ‚ Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство.

Π’Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство создавалось Π² ΠΏ.10 части 1 ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΊ Π³Π»Π°Π²Π΅ 4b ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

CREATE TABLESPACE u01tbs LOCATION '/var/lib/postgresql/tantor-se-16/u01';

Если Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства Π½Π΅Ρ‚, Ρ‚ΠΎ создайтС Π΅Π³ΠΎ этой ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

3) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌ пространствС u01tbs:

postgres=# CREATE TABLE t (id bigserial, t text) TABLESPACE u01tbs;

CREATE TABLE

4) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ бэкап:

postgres@tantor:~$

pg_basebackup -D $HOME/backup/1 -T $PGDATA/../u01=$HOME/backup/1/u01 -P

4472057/4472057 kB (100%), Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство 2/2

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ содСрТимоС Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ:

postgres@tantor:~$ ls --color -w 60 $HOME/backup/1

backup_label     pg_multixact  pg_twophase

backup_manifest  pg_notify     PG_VERSION

base             pg_replslot   pg_wal

global           pg_serial     pg_xact

pg_commit_ts     pg_snapshots  postgresql.auto.conf

pg_dynshmem      pg_stat       postgresql.conf

pg_hba.conf      pg_stat_tmp   u01

pg_ident.conf    pg_subtrans

pg_logical       pg_tblspc

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΊΠ°ΠΊΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ символичСская ссылка Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства:

postgres@tantor:~$ ls -l  $HOME/backup/1/pg_tblspc

total 0

lrwxrwxrwx 1 postgres postgres 32 32913 -> /var/lib/postgresql/backup/1/u01

Всё ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ: Ссли Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ экзСмпляр, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π² качСствС PGDATA Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ бэкапа, Ρ‚ΠΎ дирСктория Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° ΠΈ использована ΠΏΠΎ этому (/var/lib/postgresql/backup/1/u01) ΠΏΡƒΡ‚ΠΈ, Π° Π½Π΅ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ ΠΈΠ· кластСра (/var/lib/postgresql/tantor-se-16/data/../u01) , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ.

Π§Π°ΡΡ‚ΡŒ 2. Запуск экзСмпляра Π½Π° ΠΊΠΎΠΏΠΈΠΈ кластСра

1) Π’ Ρ„Π°ΠΉΠ»Π΅ $HOME/backup/1/postgresql.conf ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ port Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½, это Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 5432. НуТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΡ€Ρ‚ 5432 занят экзСмпляром кластСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ.

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹ΡˆΠ΅ 1023 (Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ… Π½ΠΈΠΆΠ΅ 1024 процСссы Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚ΡŒ). ΠŸΠΎΡ€Ρ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ занят ΠΈ (ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ занят Π½ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ интСрфСйсС).

Π£ΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚ (ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹) ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ процСссу postgres (Π² Ρ‚ΠΎΠΌ числС Ρ‡Π΅Ρ€Π΅Π· ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, pg_ctl); Π² postgresql.auto.conf; Π² postgresql.conf. Π’Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ.

УстановитС Π² основном Ρ„Π°ΠΉΠ»Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π° 5433:

postgres@tantor:~$ echo "port = 5433" >> $HOME/backup/1/postgresql.conf

2) Π”Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° остановку экзСмпляра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚ 5433:

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16-replica/data

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра.... Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

3) ЗапуститС экзСмпляр:

postgres@tantor:~$ pg_ctl start -D $HOME/backup/1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» процСссу сбора ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ²

ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π’ дальнСйшСм ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ "log".

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½

Π’ Π»ΠΎΠ³ кластСра Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ сообщСния:

LOG:  starting PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

LOG:  listening on IPv4 address "0.0.0.0", port 5433

LOG:  listening on IPv6 address "::", port 5433

LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5433"

LOG:  database system was interrupted; last known up at 23:36:29 MSK

LOG:  redo starts at 115/A9000028

LOG:  consistent recovery state reached at 115/A9000178

LOG:  redo done at 115/A9000178 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s

LOG:  checkpoint starting: end-of-recovery immediate wait

LOG:  checkpoint complete: wrote 4 buffers (0.0%); 0 WAL file(s) added, 0 removed, 1 recycled; write=0.003 s, sync=0.001 s, total=0.008 s; sync files=3, longest=0.001 s, average=0.001 s; distance=16384 kB, estimate=16384 kB; lsn=115/AA000028, redo lsn=115/AA000028

4) Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ диагностичСскиС сообщСния Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π½Π° экран, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π° postgresql.conf ΡΡ‚Ρ€ΠΎΠΊΡƒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ.

logging_collector = 'on'

ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ строку Π² Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

echo "logging_collector = off" >> $HOME/backup/1/postgresql.auto.conf

Π Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляр ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сообщСния выводятся:

postgres@tantor:~$ pg_ctl stop -D $HOME/backup/1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра....

Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

postgres@tantor:~$ pg_ctl start -D $HOME/backup/1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

[20912] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

[20912] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv4 "0.0.0.0" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

[20912] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv6 "::" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

[20912] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Unix-сокСт "/var/run/postgresql/.s.PGSQL.5433"

[20915] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π±Ρ‹Π»Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°: MSK

[20912] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½

5) ΠŸΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΊ экзСмпляру:

postgres@tantor:~$ psql -p 5433

Π’Π°ΠΊ ΠΊΠ°ΠΊ экзСмпляр открылся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ (Β«Ρ‡Ρ‚Π΅Π½ΠΈΠ΅-запись», Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния), ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ кластСра.

Π§Π°ΡΡ‚ΡŒ 3. Π€Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π°

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π°:

postgres=# select pg_walfile_name_offset(pg_current_wal_lsn()), pg_current_wal_lsn();

     pg_walfile_name_offset     | pg_current_wal_lsn

--------------------------------+--------------------

 (0000000100000115000000AA,264) | 115/AA000108

(1 строка)

Линия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ измСнилась ΠΈ Ρ€Π°Π²Π½Π° 1. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ запустили экзСмпляр, процСсс startup Π½Π°ΠΊΠ°Ρ‚ΠΈΠ» ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΈ для Π½Π΅Π³ΠΎ это выглядСло ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ запуск экзСмпляра послС Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΉ остановки.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΉ?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ бэкап Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌ кластСрС, Π° Π½Π΅ Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ остановлСнном. Если Π±Ρ‹ ΠΌΡ‹ остановили кластСр, Ρ‚ΠΎ ΠΌΡ‹ Π±Ρ‹ Π½Π΅ смогли Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_basebackup. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_basebackup Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ бэкапы Π½Π° остановлСнном кластСрС.

2) ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΆΡƒΡ€Π½Π°Π» ΠΈ посмотритС Ρ‡Ρ‚ΠΎ измСнится, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ числа:

postgres=# select pg_switch_wal();

 pg_switch_wal

---------------

 115/AA000122

(1 строка)

3) Π§Ρ‚ΠΎ Π²Ρ‹Π΄Π°Π»Π° функция? LSN Π² Ρ‚ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈΡΡŒ плюс ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚. Π’ΠΎ Π΅ΡΡ‚ΡŒ LSN Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ части Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π°.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ» стал Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ:

postgres=# select pg_walfile_name_offset(pg_current_wal_lsn()), pg_current_wal_lsn();

     pg_walfile_name_offset     | pg_current_wal_lsn

--------------------------------+--------------------

 (0000000100000115000000AB,112) | 115/AB000070

(1 строка)

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго символа Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡ‚ΡŒ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π‘ΡƒΠΊΠ²Ρ‹ ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΡƒΡŽ запись.

4) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° нСсколько Ρ€Π°Π·:

postgres=# select pg_switch_wal();

 pg_switch_wal

---------------

 115/AB00008A

(1 строка)

postgres=# select pg_switch_wal();

 pg_switch_wal

---------------

 115/AC000000

(1 строка)

postgres=# select pg_switch_wal();

 pg_switch_wal

---------------

 115/AC000000

(1 строка)

5) ΠŸΠΎΡ‡Π΅ΠΌΡƒ послСдниС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ ΠΆΡƒΡ€Π½Π°Π»? Π­Ρ‚ΠΎ описано Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ (https://docs.tantorlabs.ru/tdb/ru/15_6/se/functions-admin.html):

«Если с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° послСднСго ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ записи Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ активности, pg_switch_wal Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ записи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² настоящСС врСмя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.Β»

6) ΠŸΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ значСния, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ функция pg_walfile_name_offset Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ значСния Π² зависимости ΠΎΡ‚ Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π°:

postgres=# select pg_walfile_name_offset('ABCD/EF00FFFF');

      pg_walfile_name_offset      

----------------------------------

 (000000010000ABCD000000EF,65535)

(1 строка)

ΠœΡ‹ посмотрСли ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ Π²ΠΈΠ΄Ρƒ LSN (синий Ρ†Π²Π΅Ρ‚ значСния EF) ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΆΡƒΡ€Π½Π°Π»Π° находится этот LSN Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

7) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ экзСмпляр ΠΊΠ»ΠΎΠ½Π°:

postgres@tantor:~$ pg_ctl stop -D $HOME/backup/1

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сообщСний Π½Π° английском языкС:

LOG:  received fast shutdown request

LOG:  aborting any active transactions

LOG:  background worker "logical replication launcher" (PID 31666) exited with exit code 1

waiting for server to shut down....

LOG:  shutting down

LOG:  checkpoint starting: shutdown immediate

LOG:  checkpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.005 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=44236 kB; lsn=115/AE000198, redo lsn=115/AE000198

LOG:  database system is shut down

 done

server stopped

МоТно ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с сообщСниями Π½Π° русском языкС.

Π”Π°Π»Π΅Π΅ Π² этой ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ сообщСний ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Π½Π° английском языкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с сообщСниями Π½Π° русском языкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π² консоли.

Π§Π°ΡΡ‚ΡŒ 4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° цСлостности Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ

1) pg_basebackup ΡΠΎΠ·Π΄Π°Π»Π° Ρ„Π°ΠΉΠ» backup_manifest, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π΅ помСнялись Π»ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ Π² бэкапС Π·Π° врСмя ΠΈΡ… хранСния. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ копию Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΆΠ΅ запускали экзСмпляр:

postgres@tantor:~$ pg_verifybackup $HOME/backup/1

pg_verifybackup: error: "pg_stat/pg_stat_statements.stat" is present on disk but not in the manifest

pg_verifybackup: error: "pg_stat/pgstat.stat" is present on disk but not in the manifest

pg_verifybackup: error: "postmaster.opts" is present on disk but not in the manifest

pg_verifybackup: error: "base/5/pg_internal.init" is present on disk but not in the manifest

pg_verifybackup: error: "global/pg_internal.init" is present on disk but not in the manifest

pg_verifybackup: error: "global/pg_store_plans.stat" is present on disk but not in the manifest

pg_verifybackup: error: "postgresql.conf" has size 30440 on disk but size 30428 in the manifest

pg_verifybackup: error: "backup_label.old" is present on disk but not in the manifest

pg_verifybackup: error: "pg_subtrans/000000000001" is present on disk but not in the manifest

pg_verifybackup: error: "u01/PG_16_202307071/5/382539" is present on disk but not in the manifest

pg_verifybackup: error: "u01/PG_16_202307071/5/382539.1" is present on disk but not in the manifest

pg_verifybackup: error: "u01/PG_16_202307071/5/382541" is present on disk but not in the manifest

pg_verifybackup: error: "u01/PG_16_202307071/5/382540" is present on disk but not in the manifest

pg_verifybackup: error: "u01/PG_16_202307071/5/382539_vm" is present on disk but not in the manifest

pg_verifybackup: error: "u01/PG_16_202307071/5/382539_fsm" is present on disk but not in the manifest

pg_verifybackup: error: "backup_label" is present in the manifest but not on disk

pg_waldump: error: could not find file "0000000100000115000000A9": No such file or directory

pg_verifybackup: error: WAL parsing failed for timeline 1

БообщСния ΠΎ Ρ„Π°ΠΉΠ»Π°Ρ… .stat internal.init pg_subtrans/* ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹, Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² бэкап. postgresql.conf ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°. Π€Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° A9 ΠΈΡΡ‡Π΅Π· ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅ понадобился ΠΊΠ»ΠΎΠ½Ρƒ для Π΅Π³ΠΎ восстановлСния ΠΈ Π½Π΅ удСрТивался ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ min_wal_size. Π€Π°ΠΉΠ» backup_label Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π² backup_label.old

Π€Π°ΠΉΠ» backup_label Π²Π°ΠΆΠ΅Π½, Ссли ΠΎΠ½ присутствуСт, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ значСния ΠΈΠ· Π½Π΅Π³ΠΎ для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΊΠ°ΠΊΠΎΠ³ΠΎ LSN Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Π½Π°ΠΊΠ°Ρ‚ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², Π° Π½Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· pg_control. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ pg_control Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ экзСмпляром, ΠΎΠ½ присутствуСт Π² Ρ„Π°ΠΉΠ»Π΅ манифСста, Ссли Π΅Π³ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π½ΠΎ сообщСниС, Π½ΠΎ pg_control Π½Π΅ Π±Ρ‹Π» Π²Ρ‹Π΄Π°Π½ Π² спискС ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Ρ….

2) ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ записи ΠΎΠ±ΠΎ всСх Ρ„Π°ΠΉΠ»Π°Ρ… Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства?

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы этих Ρ„Π°ΠΉΠ»ΠΎΠ² Π΅ΡΡ‚ΡŒ Π² backup_manifest. Π€Π°ΠΉΠ»Ρ‹ Π½Π΅ мСнялись ΠΈ Π±Ρ‹Π»ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Ρ‹:

postgres@tantor:~$ cat $HOME/backup/1/backup_manifest | grep pg_tblspc

{ "Path": "pg_tblspc/32913/PG_16_202307071/5/382539", "Size": 1073741824, "Last-Modified": "11:16:27 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "b5d86155" },

{ "Path": "pg_tblspc/32913/PG_16_202307071/5/382539.1", "Size": 18530304, "Last-Modified": "11:16:27 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "77531a0d" },

{ "Path": "pg_tblspc/32913/PG_16_202307071/5/382541", "Size": 8192, "Last-Modified": "11:16:27 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "381590e3" },

{ "Path": "pg_tblspc/32913/PG_16_202307071/5/382540", "Size": 0, "Last-Modified": "11:16:27 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "00000000" },

{ "Path": "pg_tblspc/32913/PG_16_202307071/5/382539_vm", "Size": 40960, "Last-Modified": "11:16:27 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "53622029" },

{ "Path": "pg_tblspc/32913/PG_16_202307071/5/382539_fsm", "Size": 286720, "Last-Modified": "11:16:27 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "b594827d" },

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΎΠ± ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… появились ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства помСстили Π² ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ PGDATA/u01. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… пространств стоит Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ Π²Π½Π΅ PGDATA.

3) Π£Π΄Π°Π»ΠΈΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠ»ΠΎΠ½Π°:

postgres@tantor:~$ rm -rf $HOME/backup

Π§Π°ΡΡ‚ΡŒ 5. Богласованная рСзСрвная копия

1) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ снова бэкап ΠΈ располоТим Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства u01 Π²Π½Π΅ основной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ:

pg_basebackup -D $HOME/backup/1 -T $PGDATA/../u01=$HOME/backup/u01 -P

4472018/4472018 kB (100%), 2/2 tablespaces

2) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» standby.signal. Π•ΡΠ»ΠΈ этот Ρ„Π°ΠΉΠ» присутствуСт (содСрТимоС Ρ„Π°ΠΉΠ»Π° Π½Π΅ Π²Π°ΠΆΠ½ΠΎ), Ρ‡Ρ‚ΠΎ экзСмпляр видя Π΅Π³ΠΎ Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ кластСр Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅-запись (ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Β«Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈΒ»):

postgres@tantor:~$ touch $HOME/backup/1/standby.signal

Установим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ диагностичСскиС сообщСния Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² консоль:

postgres@tantor:~$ echo "logging_collector = off" >> $HOME/backup/1/postgresql.auto.conf

3) Запустим экзСмпляр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Β«ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡƒΡŽΒ» копию. Π’Π°ΠΊ ΠΊΠ°ΠΊ бэкап Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ, Ρ‚ΠΎ ΠΎΠ½ содСрТит Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², Π½ΡƒΠΆΠ½Ρ‹Π΅ для согласования Ρ„Π°ΠΉΠ»ΠΎΠ² бэкапа.

МоТно Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ экзСмпляр ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

pg_ctl start -D $HOME/backup/1 -o "--port=5433 --recovery_target=immediate --recovery_target_action=shutdown"

Π’Π°ΠΊ ΠΊΠ°ΠΊ послС запуска экзСмпляра ΠΎΠ½ достигнув согласованности Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ³Π°ΡΠ½ΡƒΡ‚ΡŒ (recovery_target_action=shutdown) Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ основной процСсс экзСмпляра. Если Π±Ρ‹ экзСмпляр сам Π½Π΅ останавливался, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ pg_ctl, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ сигнал ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ процСссу postgres, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ. Запустим экзСмпляр:

postgres@tantor:~$ postgres -D $HOME/backup/1 --port=5433 --recovery_target=immediate --recovery_target_action=shutdown

LOG:  starting PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

LOG:  listening on IPv4 address "0.0.0.0", port 5433

LOG:  listening on IPv6 address "::", port 5433

LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5433"

LOG:  database system was interrupted; last known up at

WARNING:  specified neither primary_conninfo nor restore_command

HINT:  The database server will regularly poll the pg_wal subdirectory to check for files placed there.

LOG:  entering standby mode

LOG:  redo starts at 115/BB000028

LOG:  consistent recovery state reached at 115/BB000178

LOG:  database system is ready to accept read-only connections

LOG:  recovery stopping after reaching consistency

LOG:  shutdown at recovery target

LOG:  shutting down

LOG:  database system is shut down

4) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ бэкап:

postgres@tantor:~$ pg_verifybackup $HOME/backup/1

pg_verifybackup: error: "pg_stat/pg_stat_statements.stat" is present on disk but not in the manifest

pg_verifybackup: error: "pg_stat/pgstat.stat" is present on disk but not in the manifest

pg_verifybackup: error: "postmaster.opts" is present on disk but not in the manifest

pg_verifybackup: error: "global/pg_store_plans.stat" is present on disk but not in the manifest

pg_verifybackup: error: "backup_label.old" is present on disk but not in the manifest

pg_verifybackup: error: "backup_label" is present in the manifest but not on disk

ΠŸΡ€ΠΈ этой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ошибок связанных с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ u01 Π½Π΅Ρ‚. Π€Π°ΠΉΠ» backup_label Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½, Π° это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании этого бэкапа восстановлСниС начнСтся с LSN, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ»Π΅ pg_control.

5) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ LSN-записи Π² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅:

postgres@tantor:~$ pg_controldata -D $HOME/backup/1

Database cluster state:               shut down in recovery

Latest checkpoint location:           115/BB000070

Latest checkpoint's REDO location:    115/BB000028

Latest checkpoint's REDO WAL file:    0000000100000115000000BB

Latest checkpoint's TimeLineID:       1

Latest checkpoint's PrevTimeLineID:   1

Latest checkpoint's full_page_writes: on

Latest checkpoint's NextXID:          35739

Latest checkpoint's NextOID:          399126

Latest checkpoint's NextMultiXactId:  502936

Latest checkpoint's NextMultiOffset:  2034077

Latest checkpoint's oldestXID:        723

Latest checkpoint's oldestXID's DB:   1

Latest checkpoint's oldestActiveXID:  35739

Latest checkpoint's oldestMultiXid:   1

Latest checkpoint's oldestMulti's DB: 1

Latest checkpoint's oldestCommitTsXid:0

Latest checkpoint's newestCommitTsXid:0

...

Fake LSN counter for unlogged rels:   0/3E8

Minimum recovery ending location:     115/BB000178

Min recovery ending loc's timeline:   1

Backup start location:                0/0

Backup end location:                  0/0

End-of-backup record required:        no

wal_level setting:                    replica

Если ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» 0000000100000115000000BB Ρ‚ΠΎ экзСмпляр Π½Π΅ запустится.

Π‘ этого бэкапа нСльзя (Π½ΠΈ Π΄ΠΎ согласования Π½ΠΈ послС) Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π½ΡŒΡˆΠ΅ "Minimum recovery ending location"

Π§Π°ΡΡ‚ΡŒ 6. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»Π°

1) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» standby.signal

postgres@tantor:~$ rm $HOME/backup/1/standby.signal

2) ЗапуститС экзСмпляр:

postgres@tantor:~$ pg_ctl start -D $HOME/backup/1 -o "--port=5433"

LOG:  database system was not properly shut down; automatic recovery in progress

LOG:  redo starts at 115/BB000028

LOG:  redo done at 115/BB000178 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s

LOG:  checkpoint starting: end-of-recovery immediate wait

LOG:  checkpoint complete: wrote 4 buffers (0.0%); 0 WAL file(s) added, 0 removed, 1 recycled; write=0.003 s, sync=0.001 s, total=0.008 s; sync files=3, longest=0.001 s, average=0.001 s; distance=16384 kB, estimate=16384 kB; lsn=115/BC000028, redo lsn=115/BC000028

LOG:  database system is ready to accept connections

 done

server started

3) ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ остановитС экзСмпляр:

postgres@tantor:~$ pg_ctl stop -D $HOME/backup/1

LOG:  received fast shutdown request

waiting for server to shut down....

LOG:  aborting any active transactions

LOG:  background worker "logical replication launcher" (PID 4137) exited with exit code 1

LOG:  shutting down

LOG:  checkpoint starting: shutdown immediate

LOG:  checkpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.007 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=14745 kB; lsn=115/BC000108, redo lsn=115/BC000108

LOG:  database system is shut down

 done

server stopped

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ помСнялось Π² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅ послС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ остановки ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ запуска Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres@tantor:~$ pg_controldata -D $HOME/backup/1

Database cluster state:               shut down

pg_control last modified:             03:58:27 AM MSK

Latest checkpoint location:           115/BC000108

Latest checkpoint's REDO location:    115/BC000108

Latest checkpoint's REDO WAL file:    0000000100000115000000BC

Latest checkpoint's TimeLineID:       1

Latest checkpoint's PrevTimeLineID:   1

Latest checkpoint's full_page_writes: on

Latest checkpoint's NextXID:          35739

Latest checkpoint's NextOID:          399126

Latest checkpoint's NextMultiXactId:  502936

Latest checkpoint's NextMultiOffset:  2034077

Latest checkpoint's oldestXID:        723

Latest checkpoint's oldestXID's DB:   1

Latest checkpoint's oldestActiveXID:  0

Latest checkpoint's oldestMultiXid:   1

Latest checkpoint's oldestMulti's DB: 1

Latest checkpoint's oldestCommitTsXid:0

Latest checkpoint's newestCommitTsXid:0

Time of latest checkpoint:            03:58:27 AM MSK

Fake LSN counter for unlogged rels:   0/3E8

Minimum recovery ending location:     0/0

Min recovery ending loc's timeline:   0

Backup start location:                0/0

Backup end location:                  0/0

End-of-backup record required:        no

5) Π£Π΄Π°Π»ΠΈΡ‚Π΅ всС Ρ„Π°ΠΉΠ»Ρ‹ (0000000100000115000000BC) ΠΆΡƒΡ€Π½Π°Π»Π°:

postgres@tantor:~$ rm -r $HOME/backup/1/pg_wal/*

6) ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ экзСмпляр:

postgres@tantor:~$ pg_ctl start -D $HOME/backup/1 -o "--port=5433"

waiting for server to start.......

LOG:  database system was shut down at 03:58:27 MSK

LOG:  creating missing WAL directory "pg_wal/archive_status"

LOG:  invalid checkpoint record

PANIC:  could not locate a valid checkpoint record

LOG:  startup process (PID 4151) was terminated by signal 6: Aborted

LOG:  aborting startup due to startup process failure

LOG:  database system is shut down

 stopped waiting

pg_ctl: could not start server

Examine the log output.

Π‘Π΅Π· Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° Latest checkpoint's REDO WAL file 0000000100000115000000BC ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ€ Π½Π΅ запустился.

Π’Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ pg_wal Π½Π΅Π»ΡŒΠ·Ρ.

Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² (Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ сСгомСнт ΠΆΡƒΡ€Π½Π°Π»Π°) понадобится ΠΏΡ€ΠΈ запускС экзСмпляра.

7) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ бэкапа:

postgres@tantor:~$ rm -rf $HOME/backup

Π§Π°ΡΡ‚ΡŒ 7. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π° ΠΆΡƒΡ€Π½Π°Π»Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_receivewal

1) ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ postgres.

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ для Π°Ρ€Ρ…ΠΈΠ²Π° ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ²:

postgres@tantor:~$ mkdir $HOME/archivelog

2) ЗапуститС pg_receivewal:

postgres@tantor:~$ pg_receivewal -D $HOME/archivelog --slot=arch --synchronous -v

pg_receivewal: error: replication slot "arch" does not exist

pg_receivewal: disconnected; waiting 5 seconds to try again

pg_receivewal: error: replication slot "arch" does not exist

pg_receivewal: disconnected; waiting 5 seconds to try again

Π‘ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ сообщСния Ρ‡Ρ‚ΠΎ слота Π½Π΅Ρ‚. Π”Π°Π»ΡŒΡˆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ сообщСния, ΠΊΠΎΠ³Π΄Π° создадим слот.

3) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ бэкап с созданиСм ΠΈ использованиСм слота:

pg_basebackup -D $HOME/backup/1 -T $PGDATA/../u01=$HOME/backup/u01 -P -C --slot=arch

4472018/4472018 kB (100%), 2/2 tablespaces

4) Пока бэкап дСлаСтся, Π² ΠΎΠΊΠ½Π΅ с Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_receivewal Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ошибки ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ слот ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ:

pg_receivewal: starting log streaming at 115/BD000000 (timeline 1)

pg_receivewal: error: could not send replication command "START_REPLICATION": ERROR:  replication slot "arch" is active for PID 5013

pg_receivewal: disconnected; waiting 5 seconds to try again

Один слот ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° рСпликационная сСссия.

ΠœΡ‹ запустили pg_receivewal Π·Π°Ρ€Π°Π½Π΅Π΅, Π½ΠΎ стоило Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈ послС рСзСрвирования, пропуска ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ. Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ pg_basebackup ΠΎΡ‚соСдинился ΠΎΡ‚ экзСмпляра, Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… 5 сСкунд подсоСдинился pg_receivewal:

pg_receivewal: starting log streaming at 115/BD000000 (timeline 1)

pg_receivewal: finished segment at 115/BE000000 (timeline 1)

pg_receivewal ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» BD.

5) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ с ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° начнСтся восстановлСниС:

postgres@tantor:~$ cat $HOME/backup/1/backup_label

START WAL LOCATION: 115/BD000028 (file 0000000100000115000000BD)

CHECKPOINT LOCATION: 115/BD000070

BACKUP METHOD: streamed

BACKUP FROM: primary

START TIME: 07:48:25 MSK

LABEL: pg_basebackup base backup

START TIMELINE: 1

ВосстановлСниС начнСтся с ΠΆΡƒΡ€Π½Π°Π»Π° BD.

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ» Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ:

postgres@tantor:~$ psql

postgres=# select pg_walfile_name_offset(pg_current_wal_lsn()), pg_current_wal_lsn();

     pg_walfile_name_offset     | pg_current_wal_lsn

--------------------------------+--------------------

 (0000000100000115000000BE,112) | 115/BE000070

(1 строка)

Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» BE.

7) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ pg_receivewal:

postgres@tantor:~$ ls -al $HOME/archivelog

total 32776

drwxr-xr-x  2 postgres postgres     4096 07:48 .

drwxr-xr-x 10 postgres postgres     4096 08:04 ..

-rw-r-----  1 postgres postgres 16777216 07:48 0000000100000115000000BD

-rw-r-----  1 postgres postgres 16777216 07:48 0000000100000115000000BE.partial

Он Π² настоящСС врСмя ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚ Π² Ρ„Π°ΠΉΠ» BE. Π£ Ρ„Π°ΠΉΠ»Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .partial Π—Π°ΠΏΠΈΡΡŒ ΠΈΠ΄Ρ‘Ρ‚ синхронно (ΠΏΠΎΠ±Π»ΠΎΡ‡Π½ΠΎ: wal_block_size=8Кб), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --synchronous

8) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» .partial ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΆΡƒΡ€Π½Π°Π» кластСра ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹:

postgres@tantor:~$ diff $HOME/archivelog/0000000100000115000000BE.partial $PGDATA/pg_wal/0000000100000115000000BE

Π Π°Π·Π½ΠΈΡ†Ρ‹ Π½Π΅Ρ‚, Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹

9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ статус слота Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

postgres=# select * from pg_replication_slots \gx

-[ RECORD 1 ]-------+-------------

slot_name           | arch

plugin              |

slot_type           | physical

datoid              |

database            |

temporary           | f

active              | t

active_pid          | 5018

xmin                |

catalog_xmin        |

restart_lsn         | 115/BE000198

confirmed_flush_lsn |

wal_status          | reserved

safe_wal_size       | 150994536

two_phase           | f

conflicting         |

postgres=# select * from pg_stat_replication \gx

-[ RECORD 1 ]----+----------------------------

pid              | 5018

usesysid         | 10

usename          | postgres

application_name | pg_receivewal

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 07:48:43.452192+03

backend_xmin     |

state            | streaming

sent_lsn         | 115/BE000198

write_lsn        | 115/BE000198

flush_lsn        | 115/BE000198

replay_lsn       |

write_lag        | 00:00:00.001285

flush_lag        | 00:00:00.001285

replay_lag       | 00:27:34.008699

sync_priority    | 0

sync_state       | async

reply_time       | 08:16:17.463519+03

Π§Π°ΡΡ‚ΡŒ 8. Бинхронная фиксация Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ pg_receivewal

1) Π£ΠΊΠ°ΠΆΠ΅ΠΌ имя прилоТСния Π² спискС Ρ‚Π΅Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² синхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅:

postgres=# alter system set synchronous_standby_names = pg_receivewal;

ALTER SYSTEM

postgres=# select pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 строка)

2) ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ статус стал sync:

postgres=# select * from pg_stat_replication \gx

-[ RECORD 1 ]----+------------------------------

pid              | 5169

usesysid         | 10

usename          | postgres

application_name | pg_receivewal

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 08:30:00.356885+03

backend_xmin     |

state            | streaming

sent_lsn         | 115/BE000F70

write_lsn        | 115/BE000F70

flush_lsn        | 115/BE000F70

replay_lsn       |

write_lag        | 00:00:00.003395

flush_lag        | 00:00:00.003395

replay_lag       | 00:01:32.059937

sync_priority    | 1

sync_state       | sync

reply_time       | 08:31:32.419514+03

3) Если Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° со статусом sync, synchronous_standby_names Π½Π΅ пуст, synchronous_commit Π½Π΅ установлСн Π² local ΠΈΠ»ΠΈ off, Ρ‚ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Π²ΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΈ <сtrl+c> Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ошибки Π²ΠΈΠ΄Π°:

postgres=# insert into t (t) values ('aaa');

^CCancel request sent

WARNING:  canceling wait for synchronous replication due to user request

DETAIL:  The transaction has already committed locally, but might not have been replicated to the standby.

INSERT 0 1

Π’ΠΈΡΠ΅Ρ‚ΡŒ сСссии Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΊΠ° Π½Π΅ появится ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Ссли администратор Π½Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ€Π΅ΠΆΠΈΠΌ.

4) Π£Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ€Π΅ΠΆΠΈΠΌ:

postgres=# alter system RESET synchronous_standby_names;

ALTER SYSTEM

postgres=# select pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 строка)

Π§Π°ΡΡ‚ΡŒ 9. ΠœΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ синхронной фиксации.

Если позволяСт Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ pg_wal, скопируСм Π°Ρ€Ρ…ΠΈΠ²Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ понадобятся для восстановлСния Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ pg_wal. Π€Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π° с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ начнСтся Π½Π°ΠΊΠ°Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ Π² backup_label ΠΈΠ»ΠΈ Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚ (ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π² backup_label.old), Ρ‚ΠΎ Π² pg_control (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просматриваСтся pg_controldata). Если Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π½Π΅ позволяСт ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΊΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы Π½Π΅ хочСтся, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ rectore_command, Π½ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΈΠ· Π°Ρ€Ρ…ΠΈΠ²Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π² pg_wal Π½Π° Ρ‡Ρ‚ΠΎ тратится врСмя ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ врСмя восстановлСния.

Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ‡Ρ‚ΠΎ основной кластСр Ρƒ нас сбойнул ΠΈ исчСз. Благодаря синхронному Ρ€Π΅ΠΆΠΈΠΌΡƒ pg_receivewal ΠΏΡ€ΠΈΠ½ΡΠ» всС Π±Π»ΠΎΠΊΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΆΡƒΡ€Π½Π°Π»Π°. Если ΠΎΠ½ использовался для подтвСрТдСния Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎ ΠΏΠΎ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΌ записям (ΠΎ фиксации Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΈ Π½Π΅ успСл ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ²ΡˆΠΈΠ΅ эти Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ подтвСрТдСния ΠΎ фиксации, Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ сообщСниС ΠΎ Ρ€Π°Π·Ρ€Ρ‹Π²Π΅ соСдинСния (кластСр сбойнул ΠΈ исчСз).

НС Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° созданиС сСссий, Π²Ρ‹Π΄Π°Ρ‡Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄, отслСТиваниС LSN, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° основном.

1) Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ содСрТимоС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ:

postgres@tantor:~$ cp $HOME/archivelog/* $HOME/backup/1/pg_wal

2) ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» .partial ΡƒΠ±Ρ€Π°Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅:

postgres@tantor:~$ mv $HOME/backup/1/pg_wal/0000000100000115000000BE.partial $HOME/backup/1/pg_wal/0000000100000115000000BE

3) Запустим Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ кластСр:

postgres@tantor:~$ pg_ctl start -D $HOME/backup/1 -o "--port=5433"

LOG:  consistent recovery state reached at 115/BD000178

LOG:  invalid record length at 115/BE000F70: expected at least 26, got 0

LOG:  database system is ready to accept connections

Ρ‡Ρ‚ΠΎ соотвСтствуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ sent_lsn = 115/BE000F70 ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² pg_stat_replication.

4) Как ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ pg_receivewal? Если Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ Π² Ρ„ΠΎΠ½, ΠΊΠ°ΠΊ Π² нашСм случаС, Ρ‚ΠΎ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Π² Π΅Π³ΠΎ ΠΎΠΊΠ½Π΅ Ctrl+c. Если ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ Π² Ρ„ΠΎΠ½, Ρ‚ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½ΠΎΠΌΠ΅Ρ€ процСсса ΠΈ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ сигнал SIGINT. Π­Ρ‚ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ pg_receivewal. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

postgres@tantor$ kill -s SIGINT 5169

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° сообщит Π² stdout:

pg_receivewal: not renaming "0000000100000115000000BE.partial", segment is not complete

5) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ запасной кластСр:

postgres@tantor:~$ pg_ctl stop -D $HOME/backup/1


ЛогичСскоС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

  1. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_dump
  2. Π€ΠΎΡ€ΠΌΠ°Ρ‚ custom ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° pg_restore
  3. Π€ΠΎΡ€ΠΌΠ°Ρ‚ directory
  4. Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ рСзСрвирования
  5. Команда COPY 

Π§Π°ΡΡ‚ΡŒ 1. ИспользованиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_dump        

1) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres@tantor:~$ pg_dump --schema-only

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --schema-only ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ опрСдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² («схСмы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²Β»), Π±Π΅Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ pg_dump Π½Π΅ использовали, Π·Π½Π°Ρ‡ΠΈΡ‚ использовались ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

подсоСдинСниС ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ подсоСдинился Π±Ρ‹ psql;

Π²Ρ‹Π²ΠΎΠ΄ Π² sdout - Π½Π° экран Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°;

Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π°ΠΌΠΏΠ° plain - тСкстовый скрипт.

2) НаТимая Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Shift+PgUp> ΠΏΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ выглядит содСрТимоС Β«Π΄Π°ΠΌΠΏΠ°Β». Π€ΠΎΡ€ΠΌΠ°Ρ‚ называСтся plain. Β«Π”Π°ΠΌΠΏΒ» содСрТит ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SET, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сСссии, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Π±Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· Π΄Π°ΠΌΠΏΠ°:

SET statement_timeout = 0;

SET lock_timeout = 0;

SET idle_in_transaction_session_timeout = 0;

SET transaction_timeout = 0;

SET client_encoding = 'UTF8';

SET standard_conforming_strings = on;

SELECT pg_catalog.set_config('search_path', '', false);

SET check_function_bodies = false;

SET xmloption = content;

SET client_min_messages = warning;

SET row_security = off;

        ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ большиС ΠΎΠ±ΡŠΠ΅ΠΌΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡΡΡŒ с ограничСниями.

        ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ row_security ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ошибки Π² случаС, Ссли сработаСт ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° row level security ("RLS"). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ pg_dump ΠΎΡ‚каТСтся Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Ссли Ρƒ Ρ€ΠΎΠ»ΠΈ Π½Π΅Ρ‚ ΠΏΡ€Π°Π² ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ эти ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ. ΠŸΡ€Π°Π²ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π΄Π°Ρ‘Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Ρ€ΠΎΠ»ΠΈ BYPASSRLS ΠΈ SUPERUSER. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС строки Π²Ρ‹Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π±Π΅Π· ошибок.

        ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ check_function_bodies ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚Π΅Π»Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½ΡƒΠΆΠ½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π²ΠΈΠ΄Π΅Π»ΠΈ ошибки ΠΏΡ€ΠΈ создании. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ порядкС Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ порядкС создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π­Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ: ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎ создания Ρ‚Π°Π±Π»ΠΈΡ†, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависят ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

        3) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ dump ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² этой Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…:

postgres=# CREATE DATABASE dump;

CREATE DATABASE

postgres=# \c dump

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "dump" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres".

dump=# CREATE TABLE t (id bigserial, t text, b bytea);

CREATE TABLE

dump=# INSERT INTO t(t) values ('Π°Π±Π²Π³'), (NULL), ('');

INSERT 0 3

        3) Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС (Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈΠ»ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· psql) создайтС Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… dump1 ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Π² Π½Π΅Ρ‘ содСрТимоС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… dump:

dump=# \q

postgres@tantor:~$ createdb dump1;

postgres@tantor:~$ pg_dump -d dump | psql -d dump1

...

 set_config

------------

 

(1 row)

...

CREATE TABLE

ALTER TABLE

CREATE SEQUENCE

ALTER SEQUENCE

ALTER SEQUENCE

ALTER TABLE

COPY 3

 setval

--------

      3

(1 строка)

Π’ процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ psql Π²Ρ‹Π΄Π°Ρ‘Ρ‚ сообщСния Π½Π° экран Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_dump ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»Π°ΡΡŒ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… dump ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΉΠΏ ("|") ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ psql, которая ΠΈΡ… Ρ‚ΡƒΡ‚ ΠΆΠ΅ выполняла, подсоСдинившСсь ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… dump1.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° использования ΠΏΠ°ΠΉΠΏΠ° (Β«ΠΊΠΎΠ½Π²Π΅Π΅Ρ€Β»):

Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ мСсто для Ρ„Π°ΠΉΠ»Π° Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π»ΠΈΡΡŒ Π±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅;

ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ врСмя, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ процСссы Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ (pg_dump) ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (psql).

Π§Π°ΡΡ‚ΡŒ 2. Π€ΠΎΡ€ΠΌΠ°Ρ‚ custom ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° pg_restore

1) ЗапуститС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π±Π°Π·Ρ‹ dump1 Π² Π±Π°Π·Ρƒ dump Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ custom ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… созданиСм:

postgres@tantor:~$

pg_dump -d dump1 --format=custom | pg_restore -d dump --clean --if-exists

Ошибок Π½Π΅Ρ‚. Π€ΠΎΡ€ΠΌΠ°Ρ‚ custom Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π½Π΅ psql, Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° pg_restore.

2) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --verbose Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π²Ρ‹Π΄Π°Ρ‘Ρ‚:

postgres@tantor:~$

pg_dump -d dump1 --format=custom | pg_restore -d dump --clean --if-exists -v

pg_restore: ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… для восстановлСния

pg_restore: удаляСтся DEFAULT t id

pg_restore: удаляСтся SEQUENCE t_id_seq

pg_restore: удаляСтся TABLE t

pg_restore: создаётся TABLE "public.t"

pg_restore: создаётся SEQUENCE "public.t_id_seq"

pg_restore: создаётся SEQUENCE OWNED BY "public.t_id_seq"

pg_restore: создаётся DEFAULT "public.t id"

pg_restore: ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "public.t"

pg_restore: выполняСтся SEQUENCE SET t_id_seq

3) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ содСрТимоС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ t ΡΠΎΠΎΡ‚вСтствуСт исходному:

postgres@tantor:~$ psql -d dump -c "select * from t"

 id |  t   | b

----+------+---

  4 | Π°Π±Π²Π³ |

  5 |      |

  6 |      |

(3 строки)

4) ЗапуститС Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_restore c ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ --list:

postgres@tantor:~$ pg_dump -d dump1 --format=custom | pg_restore -l

;

; Archive created at ..

;     dbname: dump1

;     TOC Entries: 10

;     Compression: gzip

;     Dump Version: 1.15-0

;     Format: CUSTOM

;     Integer: 4 bytes

;     Offset: 8 bytes

;     Dumped from database version: 16.1

;     Dumped by pg_dump version: 16.1

;

;

; Selected TOC Entries:

;

216; 1259 448357 TABLE public t postgres

217; 1259 448362 SEQUENCE public t_id_seq postgres

3288; 0 0 SEQUENCE OWNED BY public t_id_seq postgres

3135; 2604 448363 DEFAULT public t id postgres

3280; 0 448357 TABLE DATA public t postgres

3289; 0 0 SEQUENCE SET public t_id_seq postgres

        

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_restore Π²Ρ‹Π΄Π°Π»Π° содСрТимоС (TOC, title of contents) Π΄Π°ΠΌΠΏΠ°.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -l Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π΄Π°ΠΌΠΏΠ°ΠΌΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ custom ΠΈΠ»ΠΈ directory. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ выглядит список. По ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° строка. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -L ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_restore Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

5) Π£ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ зависимости ΠΎΡ‚ наличия Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Зависимости выводятся Π² спискС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΏΡ€ΠΈ запускС pg_restore Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΠΎΡ€ΠΌ -v. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ:

postgres@tantor:~$ pg_dump -d dump1 --format=custom | pg_restore -l -v

;

; Archive created at 2024-03-23 08:36:49 MSK

;     dbname: dump1

;     TOC Entries: 10

;     Compression: gzip

;     Dump Version: 1.15-0

;     Format: CUSTOM

;     Integer: 4 bytes

;     Offset: 8 bytes

;     Dumped from database version: 16.1

;     Dumped by pg_dump version: 16.1

;

;

; Selected TOC Entries:

;

3284; 0 0 ENCODING - ENCODING

3285; 0 0 STDSTRINGS - STDSTRINGS

3286; 0 0 SEARCHPATH - SEARCHPATH

3287; 1262 448356 DATABASE - dump1 postgres

216; 1259 448357 TABLE public t postgres

217; 1259 448362 SEQUENCE public t_id_seq postgres

;       depends on: 216

3288; 0 0 SEQUENCE OWNED BY public t_id_seq postgres

;       depends on: 217

3135; 2604 448363 DEFAULT public t id postgres

;       depends on: 217 216

3280; 0 448357 TABLE DATA public t postgres

;       depends on: 216

3289; 0 0 SEQUENCE SET public t_id_seq postgres

;       depends on: 217

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ с ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ зависимостСй Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.

6) Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ pg_restore ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ -d ΠΈΠ»ΠΈ -l , Π° ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ -f, Ρ‚ΠΎ ΠΈΠ· Π΄Π°ΠΌΠΏΠ° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ custom, directory, tar ΡΠΎΠ·Π΄Π°Ρ‘тся скрипт с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ SQL. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ скрипт:

postgres@tantor:~$

pg_dump -d dump1 --format=custom | pg_restore -f script.sql

7) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ скрипт Π΄Π°ΠΌΠΏΠ° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ plain:

postgres@tantor:~$ pg_dump -d dump1 -f script1.sql

8) Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Π΄Π²Π° скрипта:

postgres@tantor:~$ diff script.sql script1.sql

Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_restore ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π΄Π°ΠΌΠΏΠ° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° plain ΠΈΠ· Π΄Π°ΠΌΠΏΠΎΠ² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² custom, directory, tar.

Π§Π°ΡΡ‚ΡŒ 3. Π€ΠΎΡ€ΠΌΠ°Ρ‚ directory

1) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΄Π°ΠΌΠΏ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ directory:

postgres@tantor:~$ pg_dump -d dump1 --format=directory -f ./1

postgres@tantor:~$ ls ./1

3280.dat.gz  toc.dat

2) ДирСктория создаётся автоматичСски. Π’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π»Π΅ΠΆΠΈΡ‚ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄Π°ΠΌΠΏΠ° ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сТатиС:

3) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΈ создайтС Π΄Π°ΠΌΠΏ Π±Π΅Π· сТатия:

postgres@tantor:~$ rm -rf ./1

postgres@tantor:~$ pg_dump -d dump1 --format=directory -Z0 -f ./1

postgres@tantor:~$ ls ./1

3280.dat  toc.dat

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ содСрТимоС любого Ρ„Π°ΠΉΠ»Π° .dat:

postgres@tantor:~$ cat ./1/3280.dat 

4       Π°Π±Π²Π³    \N

5       \N      \N

6               \N

\.

Π€Π°ΠΉΠ» .dat ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ COPY Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. \N - пустыС (NULL) значСния. \. - символы Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ COPY.

5) МоТно Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½Ρ‹Π΅, Π±Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²:

postgres@tantor:~$ pg_dump -d dump -a

Π² Π΄Π°ΠΌΠΏΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CREATE.

6) ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --quote-all-identifiers ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Ρ€Π°Ρ‚ΡŒ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ всС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹:

postgres@tantor:~$ pg_dump -d dump --quote-all-identifiers | grep \"

-- Name: SCHEMA "public"; Type: COMMENT; Schema: -; Owner: pg_database_owner

COMMENT ON SCHEMA "public" IS 'standard public schema';

SET default_table_access_method = "heap";

CREATE TABLE "public"."t" (

    "id" bigint NOT NULL,

    "t" "text",

    "b" "bytea"

ALTER TABLE "public"."t" OWNER TO "postgres";

CREATE SEQUENCE "public"."t_id_seq"

ALTER SEQUENCE "public"."t_id_seq" OWNER TO "postgres";

ALTER SEQUENCE "public"."t_id_seq" OWNED BY "public"."t"."id";

ALTER TABLE ONLY "public"."t" ALTER COLUMN "id" SET DEFAULT "nextval"('"public"."t_id_seq"'::"regclass");

COPY "public"."t" ("id", "t", "b") FROM stdin;

SELECT pg_catalog.setval('"public"."t_id_seq"', 6, true);

7) Для формирования ΠΊΠΎΠΌΠ°Π½Π΄ INSERT Π²ΠΌΠ΅ΡΡ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ COPY ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€
--rows-per-insert:

postgres@tantor:~$ pg_dump -d dump --rows-per-insert=1 | grep INS

INSERT INTO public.t VALUES (4, 'Π°Π±Π²Π³', NULL);

INSERT INTO public.t VALUES (5, NULL, NULL);

INSERT INTO public.t VALUES (6, '', NULL);

Π§Π°ΡΡ‚ΡŒ 4. Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ рСзСрвирования

1) ЗапуститС psql ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… dump:

postgres@tantor:~$ psql -d dump

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

2) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π² psql ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ создания Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ наполнСния Π΅Ρ‘ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

DROP TABLE IF EXISTS t;

CREATE TABLE t (id bigserial, t text);

INSERT INTO t(t) SELECT encode((floor(random()*1000)::numeric ^ 100::numeric)::text::bytea, 'base64') from generate_series(1,500000);

3) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€ΠΈ использовании Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сТатия:

postgres@tantor:~$ date +%T ; rm -rf ./1 ; pg_dump -d dump --format=directory -Z lz4 -f ./1 ; date +%T ; ls -l ./1

23:28:54

23:28:55

total 114804

-rw-r--r-- 1 postgres postgres 117547931 23:28 3281.dat.lz4

-rw-r--r-- 1 postgres postgres      2127 23:28 toc.dat

postgres@tantor:~$ date +%T ; rm -rf ./1 ; pg_dump -d dump --format=directory -Z zstd -f ./1 ; date +%T ; ls -l ./1

23:29:17

23:29:18

total 7504

-rw-r--r-- 1 postgres postgres 7677214 23:29 3281.dat.zst

-rw-r--r-- 1 postgres postgres    2127 23:29 toc.dat

postgres@tantor:~$ date +%T ; rm -rf ./1 ; pg_dump -d dump --format=directory -Z gzip -f ./1 ; date +%T ; ls -l ./1

23:29:31

23:29:46

total 66436

-rw-r--r-- 1 postgres postgres 68022603 23:29 3281.dat.gz

-rw-r--r-- 1 postgres postgres     2127 23:29 toc.dat

postgres@tantor:~$ date +%T ; rm -rf ./1 ; pg_dump -d dump --format=directory -Z 0 -f ./1 ; date +%T ; ls -l ./1

23:29:52

23:29:53

total 175624

-rw-r--r-- 1 postgres postgres 179830026 23:29 3281.dat

-rw-r--r-- 1 postgres postgres      2127 23:29 toc.dat

По Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ врСмя Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° сТатия. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ сТатия, ΡƒΠΊΠ°Π·Π°Π² послС названия Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ ΠΈ число: -Z zstd:1

Π§Π°ΡΡ‚ΡŒ 5. Команда COPY

1) Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ COPY ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ gzip:

dump=# COPY pg_authid TO PROGRAM 'gzip > file.gz';

COPY 17

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ вызываСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° gzip ΠΈ создаёт Ρ„Π°ΠΉΠ» $PGDATA/file.gz, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится тСкстовый Ρ„Π°ΠΉΠ» с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ "file".

2) МоТно ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния Π»ΡŽΠ±Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Π΅. НапримСр, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ WITH:

COPY (WITH RECURSIVE

 t(n) AS ( SELECT 1

 UNION ALL

 SELECT n+1 FROM t

)

SELECT n FROM t LIMIT 1

)

TO stdout;

3) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

drop table if exists t2;

create table t2 (c1 text);

insert into t2 (c1) VALUES (repeat(E'a\n', 357913941));

COPY t2 TO '/tmp/test';

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ послСднСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ выдастся ошибка:

ERROR:  out of memory

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Cannot enlarge string buffer containing 1073741822 bytes by 1 more bytes.

Π Π°Π·ΠΌΠ΅Ρ€ поля - Ρ‚Ρ€Π΅Ρ‚ΡŒ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Π°.

ΠŸΡ€ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π² тСкстовом Π²ΠΈΠ΄Π΅ содСрТимоС поля Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

a\na\na\na\n ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ поля увСличится Π² Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π° Π΄ΠΎ 1073741823 Π±Π°ΠΉΡ‚, Ρ‡Ρ‚ΠΎ Π½Π° 1 Π±Π°ΠΉΡ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° строк.

4) ПолС ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ binary:

postgres=# COPY t2 TO '/tmp/test' WITH BINARY;

COPY 1

5) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»:

postgres=# \! rm /tmp/test

6) Π‘Ρ€Π°Π²Π½ΠΈΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ CSV. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

postgres=# copy t to stdout with (format text);

1       Π°Π±Π²Π³    \N

2       \N      \N

3               \N

postgres=# copy t to stdout with (format csv);

1,Π°Π±Π²Π³,

2,,

3,"",

Π’ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ CSV пустая строка Π±Ρ‹Π»Π° взята Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ.


Π Π°Π·Π΄Π΅Π» 8. РСпликация

ЀизичСская рСпликация

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ
  2. Π‘Π»ΠΎΡ‚Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ
  3. ИзмСнСниС ΠΈΠΌΠ΅Π½ΠΈ кластСра
  4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ
  5. Π’Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° Ρ€ΠΎΠ»ΡŒ мастСра
  6. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ
  7. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ
  8. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи
  9. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_rewind

Π§Π°ΡΡ‚ΡŒ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ

1) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Π΅ пространства:

postgres=# \db

     List of tablespaces

    Name    |  Owner   |       Location      

------------+----------+----------------------------------------------

 pg_default | postgres |

 pg_global  | postgres |

 u01tbs     | postgres | /var/lib/postgresql/tantor-se-16/data/../u01

(3 rows)

2) Если Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Π΅ пространства, ΠΊΡ€ΠΎΠΌΠ΅ Π΄Π²ΡƒΡ… стандартных (pg_global, pg_default) посмотритС ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ Π² Π½ΠΈΡ…:

SELECT n.nspname, relname

FROM pg_class c

 LEFT JOIN pg_namespace n ON n.oid = c.relnamespace,

 pg_tablespace t

WHERE relkind IN ('r','m','i','S','t') AND

 n.nspname <> 'pg_toast' AND t.oid = reltablespace AND

 t.spcname = 'u01tbs';

 nspname | relname

---------+---------

 public  | t

(1 строка)

3) Π£Π΄Π°Π»ΠΈΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эти Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Π΅ пространства:

postgres=# drop table t;

DROP TABLE

4) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство u01tbs:

postgres=# drop tablespace u01tbs;

DROP TABLESPACE

5) Если Π½Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° (fly-term), Ρ‚ΠΎ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ postgres:

astra@tantor:~$ su - postgres

Password: postgres

postgres@tantor:~$

6) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ:

postgres@tantor:~$ rm -rf /var/lib/postgresql/tantor-se-16-replica/data1

7) Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ бэкап с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

-P ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ прогрСсс рСзСрвирования;

-C ΠΈΠ»ΠΈ --slot ΡΠΎΠ·Π΄Π°Π΅Ρ‚ слот;

-R ΡΠΎΠ·Π΄Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres@tantor:~$ pg_basebackup -D /var/lib/postgresql/tantor-se-16-replica/data1 -P -R -C --slot=replica1

Если Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ:
rm -rf /var/lib/postgresql/tantor-se-16-replica/data1

ΠΈ слот Π½Π° мастСрС:
select pg_drop_replication_slot('replica1');

8) ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ создания бэкапа Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚ для экзСмпляра Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π²Π΅ ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки, Ссли Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄Π½Π°, Ρ‚ΠΎ Ρ„Π°ΠΉΠ» затрётся:

echo "port=5433" >> /var/lib/postgresql/tantor-se-16-replica/data1/postgresql.auto.conf

9) Π§Ρ‚ΠΎΠ±Ρ‹ диагностичСскиС сообщСния Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π½Π° экран Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ строку Π² Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

echo "logging_collector = off" >> /var/lib/postgresql/tantor-se-16-replica/data1/postgresql.auto.conf

Π˜Π½Π°Ρ‡Π΅ диагностичСскиС сообщСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π² Ρ„Π°ΠΉΠ» Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ PGDATA/log.

ΠŸΡ€ΠΈ запускС экзСмпляра ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_ctl Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ сообщСниС:

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

[pid] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΡ€ΠΎΡ†Π΅ΡΡΡƒ сбора ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ²

[pid] ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π’ дальнСйшСм ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ "log".

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

Π’ сообщСнии "ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ" Π²Ρ‹Π΄Π°Ρ‘тся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ€Π° log_directory. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ log_destination = stderr, Π° это Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ Π² PGDATA ΡΠΎΠ·Π΄Π°Ρ‘тся Ρ„Π°ΠΉΠ» current_logfiles, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ записываСтся располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² Π»ΠΎΠ³ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΈΡˆΠ΅Ρ‚ процСсс ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π°.

10) МоТно Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ:

pg_ctl start -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

[7849] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

[7849] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv4 "0.0.0.0" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

[7849] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv6 "::" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

[7849] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Unix-сокСт "/var/run/postgresql/.s.PGSQL.5433"

[7852] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ€Π°Π±ΠΎΡ‚Π° систСмы Π‘Π” Π±Ρ‹Π»Π° ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°; послСдний ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹:

[7852] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ сСрвСра

[7852] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΠΈΡΡŒ REDO начинаСтся со смСщСния 9/BB000028

[7852] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС восстановлСния достигнуто Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BB000130

[7849] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅"

[7853] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½

ДиагностичСскиС сообщСния (ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Ρ€Π°Π±ΠΎΡ‚Ρ‹ экзСмпляра) Π²Ρ‹Π²ΠΎΠ΄ΡΡ‚ся Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π».

Π Π΅ΠΏΠ»ΠΈΠΊΠ° создана, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π±Π΅Π· Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΈ примСняСт ΠΈΡ….

Π§Π°ΡΡ‚ΡŒ 2. Π‘Π»ΠΎΡ‚Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

1) Π’ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° с psql, ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠΌΡƒ ΠΊ мастСру посмотритС, Ρ‡Ρ‚ΠΎ слот создан ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½:

postgres=# select * from pg_replication_slots;

 slot_name | plugin | slot_type | datoid | database | temporary | active |

-----------+--------+-----------+--------+----------+-----------+--------+-

 replica1  |        | physical  |        |          | f         | t      |

(1 строка)

2) Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ прСдставлСниС для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

postgres=# select * from pg_stat_replication \gx

-[ RECORD 1 ]----+------------------------------

pid              | 7854

usesysid         | 10

usename          | postgres

application_name | walreceiver

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 13:56:31.619654+03

backend_xmin     |

state            | streaming

sent_lsn         | 9/BC000198

write_lsn        | 9/BC000198

flush_lsn        | 9/BC000198

replay_lsn       | 9/BC000198

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 14:24:31.557301+03

Имя прилоТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ walreceiver.

3) ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

postgres=# \connect postgres postgres /var/run/postgresql 5433

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5433".

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ слота Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ подсоСдиняСтся Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°:

postgres=# \dconfig primary_slot_name 

List of configuration parameters

     Parameter     |  Value  

-------------------+----------

 primary_slot_name | replica1

(1 строка)

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cluster_name:

postgres=# \dconfig cluster_name

List of configuration parameters

  Parameter   | Value

--------------+-------

 cluster_name |

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cluster_name пусто, поэтому поэтому Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° application_name ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ walreceiver.

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° primary_conninfo:

postgres=# show primary_conninfo \gx

-[ RECORD 1 ]----+-----

primary_conninfo | user=postgres passfile='/var/lib/postgresql/.pgpass' channel_binding=prefer port=5432 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 compression=off target_session_attrs=any load_balance_hosts=disable

Π§Π°ΡΡ‚ΡŒ 3. ИзмСнСниС ΠΈΠΌΠ΅Π½ΠΈ кластСра

1) УстановитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cluster_name:

postgres=# alter system set cluster_name ='replica1';

ALTER SYSTEM

2) На Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ прСдставлСниС pg_stat_replication ΠΏΡƒΡΡ‚ΠΎ:

postgres=# select * from pg_stat_replication;

 pid | usesysid | usename | application_name | client_addr | client_hostname

-----+----------+---------+------------------+-------------+----------------

(0 строк)

3) ИзмСнСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cluster_name Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ рСстарта экзСмпляра, пСрСзапуститС экзСмпляр Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π² ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°:

postgres@tantor:~$ pg_ctl restart -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра....

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv4 "0.0.0.0" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

MSK [25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv6 "::" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Unix-сокСт "/var/run/postgresql/.s.PGSQL.5433"

MSK [25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π±Ρ‹Π»Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² процСссС восстановлСния: 14:37:36 MSK

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ сСрвСра

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΠΈΡΡŒ REDO начинаСтся со смСщСния 9/BC000070

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС восстановлСния достигнуто Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000198

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000198: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅"

[25554] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½        

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список процСссов Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… присутствуСт буквосочСтаниС wal:

postgres@tantor:~$ ps -ef | grep wal

UID      PID   PPID   CMD

postgres  2654 13810  postgres: 11/main: walwriter  

70       11476 13796  postgres: walwriter

postgres 13539 13534  postgres: walwriter

postgres 25554 25550  postgres: replica1: walreceiver 

postgres 25555 13534  postgres: walsender postgres [local] streaming 9/BC000198

postgres 26488 31415  grep wal

Π’ спискС Π΅ΡΡ‚ΡŒ процСссы:

walsender ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΡƒΡŽ запись

walwriter ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ walsender

PPID=25550 ΡΡ‚ΠΎ Π½ΠΎΠΌΠ΅Ρ€ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса (Parent Process ID) для процСсса с PID=25554.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΎΠΌΠ΅Ρ€ процСсса postgres мастСра 13534, walsender 25555.

5) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список процСссов мастСра:

postgres@tantor:~$ ps -o pid,command --ppid `head -n 1 /var/lib/postgresql/tantor-se-16/data/postmaster.pid`

  PID COMMAND

13535 postgres: logger

13536 postgres: checkpointer

13537 postgres: background writer

13539 postgres: walwriter

13540 postgres: autovacuum launcher

13541 postgres: logical replication launcher

25555 postgres: walsender postgres [local] streaming 9/BC000198

ΠŸΡ€ΠΎΡ†Π΅ΡΡ postgres, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ… запустил Π½Π΅ выводится.

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список процСссов Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres@tantor:~$ ps -o pid,command --ppid `head -n 1 /var/lib/postgresql/tantor-se-16-replica/data1/postmaster.pid`

  PID COMMAND

25551 postgres: replica1: checkpointer

25552 postgres: replica1: background writer

25553 postgres: replica1: startup recovering 0000000100000009000000BC

25554 postgres: replica1: walreceiver

ПослС установки значСния cluster_name Ρƒ процСссов Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ присутствуСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ replica1.

7) Π‘Π΄Π΅Π»Π°Π΅ΠΌ прСфиксированиС Π½Π°Π·Π²Π°Π½ΠΈΠΉ процСссов для мастСра, ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΊ мастСру:

postgres=# \c postgres postgres /var/run/postgresql 5432

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5432".

8) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# alter system set cluster_name ='master';

ALTER SYSTEM

9) ИзмСнСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cluster_name Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ рСстарта экзСмпляра, пСрСзапуститС экзСмпляр мастСра Π² ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°:

postgres@tantor:~$ sudo systemctl restart tantor-se-server-16

Π’ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° pg_ctl start для запуска Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π°Π½Ρ‹ диагностичСскиС сообщСния экзСмпляра Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

[25554] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° Π³Π»Π°Π²Π½Ρ‹ΠΌ сСрвСром

[25554] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠΠ° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1 Π² 9/BC000230 достигнут ΠΊΠΎΠ½Π΅Ρ† ΠΆΡƒΡ€Π½Π°Π»Π°.

[25554] Π’ΠΠ–ΠΠž:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ сСрвСру сообщСниС ΠΎ ΠΊΠΎΠ½Ρ†Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ: сСрвСр Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Π» соСдинСниС

                Π‘ΠΊΠΎΡ€Π΅Π΅ всСго сСрвСр ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ·-Π·Π° сбоя

                Π΄ΠΎ ΠΈΠ»ΠΈ Π² процСссС выполнСния запроса.

        опСрация COPY Π½Π΅ выполняСтся

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000230: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

[5727] Π’ΠΠ–ΠΠž:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ сСрвСру: ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру Ρ‡Π΅Ρ€Π΅Π· сокСт "/var/run/postgresql/.s.PGSQL.5432" Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ: сСрвСр Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Π» соСдинСниС

                Π‘ΠΊΠΎΡ€Π΅Π΅ всСго сСрвСр ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ·-Π·Π° сбоя

                Π΄ΠΎ ΠΈΠ»ΠΈ Π² процСссС выполнСния запроса.

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  waiting for WAL to become available at 9/BC00024A

[5782] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска: time

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°: записано Π±ΡƒΡ„Π΅Ρ€ΠΎΠ²: 1 (0.0%); Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² WAL 0, ΡƒΠ΄Π°Π»Π΅Π½ΠΎ: 0, ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ: 0; запись=0.002 сСк., синхр.=0.001 сСк., всСго=0.010 сСк.; синхронизировано_Ρ„Π°ΠΉΠ»ΠΎΠ²=0, самая_долгая_синхр.=0.000 сСк., срСдняя=0.000 сСк.; расстояниС=0 kB, оТидалось=0 kB; lsn=9/BC000198, lsn redo=9/BC000198

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска восстановлСния Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000198

10) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список процСссов Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres@tantor:~$ ps -o pid,command --ppid `head -n 1 /var/lib/postgresql/tantor-se-16-replica/data1/postmaster.pid`

  PID COMMAND

 5782 postgres: replica1: walreceiver streaming 9/BC0003A0

25551 postgres: replica1: checkpointer

25552 postgres: replica1: background writer

25553 postgres: replica1: startup recovering 0000000100000009000000BC

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ процСсс walreceiver 25554 Π±Ρ‹Π» остановлСн ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΈΠ· памяти. Π‘Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ процСсс walreceiver 5725, Π½ΠΎ ΠΎΠ½ Π½Π΅ смог ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ экзСмпляр мастСра ΠΎΡ‚ΠΊΠ°Π·Π°Π» Π² соСдинСнии. Π‘Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ процСсс walreceiver 5782, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ подсоСдинился ΠΊ мастСру ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

11) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список процСссов мастСра:

postgres@tantor:~$ ps -o pid,command --ppid `head -n 1 /var/lib/postgresql/tantor-se-16/data/postmaster.pid`

  PID COMMAND

 5743 postgres: master: logger

 5751 postgres: master: checkpointer

 5752 postgres: master: background writer

 5755 postgres: master: walwriter

 5756 postgres: master: autovacuum launcher

 5757 postgres: master: logical replication launcher

 5783 postgres: master: walsender postgres [local] streaming 9/BC000278

Π’Π΅ΠΏΠ΅Ρ€ΡŒ послС ΠΈΠΌΠ΅Π½ΠΈ процСссов мастСра ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cluster_name.

Π§Π°ΡΡ‚ΡŒ 4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ

1) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½Π° мастСрС слот для Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres=# select pg_copy_physical_replication_slot('replica1','replica2');

 pg_copy_physical_replication_slot

-----------------------------------

 (replica2,)

(1 строа)

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список слотов:

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name  | active | restart_lsn | wal_status

------------+--------+-------------+------------

 pgstandby1 | f      | 0/19187E70  | lost

 replica1   | t      | 9/BC0003A0  | reserved

 replica2   | f      | 9/BC0003A0  | reserved

(3 строки)

Π’Ρ‚ΠΎΡ€ΠΎΠΉ слот Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ начиная с Ρ„Π°ΠΉΠ»Π° Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Π°Ρ запись с адрСсом restart_lsn.

Π’ спискС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ слот pgstandby1. Π­Ρ‚ΠΎ слот Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, которая Π±Ρ‹Π»Π° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС. Π­Ρ‚Ρƒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ ΠΈ слот ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π·Π° Π½Π΅Π½Π°Π΄ΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ.

3) Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи Π½Π° мастСрС. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ:

postgres=# checkpoint;

CHECKPOINT

Π² Π»ΠΎΠ³ сообщСний кластСра master Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ PGDATA/log вывСдСтся:

[5751] LOG:  checkpoint starting: immediate force wait

[5751] LOG:  checkpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.009 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0 kB; lsn=9/BC0003E8, redo lsn=9/BC0003A0

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊ измСнился restart_lsn. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ запрос ΠΊ списку слотов:

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name | active | restart_lsn  | wal_status

-----------+--------+--------------+------------

 pgstandby1 | f      | 0/19187E70  | lost

 replica1   | t      | 9/BC0004C8  | reserved

 replica2   | f      | 9/BC0003A0  | reserved

(3 строки)

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΡƒΡŽ запись ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠ΄Π²ΠΈΠ½ΡƒΠ»ΠΎΡΡŒ. Для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ слота Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ измСнилось.

5) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π½Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ мастСр сдСлаСм бэкап копируя Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ (Β«backup offloadingΒ»).

postgres@tantor:~$ pg_basebackup -p 5433 -D /var/lib/postgresql/tantor-se-16-replica/data2 -P -R

466575/466575 ΠšΠ‘ (100%), Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство 1/1

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ошибки ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ бэкап:

rm -rf /var/lib/postgresql/tantor-se-16-replica/data2

6) Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ port=5434 ΠΈ logging_collector = off для Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ. МоТно ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» тСкстовым Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°. ПослСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π²Π°Π»ΠΈΡ€ΡƒΠ΅Ρ‚.

postgres@tantor:~$ echo "port=5434" >> /var/lib/postgresql/tantor-se-16-replica/data2/postgresql.auto.conf

postgres@tantor:~$ echo "logging_collector = off" >> /var/lib/postgresql/tantor-se-16-replica/data2/postgresql.auto.conf

7) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ содСрТимоС Ρ„Π°ΠΉΠ»Π° postgresql.auto.conf  Π½ΠΎΠ²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres@tantor:~/tantor-se-16-replica/data2$ cat /var/lib/postgresql/tantor-se-16-replica/data2/postgresql.auto.conf 

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

listen_addresses = '*'

max_slot_wal_keep_size = '128MB'

max_wal_size = '128MB'

min_wal_size = '512MB'

idle_in_transaction_session_timeout = '100min'

primary_conninfo = 'user=postgres passfile=''/var/lib/postgresql/.pgpass'' channel_binding=prefer port=5432 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 compression=off target_session_attrs=any load_balance_hosts=disable'

primary_slot_name = 'replica1'

port = '5433'

logging_collector = 'off'

cluster_name = 'replica1'

primary_conninfo = 'user=postgres passfile=''/var/lib/postgresql/.pgpass'' channel_binding=prefer port=5433 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 compression=off target_session_attrs=any load_balance_hosts=disable'

port=5434

logging_collector = off

pg_basebackup Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π» ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ ΠΈ поставил Π΅Ρ‘ ΠΏΠΎΡ€Ρ‚ 5433 Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ primary_conninfo. Π‘ Ρ‚Π°ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ получаСтся каскадированиС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

8) ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» /var/lib/postgresql/tantor-se-16-replica/data2/postgresql.auto.conf, установив ΠΏΠΎΡ€Ρ‚ 5432 - ΠΏΡƒΡΡ‚ΡŒ вторая Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° подсоСдиняСтся ΠΊ мастСру Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, имя слота ΠΈ кластСра Π² replica2.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ содСрТимого Ρ„Π°ΠΉΠ»Π° послС рСдактирования:

postgres@tantor:~$ cat /var/lib/postgresql/tantor-se-16-replica/data2/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

listen_addresses = '*'

max_slot_wal_keep_size = '128MB'

max_wal_size = '128MB'

min_wal_size = '512MB'

idle_in_transaction_session_timeout = '100min'

primary_conninfo = 'user=postgres port=5432'

primary_slot_name = 'replica2'

cluster_name = 'replica2'

port=5434

logging_collector = off

9) ЗапуститС Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ:

postgres@tantor:~$ pg_ctl start -D /var/lib/postgresql/tantor-se-16-replica/data2

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

[5728] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

[5728] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv4 "0.0.0.0" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5434

[5728] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv6 "::" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5434

[5728] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Unix-сокСт "/var/run/postgresql/.s.PGSQL.5434"

[5731] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π±Ρ‹Π»Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² процСссС восстановлСния:

[5731] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ сСрвСра

[5731] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΠΈΡΡŒ REDO начинаСтся со смСщСния 9/BC0003A0

[5731] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС восстановлСния достигнуто Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0004C8

[5728] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅"

[5731] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0004C8: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

[5732] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½

10) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ статус слотов:

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name  | active | restart_lsn | wal_status

------------+--------+-------------+------------

 pgstandby1 | f      | 0/19187E70  | lost

 replica1   | t      | 9/BC0004C8  | reserved

 replica2   | t      | 9/BC0004C8  | reserved

(3 строки)

Π‘Π»ΠΎΡ‚Ρ‹ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹. БСйчас Ρƒ вас мастСр ΠΈ Π΄Π²Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ (ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ). restart_lsn продвигаСтся Π½Π° ΠΎΠ±Π΅ΠΈΡ… слотах.

11) Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ:

postgres=# checkpoint;

CHECKPOINT

12) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ запрос ΠΊ pg_replication_slots:

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name  | active | restart_lsn | wal_status

------------+--------+-------------+------------

 pgstandby1 | f      | 0/19187E70  | lost

 replica1   | t      | 9/BC0005F0  | reserved

 replica2   | t      | 9/BC0005F0  | reserved

(3 строки)

БообщСния экзСмпляров Ρ€Π΅ΠΏΠ»ΠΈΠΊ:

[5729] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска: time

[5729] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°: записано Π±ΡƒΡ„Π΅Ρ€ΠΎΠ²: 1 (0.0%); Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² WAL 0, ΡƒΠ΄Π°Π»Π΅Π½ΠΎ: 0, ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ: 0; запись=0.002 сСк., синхр.=0.001 сСк., всСго=0.008 сСк.; синхронизировано_Ρ„Π°ΠΉΠ»ΠΎΠ²=0, самая_долгая_синхр.=0.000 сСк., срСдняя=0.000 сСк.; расстояниС=0 kB, оТидалось=0 kB; lsn=9/BC000510, lsn redo=9/BC0004C8

[5729] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска восстановлСния Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0004C8

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска: time

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°: записано Π±ΡƒΡ„Π΅Ρ€ΠΎΠ²: 0 (0.0%); Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² WAL 0, ΡƒΠ΄Π°Π»Π΅Π½ΠΎ: 0, ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ: 0; запись=0.001 сСк., синхр.=0.001 сСк., всСго=0.006 сСк.; синхронизировано_Ρ„Π°ΠΉΠ»ΠΎΠ²=0, самая_долгая_синхр.=0.000 сСк., срСдняя=0.000 сСк.; расстояниС=0 kB, оТидалось=0 kB; lsn=9/BC000510, lsn redo=9/BC0004C8

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ‚ΠΎΡ‡ΠΊΠ° пСрСзапуска восстановлСния Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0004C8

Π’ΠΎΡ‡ΠΊΠ° пСрСзапуска - ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ мастСра.

Π§Π°ΡΡ‚ΡŒ 5. Π’Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° Ρ€ΠΎΠ»ΡŒ мастСра

Π‘ΠΈΠΌΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌ сбой получСния ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… записСй ΠΎΠ΄Π½ΠΎΠΉ ΠΈΡ… Ρ€Π΅ΠΏΠ»ΠΈΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‚ΠΎΡ€ΠΎΠΉ. НапримСр, сдСлаСм нСдоступной запись Π² ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ пСрСзапустим экзСмпляр. ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊ Π½ΡƒΠΆΠ΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка:

1) postgres@tantor:~$ chmod -w /var/lib/postgresql/tantor-se-16-replica/data2/pg_wal/000*

postgres@tantor:~$ pg_ctl restart -D /var/lib/postgresql/tantor-se-16-replica/data2

12:19:48.996 MSK [5728] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ запрос Π½Π° быстроС Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра....

12:19:48.998 MSK [5728] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ всСх Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

12:19:48.998 MSK [5732] Π’ΠΠ–ΠΠž:  Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса считывания ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ администратора

12:19:49.004 MSK [5729] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

12:19:49.017 MSK [5728] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

12:19:49.142 MSK [24184] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

12:19:49.142 MSK [24184] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv4 "0.0.0.0" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5434

12:19:49.142 MSK [24184] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv6 "::" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5434

12:19:49.144 MSK [24184] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Unix-сокСт "/var/run/postgresql/.s.PGSQL.5434"

12:19:49.149 MSK [24187] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π±Ρ‹Π»Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² процСссС восстановлСния: 12:19:48 MSK

12:19:49.149 MSK [24187] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ сСрвСра

12:19:49.152 MSK [24187] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΠΈΡΡŒ REDO начинаСтся со смСщСния 9/BC0004C8

12:19:49.152 MSK [24187] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС восстановлСния достигнуто Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0005F0

12:19:49.152 MSK [24187] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0005F0: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

12:19:49.152 MSK [24184] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅"

12:19:49.160 MSK [24188] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

12:19:49.160 MSK [24188] Π’ΠΠ–ΠΠž:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» "pg_wal/0000000100000009000000BC": ΠžΡ‚ΠΊΠ°Π·Π°Π½ΠΎ Π² доступС

12:19:49.167 MSK [24190] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

12:19:49.168 MSK [24190] Π’ΠΠ–ΠΠž:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» "pg_wal/0000000100000009000000BC": ΠžΡ‚ΠΊΠ°Π·Π°Π½ΠΎ Π² доступС

12:19:49.168 MSK [24187] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  waiting for WAL to become available at 9/BC00060A

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½

Π’ ΠΆΡƒΡ€Π½Π°Π» кластСра Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ошибки Ρ€Π°Π· Π² 5 сСкунд (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° wal_retrieve_retry_interval):

12:19:54.173 MSK [24232] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

12:19:54.174 MSK [24232] Π’ΠΠ–ΠΠž:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» "pg_wal/0000000100000009000000BC": ΠžΡ‚ΠΊΠ°Π·Π°Π½ΠΎ Π² доступС

12:19:54.174 MSK [24187] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  waiting for WAL to become available at 9/BC00060A

2) ΠŸΠΎΠΌΠ΅Π½ΡΠΉΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» повторСния ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ walreceiver Ρ 5 сСкунд Π½Π° 30 сСкунд. Π’ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° psql ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

postgres=# \c postgres postgres /var/run/postgresql 5434

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5434".

postgres=# alter system set wal_retrieve_retry_interval='30s';

ALTER SYSTEM

postgres=# select pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 строка)

Ошибки Ρƒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ станут Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Ρ€Π΅ΠΆΠ΅, Ρ€Π°Π· Π² 30 сСкунд.

3) Заставим мастСр ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи. ΠŸΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΊ мастСру ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ:

postgres=# \c postgres postgres /var/run/postgresql 5432

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5432".

postgres=# checkpoint;

CHECKPOINT

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name | active | restart_lsn  | wal_status

-----------+--------+--------------+------------

 pgstandby1 | f      | 0/19187E70  | lost

 replica1   | t      | 9/BC0006D0  | reserved

 replica2   | f      | 9/BC0005F0  | reserved

(3 строки)

Бтатус Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΈ restart_lsn стал Ρ€Π°Π·Π½Ρ‹ΠΌ.

4) Π‘ΠΈΠΌΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌ сбой мастСра. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ мастСр:

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16/data

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра....

12:40:35.444 MSK [5782] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° Π³Π»Π°Π²Π½Ρ‹ΠΌ сСрвСром

12:40:35.444 MSK [5782] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠΠ° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1 Π² 9/BC0007B0 достигнут ΠΊΠΎΠ½Π΅Ρ† ΠΆΡƒΡ€Π½Π°Π»Π°.                                                                                                     12:40:35.444 MSK [5782] Π’ΠΠ–ΠΠž:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ сСрвСру сообщСниС ΠΎ ΠΊΠΎΠ½Ρ†Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ: сСрвСр Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Π» соСдинСниС

Π‘ΠΊΠΎΡ€Π΅Π΅ всСго сСрвСр ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ·-Π·Π° сбоя Π΄ΠΎ ΠΈΠ»ΠΈ Π² процСссС выполнСния запроса.

опСрация COPY Π½Π΅ выполняСтся                                                                                                                            12:40:35.444 MSK [25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0007B0: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

12:40:35.453 MSK [753] Π’ΠΠ–ΠΠž:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ сСрвСру: ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру Ρ‡Π΅Ρ€Π΅Π· сокСт "/var/run/postgresql/.s.PGSQL.5432" Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ: сСрвСр Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Π» соСдинСниС

Π‘ΠΊΠΎΡ€Π΅Π΅ всСго сСрвСр ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ·-Π·Π° сбоя Π΄ΠΎ ΠΈΠ»ΠΈ Π² процСссС выполнСния запроса.

12:40:35.453 MSK [25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  waiting for WAL to become available at 9/BC0007CA

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

5) Устраним ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π°:

postgres@tantor:~$ chmod +w /var/lib/postgresql/tantor-se-16-replica/data2/pg_wal/000*

6) ИмСя Π΄Π²Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π² случаС сбоя мастСра Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚Ρƒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ мастСром.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

postgres@tantor:~$ \c postgres postgres /var/run/postgresql 5433

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5433".

postgres=# select pg_last_wal_replay_lsn();

 pg_last_wal_replay_lsn

------------------------

 9/BC0007B0

(1 строка)

postgres=# select pg_last_wal_receive_lsn();

 pg_last_wal_receive_lsn

-------------------------

 9/BC0007B0

(1 строка)

7) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

postgres@tantor:~$ \c postgres postgres /var/run/postgresql 5434

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5434".

postgres=# select pg_last_wal_replay_lsn();

 pg_last_wal_replay_lsn

------------------------

 9/BC0005F0

(1 строка)

postgres=# select pg_last_wal_receive_lsn();

 pg_last_wal_receive_lsn

-------------------------

 9/BC000000

(1 строка)

8) ΠŸΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ LSN большС слоТно.

ВычислитС, подставив значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres=# select '9/BC0005F0'::pg_lsn - '9/BC0007B0'::pg_lsn;

 ?column?

----------

     -448

(1 строка)

Π£ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ значСния большС, Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΎΠ½Π° содСрТит послСдниС измСнСния.

ΠœΡ‹ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ Ρ€Π΅ΠΆΠΈΠΌ фиксации Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ с ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ€Π΅ΠΏΠ»ΠΈΠΊ. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ эксплуатации Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π½Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΡŒ какая-Ρ‚ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° послСдниС ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи. Π’ случаС продвиТСния любой ΠΈΠ· Ρ€Π΅ΠΏΠ»ΠΈΠΊ Ρ‡Π°ΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ потСряна, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ.

Π’ случаС, Ссли синхронной фиксации с ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ Π±Ρ‹Π»ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, стоит ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° мастСрС ΠΈΠ»ΠΈ Ссли ΠΎΠ½ΠΈ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Ρ‹ Π² ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ Π°Ρ€Ρ…ΠΈΠ²Π΅ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² (заполняСмый ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_receivewal), Ссли ΠΎΠ½ Π±Ρ‹Π» настроСн. ΠŸΡ€ΠΈ использовании Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· Π°Ρ€Ρ…ΠΈΠ²Π° Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΆΡƒΡ€Π½Π°Π»Π°. Π•Π³ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ суффиксу .partial Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ. ΠŸΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ планируСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ мастСром (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π½Π°ΠΊΠ°Ρ‚ΠΈΠ»Π° Ρ„Π°ΠΉΠ») Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ суффикс.

9) Рассмотрим случай, ΠΊΠΎΠ³Π΄Π° PGDATA/pg_wal ΠΌΠ°ΡΡ‚Π΅Ρ€Π° Π±Ρ‹Π»Π° Π½Π°ΠΉΠ΄Π΅Π½Π°. Π­Ρ‚Π° дирСктория содСрТит послСдниС ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сохранил мастСр. Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ всС Ρ„Π°ΠΉΠ»Ρ‹ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ PGDATA/pg_wal Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ (ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° послСдниС ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΎΡ‚ мастСра):

postgres@tantor:~$ cp /var/lib/postgresql/tantor-se-16/data/pg_wal/* /var/lib/postgresql/tantor-se-16-replica/data2/pg_wal

cp: Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ -r; пропускаСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ '/var/lib/postgresql/tantor-se-16/data/pg_wal/archive_status'

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ всС Ρ„Π°ΠΉΠ»Ρ‹? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ мастСр сохраняСт Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ послС сбоя экзСмпляра ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ для Ρ€Π΅ΠΏΠ»ΠΈΠΊ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ достаёт Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ². Π’Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚.

10) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ (процСссом startup, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ pg_wal Ρ ΠΆΡƒΡ€Π½Π°Π»Π°ΠΌΠΈ ΠΈ примСняСт Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· Π½Π΅Ρ‘) ΠΈ Π±Ρ‹Π»ΠΈ приняты (процСссом walreceiver, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚ Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ pg_wal) Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

postgres=# select pg_last_wal_replay_lsn();

 pg_last_wal_replay_lsn

------------------------

 9/BC0007B0

(1 строка)

postgres=# select pg_last_wal_receive_lsn();

 pg_last_wal_receive_lsn

-------------------------

 9/BC000000

(1 строка)

По walreceiver ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅Ρ‚, мастСр остановлСн ΠΈ процСсс Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠ³ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ.

БСйчас ΠΎΠ±Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π°ΠΊΠ°Ρ‚ΠΈΠ»ΠΈ всС ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи ΠΈ содСрТат всС Π΄Π°Π½Π½Ρ‹Π΅. ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ любой ΠΈΠ· Ρ€Π΅ΠΏΠ»ΠΈΠΊ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° успСла ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС записи ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ остановили мастСр Π² Ρ‚ΠΎ врСмя, ΠΊΠΎΠ³Π΄Π° пСрвая Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π±Ρ‹Π»Π° ΠΊ Π½Π΅ΠΌΡƒ подсоСдинСна. На Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ ΠΌΡ‹ скопировали всС Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² мастСра.

Π§Π°ΡΡ‚ΡŒ 6. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ

Настроим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±Ρ‹Π²ΡˆΠ΅Π³ΠΎ мастСра.

Имя слота Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ primary_slot_name ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅. ПослС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ слоты исчСзнут - Π½Π° Π½ΠΎΠ²ΠΎΠΌ мастСрС ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ соСдинСния primary_conninfo Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π° ΡƒΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ 5433, Π΅Ρ‘ сдСлаСм ΠΌΠ°Ρ‚Π΅Ρ€ΠΎΠΌ.

Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ свойствам Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ влияниС, ΠΏΠΎΠΊΠ° Ρƒ кластСра Ρ€ΠΎΠ»ΡŒ мастСра поэтому значСния Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅.

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ содСрТимоС Ρ„Π°ΠΉΠ»Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π±Ρ‹Π²ΡˆΠ΅Π³ΠΎ мастСра:

postgres@tantor:~$ cat /var/lib/postgresql/tantor-se-16/data/postgresql.auto.conf 

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

listen_addresses = '*'

max_slot_wal_keep_size = '128MB'

max_wal_size = '128MB'

min_wal_size = '512MB'

idle_in_transaction_session_timeout = '100min'

cluster_name = 'master'

2) УстановитС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сСтСвого соСдинСния, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π±Ρ‹Π²ΡˆΠΈΠΉ мастСр Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

postgres@tantor:~$ echo "primary_conninfo = 'user=postgres port=5433'" >> /var/lib/postgresql/tantor-se-16/data/postgresql.auto.conf

3) Установим Π½Π°Π·Π²Π°Π½ΠΈΠ΅ слота, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

postgres@tantor:~$ echo "primary_slot_name = 'master'" >> /var/lib/postgresql/tantor-se-16/data/postgresql.auto.conf

4) Π§Ρ‚ΠΎΠ±Ρ‹ диагностичСскиС сообщСния Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π½Π° экран Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°:

echo "logging_collector = off" >> /var/lib/postgresql/tantor-se-16/data/postgresql.auto.conf

5) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ строки добавились:

postgres@tantor:~$ cat /var/lib/postgresql/tantor-se-16/data/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

listen_addresses = '*'

max_slot_wal_keep_size = '128MB'

max_wal_size = '128MB'

min_wal_size = '512MB'

idle_in_transaction_session_timeout = '100min'

cluster_name = 'master'

primary_conninfo = 'user=postgres port=5433'

primary_slot_name = 'master'

logging_collector = off

6) МоТно Π·Π°Ρ€Π°Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ слоты Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° случай Ссли кластСр станСт мастСром Π½Π° всСх Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ…-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°Ρ….

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ слот Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

postgres@tantor:~$ psql -p 5434

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

postgres=# select pg_is_in_recovery();

 pg_is_in_recovery

-------------------

 t

(1 row)

postgres=# select pg_create_physical_replication_slot('master');

 pg_create_physical_replication_slot

-------------------------------------

 (master,)

(1 row)

7) Π—Π°Ρ€Π°Π½Π΅Π΅ создадим слот ΠΈ для ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# select pg_create_physical_replication_slot('replica1');

 pg_create_physical_replication_slot

-------------------------------------

 (replica1,)

(1 row)

8) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ слотов:

postgres=# select * from pg_replication_slots \gx

-[ RECORD 1 ]-------+----------

slot_name           | master

plugin              |

slot_type           | physical

datoid              |

database            |

temporary           | f

active              | f

active_pid          |

xmin                |

catalog_xmin        |

restart_lsn         |

confirmed_flush_lsn |

wal_status          |

safe_wal_size       | 150994944

two_phase           | f

conflicting         |

-[ RECORD 2 ]-------+----------

slot_name           | replica1

plugin              |

slot_type           | physical

datoid              |

database            |

temporary           | f

active              | f

active_pid          |

xmin                |

catalog_xmin        |

restart_lsn         |

confirmed_flush_lsn |

wal_status          |

safe_wal_size       | 150994944

two_phase           | f

conflicting         |

        ΠΠ° Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ мастСрС replica1 (ΠΏΠΎΡ€Ρ‚ 5433) слоты ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π² цСлях ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ (ΠΏΡƒΠ½ΠΊΡ‚ 11 этой части ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ).

Π‘Π»ΠΎΡ‚Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅, это ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ количСство ΠΊΠΎΠΌΠ°Π½Π΄, выполняСмых ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ safe_wal_size=144Мб=128Мб+16Мб опрСдСляСт сколько Π±Π°ΠΉΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записано Π² ΠΆΡƒΡ€Π½Π°Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот слот Π½Π΅ оказался Π² состоянии lost. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° max_slot_wal_keep_size=128Мб ΠΏΠ»ΡŽΡ wal_segment_size=16Мб.

9) Π’Π°ΠΊ ΠΊΠ°ΠΊ Π±Ρ‹Π²ΡˆΠΈΠΉ мастСр остановлСн, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» standby.signal Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ запускС экзСмпляр Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π» Π±Ρ‹Π²ΡˆΠΈΠΉ мастСр Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ записи. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» standby.signal Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π±Ρ‹Π²ΡˆΠ΅Π³ΠΎ мастСра:

postgres@tantor:~$ touch  /var/lib/postgresql/tantor-se-16/data/standby.signal

ПослС создания Ρ„Π°ΠΉΠ»Π° standby.signal ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±Ρ‹Π²ΡˆΠΈΠΉ мастСр ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ€Π΅ΠΏΠ»ΠΈΠΊ. Или Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС: ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ€Π΅ΠΏΠ»ΠΈΠΊ, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±Ρ‹Π²ΡˆΠΈΠΉ мастСр. Π Π°Π·Π½ΠΈΡ†Ρ‹ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ссли Π±Ρ‹Π²ΡˆΠΈΠΉ мастСр Π±Ρ‹Π» остановлСн ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ мастСр ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ» всС ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи (Π½Π΅Ρ‚ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ).

10) ЗапуститС Π±Ρ‹Π²ΡˆΠΈΠΉ мастСр:

postgres@tantor:~$ pg_ctl start -D /var/lib/postgresql/tantor-se-16/data

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

[7824] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv4 "0.0.0.0" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5432

[7824] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv6 "::" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5432

[7824] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Unix-сокСт "/var/run/postgresql/.s.PGSQL.5432"

[7827] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π±Ρ‹Π»Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°: 12:40:35 MSK

[7827] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ сСрвСра

[7827] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС восстановлСния достигнуто Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0007B0

[7827] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC0007B0: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

[7824] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅"

[7828] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

[7828] ΠžΠ¨Π˜Π‘ΠšΠ:  ΡΠ»ΠΎΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "master" Π½Π΅ сущСствуСт

[7828] STATEMENT:  START_REPLICATION SLOT "master" 9/BC000000 TIMELINE 1

[7828] Π’ΠΠ–ΠΠž:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ WAL: ΠžΠ¨Π˜Π‘ΠšΠ:  ΡΠ»ΠΎΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "master" Π½Π΅ сущСствуСт

[7828] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  waiting for WAL to become available at 9/BC0007CA

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½

ЭкзСмпляр Π±Ρ‹Π²ΡˆΠ΅Π³ΠΎ мастСра запустился ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ вошСл Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания запуска Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Ошибки ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ слот с ΠΈΠΌΠ΅Π½Π΅ΠΌ master Π½Π΅ сущСствуСт. ΠœΡ‹ Π΅Π³ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ создавали (Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ 8 этой части ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ) Π² цСлях ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‘ - ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ слот послС запуска Π±Ρ‹Π²ΡˆΠ΅Π³ΠΎ мастСра.

11) ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ replica1 (ΠΏΠΎΡ€Ρ‚ 5433) ΠΈ создайтС слоты Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

postgres=# \c postgres postgres /var/run/postgresql 5433

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5433".

postgres=# select pg_create_physical_replication_slot('master');

 pg_create_physical_replication_slot

-------------------------------------

 (master,)

(1 row)

postgres=# select pg_create_physical_replication_slot('replica2');

 pg_create_physical_replication_slot

-------------------------------------

 (replica2,)

(1 row)

 

Π‘Ρ‹Π²ΡˆΠΈΠΉ master Π°Π²Ρ‚оматичСски станСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ созданный слот.

Π’ сообщСниях экзСмпляра master появится:

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  waiting for WAL to become available at 9/BC0007CA

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1

12) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π½Π° replica1 (ΠΏΠΎΡ€Ρ‚ 5433) статус слотов Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name | active | restart_lsn | wal_status

-----------+--------+-------------+------------

 master    | t      | 9/BC0007B0  | reserved

 replica2  | f      |             |

(2 строки)

13) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΡΡ‚атистику слотов Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° Π±Ρ‹Π²ΡˆΠ΅ΠΌ мастСрС (master):

postgres=# \c postgres postgres /var/run/postgresql 5432

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5432".

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name  | active | restart_lsn | wal_status

------------+--------+-------------+------------

 pgstandby1 | f      | 0/19187E70  | lost

 replica1   | t      | 9/BC0007B0  | reserved

 replica2   | t      | 9/BC0007B0  | reserved

(3 строки)

postgres=# select * from pg_stat_replication \gx

-[ RECORD 1 ]----+------------------------------

pid              | 18624

usesysid         | 10

usename          | postgres

application_name | replica1

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 16:07:37.4+03

backend_xmin     |

state            | streaming

sent_lsn         | 9/BC0007B0

write_lsn        | 9/BC0007B0

flush_lsn        | 9/BC0007B0

replay_lsn       | 9/BC0007B0

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 16:31:37.866881+03

-[ RECORD 2 ]----+------------------------------

pid              | 18693

usesysid         | 10

usename          | postgres

application_name | replica2

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 16:07:52.385223+03

backend_xmin     |

state            | streaming

sent_lsn         | 9/BC0007B0

write_lsn        | 9/BC0007B0

flush_lsn        | 9/BC0007B0

replay_lsn       | 9/BC0007B0

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 16:31:32.847758+03

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΉ мастСр replica1 ΠΈ replica2 подсоСдинСны ΠΊ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ мастСру. ВрСмя reply_time Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅. Ни ΠΎΠ΄ΠΈΠ½ ΠΈΠ· кластСров ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΠ»ΠΈ Π΄ΠΎ мастСра - всС Ρ‚Ρ€ΠΈ кластСра физичСскиС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° пСриодичСски выводятся сообщСния:

ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  SELECT slot_name, database, slot_type, xmin::text::int8, active, pg_wal_lsn_diff(pg_current_wal_insert_lsn(), restart_lsn) AS retained_bytes FROM pg_replication_slots LIMIT 50 OFFSET 0;

ΠžΠ¨Π˜Π‘ΠšΠ:  ΠΈΠ΄Ρ‘Ρ‚ процСсс восстановлСния

ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния WAL нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² процСссС восстановлСния.

14) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ статистику слотов Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° replica1 ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ подсоСдинСн Π±Ρ‹Π²ΡˆΠΈΠΉ master:

postgres=# \c postgres postgres /var/run/postgresql 5433

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5433".

postgres=# select * from pg_stat_replication \gx

-[ RECORD 1 ]----+------------------------------

pid              | 20280

usesysid         | 10

usename          | postgres

application_name | master

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 16:11:07.446672+03

backend_xmin     |

state            | streaming

sent_lsn         | 9/BC0007B0

write_lsn        | 9/BC0007B0

flush_lsn        | 9/BC0007B0

replay_lsn       | 9/BC0007B0

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 16:39:18.004533+03

ВрСмя reply_time Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅.

15) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ списки процСссов экзСмпляров:

postgres@tantor:~$ ps -o pid,command --ppid `head -n 1 /var/lib/postgresql/tantor-se-16/data/postmaster.pid`

  PID COMMAND

18615 postgres: master: checkpointer

18616 postgres: master: background writer

18617 postgres: master: startup recovering 0000000100000009000000BC

18624 postgres: master: walsender postgres [local] streaming 9/BC0007B0

18693 postgres: master: walsender postgres [local] streaming 9/BC0007B0

20279 postgres: master: walreceiver

postgres@tantor:~$ ps -o pid,command --ppid `head -n 1 /var/lib/postgresql/tantor-se-16-replica/data1/postmaster.pid`

  PID COMMAND

18622 postgres: replica1: walreceiver 

20280 postgres: replica1: walsender postgres [local] streaming 9/BC0007B0

25551 postgres: replica1: checkpointer

25552 postgres: replica1: background writer

25553 postgres: replica1: startup recovering 0000000100000009000000BC

postgres@tantor:~$ ps -o pid,command --ppid `head -n 1 /var/lib/postgresql/tantor-se-16-replica/data2/postmaster.pid`

  PID COMMAND

18692 postgres: replica2: walreceiver 

24185 postgres: replica2: checkpointer

24186 postgres: replica2: background writer

24187 postgres: replica2: startup recovering 0000000100000009000000BC

Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС: replica1 Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ Ρ master. master Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ с replica1. replica2 Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ c master. ВсС кластСра Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ восстановлСния (физичСскиС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ).

Π§Π°ΡΡ‚ΡŒ 7. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ

Как Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ мастСром? МоТно ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ replica1 Π΄ΠΎ мастСра ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

a) pg_ctl promote -D /var/lib/postgresql/tantor-se-16-replica/data1

Π±) Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ psql -p 5433 -c "select pg_promote();"

МоТно Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ любой способ.

1) ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡŒΡ‚Π΅ replica1 Π΄ΠΎ мастСра:

postgres@tantor:~$ psql -p 5433 -c "select pg_promote();"

 pg_promote

------------

 t

(1 row)

БообщСния Π² Π»ΠΎΠ³Π°Ρ… кластСров:

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ запрос ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ статуса

[18622] Π’ΠΠ–ΠΠž:  Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса считывания ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ администратора

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΠΈΡΠΈ REDO ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Π΄ΠΎ смСщСния 9/BC000718, Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° систСмы: CPU: пользов.: 0.94 с, систСма: 1.13 с, ΠΏΡ€ΠΎΡˆΠ»ΠΎ: 104038.32 с

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ID Π½ΠΎΠ²ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: 2

[25553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Ρ‚Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°: force

[20279] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° Π³Π»Π°Π²Π½Ρ‹ΠΌ сСрвСром

[20279] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠΠ° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1 Π² 9/BC0007B0 достигнут ΠΊΠΎΠ½Π΅Ρ† ΠΆΡƒΡ€Π½Π°Π»Π°.

[20279] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π° истории для Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2 с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра

[20279] Π’ΠΠ–ΠΠž:  Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса считывания ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ администратора

[18617] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½ΠΎΠ²Π°Ρ цСлСвая линия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°: записано Π±ΡƒΡ„Π΅Ρ€ΠΎΠ²: 2 (0.0%); Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² WAL 0, ΡƒΠ΄Π°Π»Π΅Π½ΠΎ: 0, ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ: 0; запись=0.002 сСк., синхр.=0.001 сСк., всСго=0.014 сСк.; синхронизировано_Ρ„Π°ΠΉΠ»ΠΎΠ²=2, самая_долгая_синхр.=0.001 сСк., срСдняя=0.001 сСк.; расстояниС=0 kB, оТидалось=0 kB; lsn=9/BC000828, lsn redo=9/BC0007E0

[4727] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2

[18617] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΠΈΡΡŒ REDO начинаСтся со смСщСния 9/BC0007B0

[18692] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° Π³Π»Π°Π²Π½Ρ‹ΠΌ сСрвСром

[18692] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠΠ° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 1 Π² 9/BC0007B0 достигнут ΠΊΠΎΠ½Π΅Ρ† ΠΆΡƒΡ€Π½Π°Π»Π°.

[18692] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π° истории для Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2 с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра

[18692] Π’ΠΠ–ΠΠž:  Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса считывания ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ администратора

[24187] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½ΠΎΠ²Π°Ρ цСлСвая линия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2

[4730] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ статус слотов Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

postgres@tantor:~$ psql -p 5433

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name | active | restart_lsn  | wal_status

-----------+--------+--------------+------------

 master    | t      | 9/BC000908   | reserved

 replica2  | f      |              |

(2 строки)

postgres=# select * from pg_stat_replication \gx

-[ RECORD 1 ]----+------------------------------

pid              | 4729

usesysid         | 10

usename          | postgres

application_name | master

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 19:31:35.37509+03

backend_xmin     |

state            | streaming

sent_lsn         | 9/BC000908

write_lsn        | 9/BC000908

flush_lsn        | 9/BC000908

replay_lsn       | 9/BC000908

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 19:40:25.699932+03

postgres=# \c postgres postgres /var/run/postgresql 5432

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres" Ρ‡Π΅Ρ€Π΅Π· сокСт Π² "/var/run/postgresql", ΠΏΠΎΡ€Ρ‚ "5432".

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name | active | restart_lsn  | wal_status

-----------+--------+--------------+------------

 pgstandby1 | f      | 0/19187E70  | lost

 replica1   | f      | 9/BC0007B0  | reserved

 replica2   | t      | 9/BC000908  | reserved

(3 строки)

postgres=# select * from pg_stat_replication \gx

-[ RECORD 1 ]----+------------------------------

pid              | 4731

usesysid         | 10

usename          | postgres

application_name | replica2

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 19:31:35.411578+03

backend_xmin     |

state            | streaming

sent_lsn         | 9/BC000908

write_lsn        | 9/BC000908

flush_lsn        | 9/BC000908

replay_lsn       | 9/BC000908

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 19:45:05.821085+03

Новый мастСр replica1 ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ master. ЀизичСская Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° master ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ replica1.

Π’ спискС слотов Π±Ρ‹Π²ΡˆΠ΅Π³ΠΎ мастСра присутствуСт слот replica1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠΊΠ° ΠΎΠ½ Π±Ρ‹Π» мастСром. Названия слотов Π½Π΅ зависят ΠΎΡ‚ Π½Π°Π·Π²Π°Π½ΠΈΠΉ кластСров. ΠšΠ»Π°ΡΡ‚Π΅Ρ€Π° Π½Π΅ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΌΡ‹ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΈ Π±Ρ‹Π²ΡˆΠΈΠΉ мастСр Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ слот replica1 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΡΡ Π½ΠΎΠ²Ρ‹ΠΌ мастСром. Π­Ρ‚ΠΎ слот заставит master ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вряд Π»ΠΈ подсоСдинится, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ мастСр.

Π§Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ: с использованиСм каскадирования ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π½Π° мастСрС, Π° Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ…, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π·Π°Π±ΠΈΡ€Π°ΡŽΡ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ записи.

3) ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ replica1 Π΄ΠΎ мастСра Π»ΠΈΠ½ΠΈΡ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»Π°ΡΡŒ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π­Ρ‚ΠΎ отраТаСтся Π² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈ названиях Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ². Π’Π°ΠΊΠΆΠ΅ Π² дирСкториях PGDATA/pg_wal ΠΊΠ»Π°ΡΡ‚Π΅Ρ€ΠΎΠ² Π±Ρ‹Π»ΠΈ созданы тСкстовыС Ρ„Π°ΠΉΠ»Ρ‹ 00000002.history Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… имССтся Π½ΠΎΠΌΠ΅Ρ€ Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ содСрТимоС Ρ„Π°ΠΉΠ»Π° истории:

postgres@tantor:~$ cat /var/lib/postgresql/tantor-se-16-replica/data1/pg_wal/*.history

1       9/BC0007B0      no recovery target specified

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ линию Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ master (Ρƒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… кластСров Ρ‚ΠΎ ΠΆΠ΅ самоС):

postgres@tantor:~$ pg_controldata | grep timeline

postgres@tantor:~$ pg_controldata | grep Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

Линия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ послСднСй ΠΊΠΎΠ½Ρ‚. Ρ‚ΠΎΡ‡ΠΊΠΈ:  2

ΠŸΡ€Π΅Π΄. линия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ послСднСй ΠΊ. Ρ‚.:  2

Линия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΈΠ½. полоТСния ΠΊ. Π².:   2

Π€ΠΎΡ€ΠΌΠ°Ρ‚ хранСния Π΄Π°Ρ‚Ρ‹/Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ:         64-Π±ΠΈΡ‚Π½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅

Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² процСссС восстановлСния с бэкапов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ созданы Π΄ΠΎ появлСния Π½ΠΎΠ²ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

5) ΠΠ΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΡΠ»ΠΎΡ‚Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π²ΡΠ΅Π³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ.

Π˜Π½Π°Ρ‡Π΅ эти слоты Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ Π΄ΠΎ достиТСния max_slot_wal_keep_size, статус слота смСнится Π½Π° unreserved. Если послС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ (Ρ„Π°ΠΉΠ»Ρ‹ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ послС прохоТдСния ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ) Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π½Π΅ удалятся благодаря ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ wal_keep_size, Ρ‚ΠΎ статус Π»ΠΎΡ‚Π° измСнится Π½Π° extended. Если удалятся, Ρ‚ΠΎ статус слота измСнится Π½Π° lost ΠΈ слот станСт бСсполСзСн.

Π£Π΄Π°Π»ΠΈΡ‚Π΅ слоты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

postgres=# \c postgres postgres /var/run/postgresql 5432

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres".

postgres=# select pg_drop_replication_slot('replica1');

 pg_drop_replication_slot

--------------------------

 

(1 строка)

postgres=# select pg_drop_replication_slot('pgstandby1');

 pg_drop_replication_slot

--------------------------

 

(1 строка)

6) Π—Π°Ρ€Π°Π½Π΅Π΅ создадим Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ слот Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ смСны Ρ€ΠΎΠ»Π΅ΠΉ:

postgres=# select pg_create_physical_replication_slot('replica1');

 pg_create_physical_replication_slot

-------------------------------------

 (replica1,)

(1 строка)

7) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ список слотов:

postgres=# select slot_name, active, restart_lsn, wal_status from pg_replication_slots;

 slot_name | active | restart_lsn  | wal_status

-----------+--------+--------------+------------

 replica1  | f      |             |

 replica2  | t      | 9/BC000908  | reserved

(2 строки)

Π‘Π»ΠΎΡ‚ replica1 Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Ρ‹.

Π§Π°ΡΡ‚ΡŒ 8. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи

1) Если Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ планируСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для обслуТивания запросов, Ρ‚ΠΎ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ сбоСв Π΄ΠΎΠ»Π³ΠΈΡ… запросов Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»ΠΈΠ±ΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠ°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… записСй Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅, Π»ΠΈΠ±ΠΎ сообщат мастСру ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄ΠΎΠ»Π³ΠΈΠ΅ запросы ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ старыС вСрсии строк Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

УстановитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° hot_standby_feedback=on Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ master:

postgres=# \c postgres postgres /var/run/postgresql 5432

Π’Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… "postgres" ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ "postgres".

postgres=# alter system set hot_standby_feedback = on;

ALTER SYSTEM

postgres=# select pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 строка)

2) ΠŸΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ master:

postgres=# begin transaction isolation level repeatable read;

BEGIN

postgres=*# select count(*) from pg_class;

 count

-------

   423

(1 строка)

Вранзакция Π½Π°Ρ‡Π°Π»Π°ΡΡŒ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°Ρ‡Π°Π»Π° выполнСния select. Π’Π°Π±Π»ΠΈΡ†Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ обратился select ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой.

3) Π’ самих Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ… ΠΈΡΠΊΠ°Ρ‚ΡŒ процСссы, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π½Π° мастСрС - запросом ΠΊ pg_stat_activity.  Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ запрос:

postgres=*# SELECT backend_xmin, backend_xid, pid, datname, state FROM pg_stat_activity WHERE backend_xmin IS NOT NULL OR backend_xid IS NOT NULL ORDER BY greatest(age(backend_xmin), age(backend_xid)) DESC;

 backend_xmin | backend_xid | pid  | datname  | state  

--------------+-------------+------+----------+--------

        17580 |             | 4117 | postgres | active

(1 строка)

4) Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ сСссии ΠΊ кластСру replica1 ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΌΡƒΡΡ мастСром:

postgres@tantor:~$ psql -p 5433

postgres=# select slot_name, active, active_pid, xmin from pg_replication_slots;

 slot_name | active | active_pid | xmin  

-----------+--------+------------+-------

 master    | t      |       4729 | 17580

 replica2  | f      |            |      

(2 строки)

Π Π΅ΠΏΠ»ΠΈΠΊΠ° ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚ всСх Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… кластСра (Π½Π° мастСрС Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ Π²Π°ΠΊΡƒΡƒΠΌΠΎΠΌ старыС вСрсии строк) Π½Π° xid=17580

5) ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ:

postgres=# select pg_current_xact_id();

 pg_current_xact_id

--------------------

              17580

(1 строка)

6) МоТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π½ΠΎ достаточно просто ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ счСтчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ счСтчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ увСличится:

postgres=# select pg_current_xact_id();

 pg_current_xact_id

--------------------

              17581

(1 строка)

7) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π½Π° мастСрС запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ сСрвСрный процСсс экзСмпляра мастСра ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚:

postgres=# SELECT backend_xmin, backend_xid, pid, datname, state FROM pg_stat_activity WHERE backend_xmin IS NOT NULL OR backend_xid IS NOT NULL ORDER BY greatest(age(backend_xmin), age(backend_xid)) DESC;

 backend_xmin | backend_xid | pid  | datname  | state  

--------------+-------------+------+----------+--------

        17582 |             | 6562 | postgres | active

(1 row)

pg_stat_activity ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ процСссы своСго экзСмпляра.

8) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# select slot_name, active, active_pid, xmin from pg_replication_slots;

 slot_name | active | active_pid | xmin  

-----------+--------+------------+-------

 master    | t      |       4729 | 17580

 replica2  | f      |            |      

(2 строки)

Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚ всСх Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… мастСра (Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ мастСр это replica1) удСрТиваСтся Π½Π° xid=17580.

9) ΠŸΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ ΠΈ посмотритС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ процСссах Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres=# \c postgres postgres /var/run/postgresql 5432

You are now connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".

postgres=# SELECT backend_xmin, backend_xid, pid, datname, state FROM pg_stat_activity WHERE backend_xmin IS NOT NULL OR backend_xid IS NOT NULL ORDER BY greatest(age(backend_xmin), age(backend_xid)) DESC;

 backend_xmin | backend_xid | pid  | datname  |        state        

--------------+-------------+------+----------+---------------------

        17580 |             | 4117 | postgres | idle in transaction

        17582 |             | 7692 | postgres | active

(2 rows)

4117 - pid сСрвСрного процСсса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π° транзакция.

7692 - pid сСрвСрного процСсса Π½Π° master, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполнялся этот запрос. 17582 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ этот сСрвСрный процСсс Π²Ρ‹Π΄Π°Ρ‘Ρ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (Π² соотвСтствии с измСнСниями, ΠΏΡ€ΠΈΠ΅Ρ…Π°Π²ΡˆΠΈΠΌΠΈ с мастСра ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΊ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅).

7) Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π² Ρ‚ΠΎΠΌ ΠΎΠΊΠ½Π΅, Π³Π΄Π΅ ΠΎΠ½Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π°:

postgres=*# commit;

COMMIT

8) Π’ ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… 10 сСкунд (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° walreceiver_status_interval) xmin Π½Π° replica1 ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π½Π΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈ xmin ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ся:

postgres=# select slot_name, active, active_pid, xmin from pg_replication_slots;

 slot_name | active | active_pid | xmin  

-----------+--------+------------+-------

 master    | t      |       4729 | 17582

 replica2  | f      |            |      

(2 строки)

4729 - pid walsender Π½Π° replica1. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

postgres@tantor:~$ ps -ef | grep 4729

postgres  4729 25550 postgres: replica1: walsender postgres [local] streaming 9/BC0017B8


Π§Π°ΡΡ‚ΡŒ 9. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_rewind

        1) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ replica1:

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра...

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ запрос Π½Π° быстроС Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ всСх Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ процСсс "logical replication launcher" (PID 4728) Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π° 1

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Ρ‚Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°: shutdown immediate

[25551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°: записано Π±ΡƒΡ„Π΅Ρ€ΠΎΠ²: 0 (0.0%); Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² WAL 0, ΡƒΠ΄Π°Π»Π΅Π½ΠΎ: 0, ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ: 0; запись=0.001 сСк., синхр.=0.001 сСк., всСго=0.012 сСк.; синхронизировано_Ρ„Π°ΠΉΠ»ΠΎΠ²=0, самая_долгая_синхр.=0.000 сСк., срСдняя=0.000 сСк.; расстояниС=0 kB, оТидалось=0 kB; lsn=9/BC001950, lsn redo=9/BC001950

[25550] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

        2) ΠŸΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ ΠΊ master (ΠΏΠΎΡ€Ρ‚ 5432) ΠΈ ΠΏΠΎΠ²Ρ‹ΡΡŒΡ‚Π΅ Π΅Π³ΠΎ Π΄ΠΎ мастСра:

postgres@tantor:~$ psql

postgres=# select pg_promote();

LOG:  replication terminated by primary server

DETAIL:  End of WAL reached on timeline 2 at 9/BC001A18.

LOG:  fetching timeline history file for timeline 3 from primary server

FATAL:  terminating walreceiver process due to administrator command

LOG:  new target timeline is 3

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC001B40: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 3

 pg_promote

------------

 t

(1 строка)

3) БСйчас master являСтся мастСром, ΠΊ Π½Π΅ΠΌΡƒ подсоСдинСн replica2 ΠΊΠΎΡ‚орая Π½Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π»Π°ΡΡŒ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

ΠœΡ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ остановили replica1 Π΄ΠΎ продвиТСния Π½ΠΎΠ²ΠΎΠ³ΠΎ мастСра. МоТСм Π»ΠΈ ΠΌΡ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ replica1 ΠΈΠ»ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π΅Ρ‰Ρ‘ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ?

Π’ дСмонстрационных цСлях запустим ΠΈ остановим replica1. Π­Ρ‚ΠΎ эквивалСнтно Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΌΡ‹ Π·Π°Π±Ρ‹Π»ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ replica1 Π΄ΠΎ продвиТСния master ΠΈΠ»ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Ссли Π±Ρ‹ экзСмпляр replica1 Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ остановился ΠΈ Π½Π΅ успСл Π±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ послСднюю ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΡƒΡŽ запись Π½Π° master.

postgres@tantor:~$ pg_ctl start -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv4 "0.0.0.0" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv6 "::" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Unix-сокСт "/var/run/postgresql/.s.PGSQL.5433"

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π±Ρ‹Π»Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°:

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½

4) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ replica1:

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра....

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•: ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ запрос Π½Π° быстроС Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•: ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ всСх Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•: Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ процСсс "logical replication launcher" (PID 27234) Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π° 1

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•: Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•: Π½Π°Ρ‡Π°Ρ‚Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°: shutdown immediate

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°: записано Π±ΡƒΡ„Π΅Ρ€ΠΎΠ²: 3 (0.0%); Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² WAL 0, ΡƒΠ΄Π°Π»Π΅Π½ΠΎ: 0, ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ: 0; запись=0.001 сСк., синхр.=0.001 сСк., всСго=0.004 сСк.; синхронизировано_Ρ„Π°ΠΉΠ»ΠΎΠ²=2, самая_долгая_синхр.=0.001 сСк., срСдняя=0.001 сСк.; расстояниС=0 kB, оТидалось=0 kB; lsn=9/BC001A30, lsn redo=9/BC001A30

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•: систСма Π‘Π” Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

5) ΠŸΠ΅Ρ€Π΅Π΄ запуском ΠΌΡ‹ Π½Π΅ создали Ρ„Π°ΠΉΠ» standby.signal ΠΈ кластСр запустился с Ρ€ΠΎΠ»ΡŒΡŽ мастСра.

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» standby.signal:

postgres@tantor:~$ touch /var/lib/postgresql/tantor-se-16-replica/data1/standby.signal

Но ΡƒΠΆΠ΅ ΠΏΠΎΠ·Π΄Π½ΠΎ: ΠΏΡ€ΠΈ остановкС Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ создана ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Π°Ρ запись Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2.

Если сСйчас снова Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ экзСмпляр replica1, Ρ‚ΠΎ master Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅ΠΌΡƒ Π² доступС, replica1 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ ΠΊ master Π±Π΅Π· Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈ бСзостановочно ΠΏΠΈΡΠ°Ρ‚ΡŒ сообщСния Π² диагностичСский Π»ΠΎΠ³. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΈΡ… сообщСний:

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° Π³Π»Π°Π²Π½Ρ‹ΠΌ сСрвСром

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠΠ° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2 Π² 9/BC0019E8 достигнут ΠΊΠΎΠ½Π΅Ρ† ΠΆΡƒΡ€Π½Π°Π»Π°.

Π’ΠΠ–ΠΠž:  Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса считывания ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ администратора

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½ΠΎΠ²Π°Ρ линия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 3 ΠΎΡ‚Π²Π΅Ρ‚Π²ΠΈΠ»Π°ΡΡŒ ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… 2 Π΄ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ восстановлСния 9/BC001AC8

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  waiting for WAL to become available at 9/BC001AE2

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ pg_rewind

6) Π”Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres@tantor:~$ pg_rewind -D /var/lib/postgresql/tantor-se-16-replica/data1 --source-server='user=postgres port=5432' -R -P

pg_rewind: ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру установлСно

pg_rewind: ошибка: Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΌ сСрвСрС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ "wal_log_hints = on"

Если ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π½Π΅ Π²Ρ‹Π΄Π°Π»Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° replica1 Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ подсчёт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм (ΠΊΠ°ΠΊ ΠΈ Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… кластСрах) ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ запуску экзСмпляра replica1.

7) Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ подсчСта ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π½Π΅Ρ‚:

postgres@tantor:~$ pg_checksums -D /var/lib/postgresql/tantor-se-16-replica/data1           

pg_checksums: ошибка: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Π² кластСрС Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹

8) Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ подсчёт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм:

postgres@tantor:~$ pg_checksums -e -D /var/lib/postgresql/tantor-se-16-replica/data1

Если ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π²Ρ‹Π΄Π°Π»Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚ΠΈΠΏΠ°:

pg_checksums: ошибка: Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ сСгмСнта 0 Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° "/var/lib/postgresql/tantor-se-16-replica/data1/global/pg_store_plans.stat"

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‚ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пространства присутствуСт Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚Π°ΠΌ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ. Ошибки связанныС с присутствиСм нСизвСстных Ρ„Π°ΠΉΠ»ΠΎΠ² Π² PGDATA Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Ρ„Π°ΠΉΠ» нСизвСстного Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°:

pg_store_plans.c

/* Location of stats file */

#define PGSP_DUMP_FILE        "global/pg_store_plans.stat"

9) Π’ любом случаС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° pg_rewind скопируСт Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с мастСра, поэтому ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅  Ρ„Π°ΠΉΠ» ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π½Π° Π±Π»ΠΎΠΊΠ°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…:

postgres@tantor:~$ rm /var/lib/postgresql/tantor-se-16-replica/data1/global/pg_store_plans.stat

10) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ подсчСта ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм:

postgres@tantor:~$ pg_checksums -e -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°

ΠŸΡ€ΠΎΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²: 1913

ΠŸΡ€ΠΎΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π±Π»ΠΎΠΊΠΎΠ²: 54747

Записано Ρ„Π°ΠΉΠ»ΠΎΠ²: 1563

Записано Π±Π»ΠΎΠΊΠΎΠ²: 54701

pg_checksums: синхронизация ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π΄Π°Π½Π½Ρ‹Ρ…

pg_checksums: модификация ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Π² кластСрС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹

11) ЗапуститС pg_rewind Π΅Ρ‰Ρ‘ Ρ€Π°Π·:

postgres@tantor:~$ pg_rewind -D /var/lib/postgresql/tantor-se-16-replica/data1 --source-server='user=postgres port=5432' -R -P

pg_rewind: ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру установлСно

pg_rewind: сСрвСры Ρ€Π°Π·ΠΎΡˆΠ»ΠΈΡΡŒ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ WAL 9/BC0019E8 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2

pg_rewind: ΠΏΠ΅Ρ€Π΅ΠΌΠΎΡ‚ΠΊΠ° ΠΎΡ‚ послСднСй ΠΎΠ±Ρ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC001950 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 2

pg_rewind: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ списка исходных Ρ„Π°ΠΉΠ»ΠΎΠ²

pg_rewind: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ списка Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²

pg_rewind: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ WAL Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ кластСрС

pg_rewind: трСбуСтся ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 194 ΠœΠ‘ (ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ исходного ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°: 615 ΠœΠ‘)

199097/199097 ΠšΠ‘ (100%) скопировано

pg_rewind: созданиС ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΊΠΎΠΏΠΈΠΈ ΠΈ модификация ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°

pg_rewind: синхронизация Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π΄Π°Π½Π½Ρ‹Ρ…

pg_rewind: Π“ΠΎΡ‚ΠΎΠ²ΠΎ!

МоТно Π»ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ экзСмпляр кластСра? ΠΠ΅Π»ΡŒΠ·Ρ. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° pg_rewind ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»Π° всС Ρ„Π°ΠΉΠ»Ρ‹ с мастСром, Π² Ρ‚ΠΎΠΌ числС Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΠ½ΠΈ содСрТат настройки мастСра.

Π”ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_rewind ΡΡ‚ΠΎΠΈΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅ΠΆΠ°Ρ‚ Π² PGDATA.

12) ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» posgresql.auto.conf, привСдя Π΅Π³ΠΎ ΠΊ Ρ‚Π°ΠΊΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ:

postgres@tantor:~$ cat /var/lib/postgresql/tantor-se-16-replica/data1/postgresql.auto.conf

# Do not edit this file manually!

# It will be overwritten by the ALTER SYSTEM command.

listen_addresses = '*'

max_slot_wal_keep_size = '128MB'

max_wal_size = '128MB'

min_wal_size = '512MB'

idle_in_transaction_session_timeout = '100min'

cluster_name = 'replica1'

primary_slot_name = 'replica1'

logging_collector = 'off'

hot_standby_feedback = 'on'

primary_conninfo = 'user=postgres port=5432'

wal_retrieve_retry_interval = '30s'

port = 5433

13) ЗапуститС экзСмпляр replica1:

postgres@tantor:~$ pg_ctl start -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ запуска сСрвСра....

[18861] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

[18861] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv4 "0.0.0.0" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

[18861] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ адрСсу IPv6 "::" ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΠΎΡ€Ρ‚ 5433

[18861] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π΄Π»Ρ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Unix-сокСт "/var/run/postgresql/.s.PGSQL.5433"

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ€Π°Π±ΠΎΡ‚Π° систСмы Π‘Π” Π±Ρ‹Π»Π° ΠΏΡ€Π΅Ρ€Π²Π°Π½Π° Π² процСссС восстановлСния, врСмя Π² ΠΆΡƒΡ€Π½Π°Π»Π΅:

[18864] ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π•ΡΠ»ΠΈ это происходит постоянно, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π±Ρ‹Π»ΠΈ испорчСны ΠΈ для восстановлСния стоит Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΡŽΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ.

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ сСрвСра

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΠΈΡΡŒ REDO начинаСтся со смСщСния 9/BC0019E8

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС восстановлСния достигнуто Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC001D48

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC001D48: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

[18861] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅"

[18865] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ сСрвСра, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC000000 Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 3

 Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр Π·Π°ΠΏΡƒΡ‰Π΅Π½

14) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ статистику Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° мастСрС:

postgres@tantor:~$ psql

postgres=# select * from pg_stat_replication \gx

-[ RECORD 1 ]----+------------------------------

pid              | 23531

usesysid         | 10

usename          | postgres

application_name | replica2

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 12:32:18.89956+03

backend_xmin     |

state            | streaming

sent_lsn         | 9/BC001D48

write_lsn        | 9/BC001D48

flush_lsn        | 9/BC001D48

replay_lsn       | 9/BC001D48

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 13:17:04.270387+03

-[ RECORD 2 ]----+------------------------------

pid              | 18866

usesysid         | 10

usename          | postgres

application_name | replica1

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 13:13:42.353704+03

backend_xmin     |

state            | streaming

sent_lsn         | 9/BC001D48

write_lsn        | 9/BC001D48

flush_lsn        | 9/BC001D48

replay_lsn       | 9/BC001D48

write_lag        |

flush_lag        |

replay_lag       |

sync_priority    | 0

sync_state       | async

reply_time       | 13:17:02.430073+03

ОбС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π½Π°ΠΊΠ°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡ….

НапоминаниС: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° replica1. ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ связь (hot_standby_feedback = 'on') Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π½Π° master ΠΈ replica1.


ЛогичСская рСпликация

  1. РСпликация Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
  2. РСпликация Π±Π΅Π· ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°
  3. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ
  4. ДвунаправлСнная рСпликация

Π§Π°ΡΡ‚ΡŒ 1. РСпликация Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

1) ΠŸΠΎΠ²Ρ‹ΡΡŒΡ‚Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 5433 Π΄ΠΎ мастСра:

postgres@tantor:~$ psql -p 5433 -c "select pg_promote()"

 pg_promote

------------

 t

(1 строка)

БСйчас Π΄Π²Π° мастСра Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ… 5432 ΠΈ 5433. Π£ мастСра Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 5432 Π΅ΡΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 5434.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сообщСний Π² Π»ΠΎΠ³Π΅ ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ запрос ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ статуса

[9445] Π’ΠΠ–ΠΠž:  Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса считывания ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ администратора

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π΅Π²Π΅Ρ€Π½Π°Ρ Π΄Π»ΠΈΠ½Π° записи Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 9/BC09D2D0: оТидалось ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 26, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ 0

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΠΈΡΠΈ REDO ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Π΄ΠΎ смСщСния 9/BC09D288, Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° систСмы: CPU: пользов.: 0.09 с, систСма: 0.11 с, ΠΏΡ€ΠΎΡˆΠ»ΠΎ: 17564.43 с

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½Π°Ρ транзакция Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π² 18:03:37.805708+03

[18864

5) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ строки добавились:

] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ID Π½ΠΎΠ²ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: 4

[18864] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ

[18862] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡Π°Ρ‚Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°: force

[18861] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

[18862] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°: записано Π±ΡƒΡ„Π΅Ρ€ΠΎΠ²: 7 (0.0%); Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² WAL 0, ΡƒΠ΄Π°Π»Π΅Π½ΠΎ: 0, ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ: 0; запись=0.504 сСк., синхр.=0.004 сСк., всСго=0.510 сСк.; синхронизировано_Ρ„Π°ΠΉΠ»ΠΎΠ²=7, самая_долгая_синхр.=0.002 сСк., срСдняя=0.001 сСк.; расстояниС=29 kB, оТидалось=159 kB; lsn=9/BC09D3C8, lsn redo=9/BC09D338

2) Π£Π΄Π°Π»ΠΈΡ‚Π΅ слот Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ replica1 Π² кластСрС master (ΠΏΠΎΡ€Ρ‚ 5432) ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовался replica1 (ΠΏΠΎΡ€Ρ‚ 5433) ΠΈ ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ΅Π½:

psql -p 5432 -c "select slot_name, slot_type, active, restart_lsn, wal_status from pg_replication_slots"

 slot_name | slot_type | active | restart_lsn | wal_status

-----------+-----------+--------+-------------+------------

 replica1  | physical  | f      | 9/BC09D2D0  | reserved

 replica2  | physical  | t      | 9/BC09D3F8  | reserved

(2 строки)

psql -p 5432 -c "select pg_drop_replication_slot('replica1')"

 pg_drop_replication_slot

--------------------------

 

(1 строка)

psql -p 5432 -c "select slot_name, slot_type, active, restart_lsn, wal_status from pg_replication_slots"

 slot_name | slot_type | active | restart_lsn | wal_status

-----------+-----------+--------+-------------+------------

 replica2  | physical  | t      | 9/BC09D3F8  | reserved

(1 строка)

На replica2 Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… слота Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

psql -p 5434 -c "select slot_name, slot_type, active, restart_lsn, wal_status from pg_replication_slots"

 slot_name | slot_type | active | restart_lsn | wal_status

-----------+-----------+--------+-------------+------------

 master    | physical  | f      |             |

 replica1  | physical  | f      |             |

(2 строки)

3) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π±Π°Π·Π΅ postgres Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 5432 Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°:

 psql -p 5432 -c "SELECT relnamespace::regnamespace||'.'||relname "table"

 FROM pg_class

 WHERE relreplident IN ('d','n') -- d ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, n Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅

  AND relkind IN ('r','p') -- r Ρ‚Π°Π±Π»ΠΈΡ†Π°, p сСкционированная

  AND oid NOT IN (SELECT indrelid FROM pg_index WHERE indisprimary)

  AND relnamespace <> 'pg_catalog'::regnamespace

  AND relnamespace <> 'information_schema'::regnamespace

ORDER BY 1"

  table  

----------

 public.demo2

 public.hypo

 utl_file.utl_file_dir

(3 строки)

4) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ demo2, t Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚:

psql -p 5432 -c "drop table if exists t"

NOTICE:  table "t" does not exist, skipping

DROP TABLE

psql -p 5432 -c "drop table if exists demo2"

DROP TABLE

5) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ строку:

psql -p 5432 -c "create table t (id bigserial PRIMARY KEY, t text)"

CREATE TABLE

psql -p 5432 -c "insert into t (t) values ('a')"

INSERT 0 1

6) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹-ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° Π² Π±Π°Π·Π΅ postgres ΠΊΠ»Π°ΡΡ‚Π΅Ρ€Π° Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 5433:

pg_dump -t t --schema-only --clean --if-exists | psql -p 5433

Π­Ρ‚ΠΎΡ‚ шаг ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, структуру Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ измСнСния Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅ логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π΅Ρ‚ автоматичСского создания Ρ‚Π°Π±Π»ΠΈΡ†. Имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ столбцы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ названия. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ столбцов Π½Π΅ Π²Π°ΠΆΠ΅Π½, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ столбцы, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ мСшало Π±Ρ‹ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ строки. ΠŸΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΠΈΠ΅ для вставки строк: Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ограничСния цСлостности NOT NULL Π² отсутствиС значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ DEFAULT.

7) УстановитС wal_level=logical Π½Π° всСх кластСрах;

установитС hot_standby_feedback=on Π½Π° replica2, ΠΎΠ½ Π½Π΅ Π±Ρ‹Π» установлСн Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ для логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ опрСдСлСния ΠΈ Π½Π°Π±ΠΎΡ€Π° Ρ‚Π°Π±Π»ΠΈΡ† Π² ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ мСняСт строки Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… систСмного ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранят Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ свойствах Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†) ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ошибки "Π­Ρ‚ΠΎΡ‚ слот Π±Ρ‹Π» Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠ·-Π·Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° с восстановлСниСм".

УстановитС checkpoint_timeout='30min', Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ рСстарат (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π· Π² 5 ΠΌΠΈΠ½ΡƒΡ‚) Π½Π΅ писали сообщСния Π² Π»ΠΎΠ³ΠΈ кластСров затрудняя Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ сообщСний логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

psql -p 5432 -c "ALTER SYSTEM SET wal_level=logical"

psql -p 5433 -c "ALTER SYSTEM SET wal_level=logical"

psql -p 5434 -c "ALTER SYSTEM SET wal_level=logical"

psql -p 5434 -c "ALTER SYSTEM SET hot_standby_feedback=on"

psql -p 5432 -c "alter system set checkpoint_timeout='30min'"

psql -p 5433 -c "alter system set checkpoint_timeout='30min'"

psql -p 5434 -c "alter system set checkpoint_timeout='30min'"

ИзмСнСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° wal_level Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ рСстарта экзСмпляров. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² этом:

psql -p 5432 -c "select pg_reload_conf()"

 pg_reload_conf

----------------

 t

(1 строка)

psql -p 5432 -c "select * from pg_settings where name = 'wal_level'" -x

-[ RECORD 1 ]---+--------------------------------------------------

name            | wal_level

setting         | replica

unit            |

category        | Write-Ahead Log / Settings

short_desc      | Sets the level of information written to the WAL.

extra_desc      |

context         | postmaster

vartype         | enum

source          | default

min_val         |

max_val         |

enumvals        | {minimal,replica,logical}

boot_val        | replica

reset_val       | replica

sourcefile      |

sourceline      |

pending_restart | t

8) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΈ запуститС экзСмпляры Π² ΠΎΠΊΠ½Π΅ (ΠΎΠΊΠ½Π°Ρ…) Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…) Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ диагностичСскиС сообщСния:

pg_ctl stop -D /var/lib/postgresql/tantor-se-16-replica/data2

pg_ctl stop -D /var/lib/postgresql/tantor-se-16-replica/data1

pg_ctl stop -D /var/lib/postgresql/tantor-se-16/data

pg_ctl start -D /var/lib/postgresql/tantor-se-16/data

pg_ctl start -D /var/lib/postgresql/tantor-se-16-replica/data1

pg_ctl start -D /var/lib/postgresql/tantor-se-16-replica/data2

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΠΊΠΎΠ½ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ экзСмпляра ΠΊΠ°ΠΊΠΈΠ΅ сообщСния выводятся. Π’ ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° слоТно ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ сообщСния ΠΎΡ‚ Ρ€Π°Π·Π½Ρ‹Ρ… экзСмпляров. Π’Ρ€ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ, Π° Π½Π΅ ΠΎΠΊΠ½Π°. Для открытия Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π² Π²ΠΈΠ΄Π΅ Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π² мСню Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° File -> New ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl+t>:

Бсылки для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (1 2 3) находятся слСва Π²Π½ΠΈΠ·Ρƒ ΠΎΠΊΠ½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°:

9) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ t:

psql -p 5432 -c "CREATE PUBLICATION t for TABLE t"

CREATE PUBLICATION

10) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ подписку Π½Π° replica1 ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΡƒΡŽΡΡ ΠΊ Ρ„изичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ replica2. ПодсоСдинСниС ΠΊ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ услоТняСт Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡŽ, Π½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° мастСр. Имя подписки опрСдСляСт ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ имя логичСского слота Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²ΠΎ всСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

psql -p 5433 -c "CREATE SUBSCRIPTION sub1 CONNECTION 'dbname=postgres port=5434 user=postgres' PUBLICATION t WITH (origin=none)"

Если Π±Ρ‹ подписка подсоСдинялась Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊ мастСру, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ‹Π΄Π°Π»Π° Π±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сразу. Π£ нас подписка подсоСдинСна ΠΊ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° создания подписки подвиснСт. Π§Π΅Ρ€Π΅Π· 15-17 сСкунд ΠΊΠΎΠΌΠ°Π½Π΄Π° отвиснСт ΠΈ выдаст ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•:  Π½Π° сСрвСрС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ создан слот Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "sub1"

CREATE SUBSCRIPTION

Если ΠΊΠΎΠΌΠ°Π½Π΄Π° создания подписки висит большС 20 сСкунд, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ активности Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… ΠΈ сСрвСрных процСссов Π½Π° мастСрС Π½Π΅Ρ‚, Π² этом случаС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡƒΠ½ΠΊΡ‚ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ. ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π° мастСрС ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ создания подписок ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ синхронизации Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π΄ΠΎ ~20 сСкунд.

11) Если ΠΊΠΎΠΌΠ°Π½Π΄Π° создания подписки висит ΠΈ Π½Π΅ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‚ΠΎ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

psql -p 5432 -c "select pg_log_standby_snapshot()"

 pg_log_standby_snapshot

-------------------------

 9/BC0D9C58

(1 строка)

Π’ Π»ΠΎΠ³Π΅ кластСров Π²ΠΈΠ΄Π½Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°:

[12447] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ логичСского дСкодирования достиг Ρ‚ΠΎΡ‡ΠΊΠΈ согласованности Π² 9/BC0D9C10

[12447] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅Ρ‚.

ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  CREATE_REPLICATION_SLOT "sub1" LOGICAL pgoutput (SNAPSHOT 'nothing')

[12551] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ процСсс логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для подписки "sub1"

[12552] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ся логичСскоС Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для слота "sub1"

[12552] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, фиксируСмых послС 9/BC0D9C58, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ WAL с 9/BC0D9C10.

[12552] ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  START_REPLICATION SLOT "sub1" LOGICAL 0/0 (proto_version '4', origin 'none', publication_names '"t"')

ПослС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сообщСния ΠΊΠΎΠΌΠ°Π½Π΄Π° создания подписки выдаст Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

[12552] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ логичСского дСкодирования достиг Ρ‚ΠΎΡ‡ΠΊΠΈ согласованности Π² 9/BC0D9C10

[12552] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅Ρ‚.

[12552] ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  START_REPLICATION SLOT "sub1" LOGICAL 0/0 (proto_version '4', origin 'none', publication_names '"t"')

[12553] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ синхронизации Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈ логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для подписки "sub1", Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "t" Π·Π°ΠΏΡƒΡ‰Π΅Π½

ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ 12551 ΠΈ 12553 - это процСссы replica1.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ процСссы - это процСссы replica2.

12) ΠŸΡ€ΠΎΡ†Π΅ΡΡ синхронизации запустился, Π½ΠΎ Π² отсутствиС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π° мастСрС Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΈ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ синхронизации. Для ускорСния синхронизации Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pg_log_standby_snapshot() Π½Π° мастСрС Π΅Ρ‰Ρ‘ Ρ€Π°Π·, Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ 13 ΠΏΡƒΠ½ΠΊΡ‚Ρƒ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся транзакция Π½Π° мастСрС:

psql -p 5433 -c "select * from  t"

 id | t

----+---

(0 строк)

psql -p 5432 -c "select pg_log_standby_snapshot()"

 pg_log_standby_snapshot

-------------------------

 9/BC1CADE0

(1 строка)

ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя послС появлСния любой Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π° мастСрС ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΠΎΠΉ записи Π½Π° Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ) появится сообщСниС:

[12601] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ синхронизации Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈ логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для подписки "sub1", Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "t" Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ

Π’ Π»ΠΎΠ³Π΅ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ появятся сообщСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ слот достиг Ρ‚ΠΎΡ‡ΠΊΠΈ согласованности ΠΈ Π³ΠΎΡ‚ΠΎΠ² ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅:

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ логичСского дСкодирования достиг Ρ‚ΠΎΡ‡ΠΊΠΈ согласованности Π² 9/BC263F10

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅Ρ‚.

ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  CREATE_REPLICATION_SLOT "pg_43351_sync_43342_7353194261070147214" LOGICAL pgoutput (SNAPSHOT 'use')

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ся логичСскоС Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для слота "pg_43351_sync_43342_7353194261070147214"

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, фиксируСмых послС 9/BC263F58, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ WAL с 9/BC263E48.

ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  START_REPLICATION SLOT "pg_43351_sync_43342_7353194261070147214" LOGICAL 9/BC263F58 (proto_version '4', origin 'none', publication_names '"t"')

psql -p 5433 -c "select * from  t"

 id | t

----+---

  1 | a

(1 строка)

13) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ рСпликация ΠΈΠ΄Ρ‘Ρ‚:

psql  -p 5432 -c "INSERT INTO t (t) VALUES ('b')"

INSERT 0 1

psql -p 5433 -c "select * from t"

 id | t

----+---

  1 | a

  2 | b

(2 rows)

Вставили Π² мастСр Π²Ρ‚ΠΎΡ€ΡƒΡŽ строку, подписка подсоСдинСнная ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° эту строку с физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΊ этой части ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ: Π΄Π°Π»Π΅Π΅ приводится список ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ созданиС подписки (начиная с ΠΏΡƒΠ½ΠΊΡ‚Π° 4 Π΄ΠΎ 12 ΠΏΡƒΠ½ΠΊΡ‚Π°):

psql -p 5432 -c "checkpoint"

psql -p 5433 -c "drop SUBSCRIPTION sub1"

psql -p 5432 -c "drop PUBLICATION t"

psql -p 5432 -c "select pg_log_standby_snapshot()"

psql -p 5432 -c "drop table t"

psql -p 5432 -c "create table t (id bigserial PRIMARY KEY, t text)"

psql -p 5432 -c "insert into t (t) values ('a')"

pg_dump -t t --schema-only --clean --if-exists | psql -p 5433 > /dev/null

psql -p 5432 -c "CREATE PUBLICATION t for TABLE t"

psql -p 5433 -c "CREATE SUBSCRIPTION sub1 CONNECTION 'dbname=postgres port=5434 user=postgres' PUBLICATION t WITH (origin=none)"

psql -p 5433 -c "select * from  t"

psql -p 5432 -c "INSERT INTO t (t) VALUES ('b')"

psql -p 5433 -c "select * from  t"

Π§Π°ΡΡ‚ΡŒ 2. РСпликация Π±Π΅Π· ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°

1) Π£Π΄Π°Π»ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ t Π½Π° источникС (ΠΏΠΎΡ€Ρ‚ 5432):

psql -c "ALTER TABLE t DROP CONSTRAINT t_pkey"

ALTER TABLE

МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ цСлостности ΠΈ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π΅-ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊΠ΅, Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ этого Π΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ·ΠΆΠ΅ снова Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡.

Если Π½Π° источникС Π½Π΅ Π²Π½ΠΎΡΠΈΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ строки, Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ цСлостности сСбя Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒ. Если внСсти Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ Π² столбцС ID, Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ записСй Π² подпискС приостановится.

psql -c "\d t"

                                    Π’Π°Π±Π»ΠΈΡ†Π° "public.t"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |  Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL |         По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ          

---------+--------+--------------------+-------------------+-------------------------------

 id      | bigint |                    | not null          | nextval('t_id_seq'::regclass)

 t       | text   |                    |                   |

ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

    "t"

psql -p 5433 -c "\d t"

                                    Π’Π°Π±Π»ΠΈΡ†Π° "public.t"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |  Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL |         По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ          

---------+--------+--------------------+-------------------+-------------------------------

 id      | bigint |                    | not null          | nextval('t_id_seq'::regclass)

 t       | text   |                    |                   |

Π˜Π½Π΄Π΅ΠΊΡΡ‹:

    "t_pkey" PRIMARY KEY, btree (id)

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π»Ρ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ значСния столбца id ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ цСлостности NOT NULL ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ ΠΈ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΎΠ±Π΅ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ….

2) ΠšΠ»ΡŽΡ‡Π° Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½Π΅Ρ‚. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ вставки строк Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ строку Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ t:

psql -c "INSERT INTO t (t) VALUES ('b')"

INSERT 0 1

3) ОбновлСния ΠΈ удалСния Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π”Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ обновлСния ΠΈ удалСния строки ΠΈ посмотритС какая ошибка выдаётся:

psql -c "update t set t='c' where id=2"

ΠžΠ¨Π˜Π‘ΠšΠ:  ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ "t" Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΉ отсутствуСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, Π½ΠΎ ΠΎΠ½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ измСнСния

ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π§Ρ‚ΠΎΠ±Ρ‹ эта Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, установитС REPLICA IDENTITY, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ALTER TABLE.

psql -c "delete from t where id=2"

ΠžΠ¨Π˜Π‘ΠšΠ:  ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "t" Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΉ отсутствуСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, Π½ΠΎ ΠΎΠ½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ удалСния

ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π§Ρ‚ΠΎΠ±Ρ‹ эта Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅, установитС REPLICA IDENTITY, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ALTER TABLE.

4) УстановитС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ строк всС столбцы:

psql -c "ALTER TABLE t REPLICA IDENTITY FULL"

ALTER TABLE

5) ОбновлСния ΠΈ удалСния Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

psql -c "update t set t='c' where id=3"

UPDATE 1

psql -c "delete from t where id=3"

DELETE 1

psql -p 5432 -c "select * from  t"

 id | t

----+---

  1 | a

  2 | b

(2 строки)

psql -p 5433 -c "select * from  t"

 id | t

----+---

  1 | a

  2 | b

(2 строки)

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ вставки ΠΈ удалСния Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

ИспользованиС REPLICA IDENTITY FULL Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π° источникС UPDATE ΠΈ DELETE Ρ‡Π΅Ρ€Π΅Π· ΠΆΡƒΡ€Π½Π°Π» ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ значСния всСх столбцов, Π° это ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. Если фактичСски ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки ΠΏΠΎ нСскольким столбцам, Ρ‚ΠΎ стоит ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° - ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°.

6) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ способ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ строк Π² NOTHING.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

psql -c "ALTER TABLE t REPLICA IDENTITY NOTHING"

ALTER TABLE

7) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ обновлСния строки:

psql -c "update t set t='c' where id =2"

ΠžΠ¨Π˜Π‘ΠšΠ:  ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ "t" Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΉ отсутствуСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, Π½ΠΎ ΠΎΠ½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ измСнСния

ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π§Ρ‚ΠΎΠ±Ρ‹ эта Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, установитС REPLICA IDENTITY, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ALTER TABLE.

Ошибка такая ΠΆΠ΅, ΠΊΠ°ΠΊ Π±Ρ‹Π»Π° ΠΏΡ€Π΅ΠΆΠ΄Π΅: Π½Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° для опубликования обновлСния ΠΈΠ»ΠΈ удалСния.

8) Ни Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°, Π½ΠΈ REFRESH, Π½ΠΈ DISABLE ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π½Π΅ устранят ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡƒΠ½ΠΊΡ‚Π°Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ это.

ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡƒ:

psql  -p 5433 -c "ALTER SUBSCRIPTION sub1 DISABLE"

ALTER SUBSCRIPTION

9) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ статус подписки ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ psql \dRs:

psql  -p 5433 -c "\dRs"

            Бписок подписок

 Π˜ΠΌΡ  | Π’Π»Π°Π΄Π΅Π»Π΅Ρ† | Π’ΠΊΠ»ΡŽΡ‡Ρ‘Π½ | ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ

------+----------+---------+------------

 sub1 | postgres | f       | {t}

(1 строка)

10) На источникС ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ строку:

psql -c "update t set t='c' where id =2"

ΠžΠ¨Π˜Π‘ΠšΠ:  ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ "t" Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΉ отсутствуСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, Π½ΠΎ ΠΎΠ½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ измСнСния

ΠŸΠžΠ”Π‘ΠšΠΠ—ΠšΠ:  Π§Ρ‚ΠΎΠ±Ρ‹ эта Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, установитС REPLICA IDENTITY, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ALTER TABLE.

ОбновлСниС Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚, Ρ…ΠΎΡ‚ΡŒ подписка ΠΈ приостановлСна.

11) Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ строку Π½Π° источникС:

psql -c "INSERT INTO t (t) VALUES ('c')"

INSERT 0 1

12) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ΅ строка Π½Π΅ появилась:

psql  -p 5433 -c "select * from t"

 id | t

----+---

  1 | a

  2 | b

(2 строки)

13) Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡƒ:

psql  -p 5433 -c "ALTER SUBSCRIPTION sub1 ENABLE"

ALTER SUBSCRIPTION

14) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ΅ строка ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡŒ:

psql  -p 5433 -c "select * from t"

 id | t

----+---

  1 | a

  2 | b

  4 | с

(3 строки)

ПослС приостановки подписки (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² статус DISABLE) ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡŒ. ПослС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² статус ENABLE) Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Π΅ измСнСния Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹.

15) Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡:

psql -c "ALTER TABLE t ADD CONSTRAINT t_key PRIMARY KEY (id)"

ALTER TABLE

Но Π΅Π³ΠΎ наличия Π½Π΅ достаточно. НуТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ использовался, ΠΊΠ°ΠΊ REPLICA IDENTITY, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄ΠΎ этого ΠΌΡ‹ устанавливали REPLICA IDENTITY NOTHING.

16) Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ использованиС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² качСствС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ установитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

psql -c "ALTER TABLE t REPLICA IDENTITY DEFAULT"

ALTER TABLE

17) Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ строки Π½Π΅ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ошибки ΠΈ рСпликация ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚:

psql -c "update t set t='d' where id =4"

UPDATE 1

psql  -p 5433 -c "select * from t"

 id | t

----+---

  1 | a

  2 | b

  4 | d

(3 строки)

Π§Π°ΡΡ‚ΡŒ 3. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ

1) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ:

psql -c "CREATE TABLE t1 AS SELECT * FROM t"

SELECT 3

psql -c "ALTER TABLE t1 ADD CONSTRAINT t1_key PRIMARY KEY (id)"

ALTER TABLE

psql -c "\d t1"

                           Π’Π°Π±Π»ΠΈΡ†Π° "public.t1"

 Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† |  Π’ΠΈΠΏ   | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ сортировки | Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ NULL | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

---------+--------+--------------------+-------------------+--------------

 id      | bigint |                    | not null          |

 t       | text   |                    |                   |

Π˜Π½Π΄Π΅ΠΊΡΡ‹:

    "t1_key" PRIMARY KEY, btree (id)

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ t Π°Π²Ρ‚ΠΎΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ столбца ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅Ρ‚.

Π’ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… подписки Ρ‚Π°Π±Π»ΠΈΡ†Π° Π½Π΅ создана, Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ список ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ psql:

psql -c "\dRp"

                                       Π‘писок ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ

Имя|Π’Π»Π°Π΄Π΅Π»Π΅Ρ†|ВсС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹|ДобавлСния|ИзмСнСния|УдалСния|ΠžΠΏΡƒΡΡ‚ΠΎΡˆΠ΅Π½ΠΈΡ|Π§Π΅Ρ€Π΅Π· ΠΊΠΎΡ€Π΅Π½ΡŒ

---+--------+-----------+----------+---------+--------+-----------+------------

t  |postgres|f          |t         |t        |t       |t          |f

(1 строка)

Π Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ insert, update, delete, truncate.

3) Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

psql -c "ALTER PUBLICATION t ADD TABLE t1"

ALTER PUBLICATION

Ошибок Π² Π»ΠΎΠ³Π΅ кластСров Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π΅ выполняли Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pg_log_standby_snapshot()". Они появятся послС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ вставки строки Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅.

4) Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ строку Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ t1:

psql -c "INSERT INTO t1 VALUES (5, 'e')"

INSERT 0 1

Π’ Π»ΠΎΠ³Π΅ подписчика replica1:

ΠžΠ¨Π˜Π‘ΠšΠ:  Ρ†Π΅Π»Π΅Π²ΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "public.t1" Π½Π΅ сущСствуСт

ΠšΠžΠΠ’Π•ΠšΠ‘Π’:  processing remote data for replication origin "pg_43450" during message type "INSERT" in transaction 17768, finished at 9/BC3D92F0

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ процСсс "logical replication worker" (PID 17622) Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π° 1

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ процСсс логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для подписки "sub1"

Ошибка ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ logical replication worker Π½Π΅ смог Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вставку строки ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ отсутствия Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ t1 Π½Π° подписчикС.

Π’ Π»ΠΎΠ³Π΅ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ replica2:

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  9/BC3CD550 has been already streamed, forwarding to 9/BC3D9240

ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  START_REPLICATION SLOT "sub1" LOGICAL 9/BC3CD550 (proto_version '4', origin 'none', publication_names '"t"')

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ся логичСскоС Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для слота "sub1"

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, фиксируСмых послС 9/BC3D9240, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ WAL с 9/BC3D9088.

ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  START_REPLICATION SLOT "sub1" LOGICAL 9/BC3CD550 (proto_version '4', origin 'none', publication_names '"t"')

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ логичСского дСкодирования достиг Ρ‚ΠΎΡ‡ΠΊΠΈ согласованности Π² 9/BC3D9088

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅Ρ‚.

5) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ структуру Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π±Π°Π·Π΅-ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ΅:

pg_dump -t t1 --schema-only --clean --if-exists | psql -p 5433

ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ошибки Π² Π»ΠΎΠ³ кластСров пСрСстали Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ, Π½ΠΎ строк Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ подписки ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚:

psql -p 5433 -c "select * from t1"

 id | t

----+---

(0 строк)

6) Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ строку Π½Π° источникС:

psql -c "INSERT INTO t1 VALUES (6, 'f')"

INSERT 0 1

7) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ строка Π½Π° подписчикС Π½Π΅ появится:

psql -p 5433 -c "select * from t1"

 id | t

----+---

(0 строк)

8) На подписчикС строки Π½Π΅ появятся ΠΏΠΎΠΊΠ° подписка Π½Π΅ обновится. ΠŸΡ€ΠΈ этом ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌ Π² подпискС рСпликация Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ:

psql -c "INSERT INTO t (t) VALUES ('e')"

psql -p 5433 -c "select * from t"

 id | t

----+---

  1 | a

  3 | b

  4 | d

  5 | e

(4 строки)

7) ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Π½Π° подписчикС подписку:

psql  -p 5433 -c "ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION"

ALTER SUBSCRIPTION

psql  -p 5433 -c "select * from t1"

 id | t

----+---

(0 строк)

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ появились.

Π§Π΅Ρ€Π΅Π· ΠΊΠ°ΠΊΠΎΠ΅ врСмя появятся строки, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ выполнится Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ синхронизация ΠΈ примСнятся измСнСния?

ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ. Если Π±Ρ‹ подписчик подсоСдинился ΠΊ мастСру Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Ρ‚ΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ.

Π›ΠΈΠ±ΠΎ послС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° мастСрС, Π»ΠΈΠ±ΠΎ послС Π²Ρ‹Π·ΠΎΠ²Π° Π½Π° источникС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pg_log_standby_snapshot().

8) Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° источникС:

psql -c "select pg_log_standby_snapshot()"

 pg_log_standby_snapshot

-------------------------

 9/BC3D9938

(1 строка)

9) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ строки Π½Π° подписчикС появились:

psql  -p 5433 -c "select * from t1"

 id | t

----+---

  1 | a

  2 | b

  4 | d

  5 | e

  6 | f

(5 строк)

Π’ Π»ΠΎΠ³Π΅ подписчика:

13:21:11.024 MSK [29400] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ синхронизации Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈ логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для подписки "sub1", Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "t1" Π·Π°ΠΏΡƒΡ‰Π΅Π½

13:22:14.121 MSK [29400] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ синхронизации Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈ логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для подписки "sub1", Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ "t1" Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ

Π’ Π»ΠΎΠ³Π΅ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

13:22:14.101 MSK [29401] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ логичСского дСкодирования достиг Ρ‚ΠΎΡ‡ΠΊΠΈ согласованности Π² 9/BC3D98F0

13:22:14.101 MSK [29401] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅Ρ‚.

13:22:14.101 MSK [29401] ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  CREATE_REPLICATION_SLOT "pg_43450_sync_43451_7353194261070147214" LOGICAL pgoutput (SNAPSHOT 'use')

13:22:14.118 MSK [29401] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ся логичСскоС Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для слота "pg_43450_sync_43451_7353194261070147214"

13:22:14.118 MSK [29401] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, фиксируСмых послС 9/BC3D9938, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ WAL с 9/BC3D98F0.

13:22:14.118 MSK [29401] ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  START_REPLICATION SLOT "pg_43450_sync_43451_7353194261070147214" LOGICAL 9/BC3D9938 (proto_version '4', origin 'none', publication_names '"t"')

table synchronization worker синхронизировал (ΠΏΠ΅Ρ€Π΅Π΄Π°Π» строки) Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ΅ с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Π½Π° источникС.

Π’Π°ΠΆΠ½Ρ‹ΠΌ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ начинаСтся Π·Π°Ρ…Π²Π°Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ послС обновлСния подписки Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ «бСсшовно» (Π½Π΅ блокируя доступ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½Π° источникС) Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° синхронизация строк Ρ‚Π°Π±Π»ΠΈΡ†.

10) ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚Π΅ строки Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ t1 Π½Π° источникС:

psql -c "TRUNCATE t1"

TRUNCATE TABLE

Π§Π°ΡΡ‚ΡŒ 4. ДвунаправлСнная рСпликация

1) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ для Ρ‚Π°Π±Π»ΠΈΡ† t, t1:

psql -p 5433 -c "CREATE PUBLICATION t for TABLE t, t1;"

2) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ подписку. Имя подписки опрСдСляСт ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ имя логичСского слота Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²ΠΎ всСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ имя sub2.

НСльзя Ρ‡Ρ‚ΠΎΠ±Ρ‹ слот ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π» Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ синхронизированы, поэтому Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ copy_data=off.

НСльзя Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ зацикливания, поэтому origin=none:

psql -p 5432 -c "CREATE SUBSCRIPTION sub2 CONNECTION 'dbname=postgres port=5433 user=postgres' PUBLICATION t WITH (origin=none, copy_data=off)"

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•:  Π½Π° сСрвСрС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ создан слот Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "sub2"

CREATE SUBSCRIPTION

Π’ Π»ΠΎΠ³Π΅ Π½Π° 5432:

13:37:12.419 MSK [3882] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ процСсс логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для подписки "sub2"

Π’ Π»ΠΎΠ³Π΅ Π½Π° 5433:

13:37:12.410 MSK [3881] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ логичСского дСкодирования достиг Ρ‚ΠΎΡ‡ΠΊΠΈ согласованности Π² 9/BC3E3E88

13:37:12.410 MSK [3881] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅Ρ‚.

13:37:12.410 MSK [3881] ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  CREATE_REPLICATION_SLOT "sub2" LOGICAL pgoutput (SNAPSHOT 'nothing')

13:37:12.424 MSK [3883] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ся логичСскоС Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для слота "sub2"

13:37:12.424 MSK [3883] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, фиксируСмых послС 9/BC3E3ED0, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ WAL с 9/BC3E3E88.

13:37:12.424 MSK [3883] ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  START_REPLICATION SLOT "sub2" LOGICAL 0/0 (proto_version '4', origin 'none', publication_names '"t"')

13:37:12.424 MSK [3883] Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΠΏΡ€ΠΎΡ†Π΅ΡΡ логичСского дСкодирования достиг Ρ‚ΠΎΡ‡ΠΊΠΈ согласованности Π² 9/BC3E3E88

13:37:12.424 MSK [3883] ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π΅Ρ‚.

13:37:12.424 MSK [3883] ΠžΠŸΠ•Π ΠΠ’ΠžΠ :  START_REPLICATION SLOT "sub2" LOGICAL 0/0 (proto_version '4', origin 'none', publication_names '"t"')

Команда создания Π½Π΅ подвиснСт, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ источник ΠΈ подписчик находятся Π² Ρ€Π°Π·Π½Ρ‹Ρ… кластСрах ΠΈ подписка подсоСдиняСтся ΠΊ мастСру, Π° Π½Π΅ ΠΊ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅.

ПодвисаниС ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… источника ΠΈ подписчика находятся Π² ΠΎΠ΄Π½ΠΎΠΌ кластСрС.

Для продолТСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° источникС (5433) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pg_log_standby_snapshot().

4) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ рСпликация ΠΈΠ΄Ρ‘Ρ‚ Π² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ созданном Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ:

psql -p 5433 -c "INSERT INTO t (t) VALUES ('f')"

ΠžΠ¨Π˜Π‘ΠšΠ:  ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π΅ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ "t_pkey"

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  ΠšΠ»ΡŽΡ‡ "(id)=(1)" ΡƒΠΆΠ΅ сущСствуСт.

Π’ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° - использованиС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² столбцС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. Бостояния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π½Π΅ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π½Π° 5433 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сгСнСрировала Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1.

4) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ значСния Π²Ρ‹Π΄Π°ΡŽΡ‚ Π΄Π²Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² Π΄Π²ΡƒΡ… Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…:

psql -p 5433 -c "select nextval('t_id_seq')"

 nextval

---------

       2

(1 row)

psql -p 5432 -c "select nextval('t_id_seq')"

 nextval

---------

       6

(1 row)

5) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠ°ΠΊΠΎΠ΅ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΅ΡΡ‚ΡŒ Π² столбцС Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

psql -p 5433 -c "select max(id) from t"

 max

-----

   5

(1 строка)

6) Для устранСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ установим Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·Π΅ Π²Ρ‹Π΄Π°Π²Π°Π»Π° Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа, Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π΅Ρ‡Ρ‘Ρ‚Π½Ρ‹Π΅. Π’ случаС использования Ρ‚Ρ€Ρ‘Ρ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… связанных Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‚Ρ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Ρ‚ΠΎΠ³Π΄Π° Π±Ρ‹ использовали Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… INCREMENT BY 3 ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ RESTART WITH.

ΠŸΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ значСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа:

psql -p 5432 -c "ALTER SEQUENCE t_id_seq INCREMENT BY 2 RESTART WITH 8"

psql -p 5433 -c "ALTER SEQUENCE t_id_seq INCREMENT BY 2 RESTART WITH 9"

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ числа: 8,10,12... ΠΈ 9,11,13...

7)  ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‡Ρ‚ΠΎ вставка Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

psql -p 5433 -c "INSERT INTO t (t) VALUES ('g')"

psql -p 5432 -c "INSERT INTO t (t) VALUES ('h')"

        

8) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ вставлСнныС строки Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ:

postgres@tantor:~$ psql -p 5433 -c "select * from t"

 id | t

----+---

  1 | a

  2 | b

  4 | d

  5 | e

  9 | g

  8 | h

(6 строк)

postgres@tantor:~$ psql -p 5432 -c "select * from t"

 id | t

----+---

  1 | a

  2 | b

  4 | d

  5 | e

  9 | g

  8 | h

(6 строк)

9) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‡Ρ‚ΠΎ обновлСния Ρ‚ΠΎΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ:

psql -p 5432 -c "update t set t='HH' where id =8"

psql -p 5433 -c "update t set t='GG' where id =9"

psql -p 5432 -c "select * from t"

psql -p 5433 -c "select * from t"

postgres@tantor:~$ psql -p 5432 -c "select * from t"

 id | t  

----+----

  1 | a

  2 | b

  4 | d

  5 | e

  8 | HH

  9 | GG

(6 строк)

postgres@tantor:~$ psql -p 5433 -c "select * from t"

 id | t  

----+----

  1 | a

  2 | b

  4 | d

  5 | e

  8 | HH

  9 | GG

(6 строк)

ΠœΡ‹ настроили Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ. Π’ ΠΎΠ΄Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ физичСская Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°. ЀизичСскиС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях.


Π§Π°ΡΡ‚ΡŒ 5. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ подписок ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ

1) Π£Π΄Π°Π»ΠΈΡ‚Π΅ подписки, ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

psql -p 5432 -c "drop subscription sub2"

psql -p 5433 -c "drop publication t"

psql -p 5433 -c "drop subscription sub1"

psql -p 5432 -c "drop publication t"

psql -p 5432 -c "checkpoint"

psql -p 5432 -c "drop table t"

psql -p 5432 -c "drop table t1"

psql -p 5433 -c "drop table t"

psql -p 5433 -c "drop table t1"

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 1:

Если ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ слот Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄ΠΎ удалСния подписки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Π΄Π°Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

psql -p 5434 -c "select pg_drop_replication_slot('sub1')"

Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ удалСния подписки выдастся ошибка ΠΈ подписка Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π°:

psql -p 5433 -c "drop subscription sub1"

ΠžΠ¨Π˜Π‘ΠšΠ:  ΡΠ»ΠΎΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "sub1" Π½Π° сСрвСрС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π΅ Π±Ρ‹Π» ΡƒΠ΄Π°Π»Ρ‘Π½:

ΠžΠ¨Π˜Π‘ΠšΠ:  ΡΠ»ΠΎΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "sub1" Π½Π΅ сущСствуСт

Π’ этом случаС для удалСния слота ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄:

psql -p 5433 -c "alter subscription sub1 disable"

psql -p 5433 -c "alter subscription sub1 set (slot_name=none)"

psql -p 5433 -c "drop subscription sub1"

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 2:

Π’ процСссС добавлСния Ρ‚Π°Π±Π»ΠΈΡ† Π² ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π½Π° физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅, измСнСния свойств подписок Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ошибки Π²ΠΈΠ΄Π°:

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ процСсс логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для подписки "sub1"

ΠžΠ¨Π˜Π‘ΠšΠ:  Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ WAL: ΠžΠ¨Π˜Π‘ΠšΠ:  ΠΈΠ· слота Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ "sub1" большС нСльзя ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ измСнСния

       ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘ВИ:  Π­Ρ‚ΠΎΡ‚ слот Π±Ρ‹Π» Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠ·-Π·Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° с восстановлСниСм.

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ процСсс "logical replication worker" (PID 31049) Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π° 1

На английском языкС:

DETAIL: This slot has been invalidated because it was conflicting with recovery.

Ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π² случаС:

1) hot_standby_feedback = off Π½Π° Ρ‚ΠΎΠΌ кластСрС, Π³Π΄Π΅ создан слот логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

2) hot_standby_feedback = on, Π½ΠΎ ΠΏΡ€ΠΈ этом отсутствуСт физичСский слот Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° мастСрС для физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создан слот логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°: Π°Π²Ρ‚ΠΎΠ²Π°ΠΊΠΊΡƒΠΌ Π½Π° мастСрС удаляСт старыС вСрсии строк ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ† систСмного ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ для логичСского дСкодирования Π½Π° Ρ‚ΠΎΠΌ кластСрС, Π³Π΄Π΅ создан слот логичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

ОписаниС: https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=6af1793954e8c5e753af83c3edb37ed3267dd179


ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Β«TantorΒ»  

ΠžΠ±Π·ΠΎΡ€

  1. Π Π°Π±ΠΎΡ‡ΠΈΠ΅ пространства
  2. ΠžΠ±Π·ΠΎΡ€ экзСмпляра
  3. Настройка экзСмпляра
  4. ΠŸΡ€ΠΎΡ„Π°ΠΉΠ»ΠΈΠ½Π³ запросов
  5. Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ активности
  6. Π Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π§Π°ΡΡ‚ΡŒ 1. Π Π°Π±ΠΎΡ‡ΠΈΠ΅ пространства

1) Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ ΠΏΠΎ локальной ссылкС https://education.tantorlabs.ru/platform/login

2) Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅: student@student.ru ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Student123!

3) ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ пространство Β«TantorΒ»

4) ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ экзСмпляр Β«demoΒ».

5) На страницС Β«ΠžΠ±Π·ΠΎΡ€Β» ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹.

Π§Π°ΡΡ‚ΡŒ 2. ΠžΠ±Π·ΠΎΡ€ экзСмпляра

Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ «БСссии», «Нагрузка ЦПУ», «Доступно ΠžΠ—Π£Β», Β«Π‘Π΅Ρ‚ΡŒΒ», Β«Π‘Π»ΠΎΠΊ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π°Β».

Π§Π°ΡΡ‚ΡŒ 3. Настройка экзСмпляра

1) ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ страницу «Настройки» &rarr; Β«Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹ настройки кластСра» β†’ Β«ΠŸΠΠ ΠΠœΠ•Π’Π Π« POSTGRESQLΒ».

2) Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ autovacuum_analyze_scale_factor.

3) НаТмитС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ настройки».

4) Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°.

Π§Π°ΡΡ‚ΡŒ 4. ΠŸΡ€ΠΎΡ„Π°ΠΉΠ»ΠΈΠ½Π³ запросов

1) ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ страницу Β«ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ запросов».

2) Π’Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ запрос с самым большим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ «Записано Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ²Β».

3) НаТмитС Π½Π° ΠΏΠΎΠ»Π΅ Β«Π₯эш запроса» β†’ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ статистику запроса.

4) ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° Π·Π°ΠΊΠ»Π°Π΄ΠΊΡƒ Β«ΠŸΠ»Π°Π½Ρ‹Β».

5) Π’Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΏΠ»Π°Π½ β†’ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° любоС ΠΏΠΎΠ»Π΅ ΠΏΡ€Π°Π²Π΅Π΅ Β«Π₯эш запроса».

6) Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ графичСский ΠΏΠ»Π°Π½ запроса.

Π§Π°ΡΡ‚ΡŒ 5. Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ активности

1) ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ страницу «ВСкущая Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΒ».

2) Π’Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ Π‘Π” postgres.

3) Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅Β».

Π§Π°ΡΡ‚ΡŒ 6. Π Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹

1) ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ страницу Β«ΠžΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Π½ΠΈΠ΅Β».

2) Π’Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ Π‘Π” test_db.

3) Π’Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ Β«Π Π°Π·Π΄ΡƒΡ‚ΠΈΠ΅ индСксов».

4) ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ «КОЭЀЀ. Π ΠΠ—Π”Π£Π’Π˜Π― %Β»

5) Π’Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ ΡΠ°ΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ДСйствиС Β«ReindexΒ».

6) НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ обслуТиваниС».

7) НаТмитС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ обслуТиваниС».

8) НаТмитС Π½Π° ссылку Β«Π˜ΡΡ‚ΠΎΡ€ΠΈΡΒ».

9) Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ запуска.


Π Π°Π·Π΄Π΅Π» 10. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΈ измСнСния Π‘Π£Π‘Π” Tantor ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с PostgreSQL

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ orafce 

1) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ установлСны Π² Π±Π°Π·Π΅:

postgres=# \dx

                                          Бписок установлСнных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

        Имя         | ВСрсия |   Π‘Ρ…Π΅ΠΌΠ°    |                                ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅                        

--------------------+--------+------------+---------------------------------------------------

 hypopg             | 1.4.0  | public     | Hypothetical indexes for PostgreSQL

 pg_stat_statements | 1.10   | public     | track planning and execution statistics of all SQL statements ex

 pg_store_plans     | 1.6.4  | public     | track plan statistics of all SQL statements executed

 plpgsql            | 1.0    | pg_catalog | PL/pgSQL procedural language

 plpython3u         | 1.0    | pg_catalog | PL/Python3U untrusted procedural language

(5 строк)

Бписок Π² вашСй Π±Π°Π·Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ.

2) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, доступно Π»ΠΈ для установки Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ orafce:

postgres=# select * from pg_available_extensions where name ilike '%ora%';

  name  | default_version | installed_version |                                            comment          

--------+-----------------+-------------------+----------------------------

 orafce | 4.7             | 4.7               | Functions and operators that emulate a subset of functions a

(1 строка)

3) КакиС схСмы Π΅ΡΡ‚ΡŒ Π² Π±Π°Π·Π΅? ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ список схСм:

postgres=# \dn

        Бписок схСм

  Имя   |     Π’Π»Π°Π΄Π΅Π»Π΅Ρ†      

--------+-------------------

 public | pg_database_owner

(1 строка)

4) УстановитС Π² Π±Π°Π·Ρƒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ orafce:

postgres=# CREATE EXTENSION orafce;

CREATE EXTENSION

5) ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ список схСм:

postgres=# \dn

           Π‘писок схСм

     Π˜ΠΌΡ      |     Π’Π»Π°Π΄Π΅Π»Π΅Ρ†      

--------------+-------------------

 dbms_alert   | postgres

 dbms_assert  | postgres

 dbms_output  | postgres

 dbms_pipe    | postgres

 dbms_random  | postgres

 dbms_sql     | postgres

 dbms_utility | postgres

 oracle       | postgres

 plunit       | postgres

 plvchr       | postgres

 plvdate      | postgres

 plvlex       | postgres

 plvstr       | postgres

 plvsubst     | postgres

 public       | pg_database_owner

 utl_file     | postgres

(16 строк)

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ создало 15 схСм.

Π’ Oracle Database Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€. Π’ Π‘Π£Π‘Π” Π’Π°Π½Ρ‚ΠΎΡ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π½Π΅Ρ‚. ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для объСдинСния ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π‘Π»ΠΈΠ·ΠΊΠΈΠΉ Π°Π½Π°Π»ΠΎΠ³ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² - схСмы. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² схСмах ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ любого Ρ‚ΠΈΠΏΠ°, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ Oracle Database ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ поставляСмыС стандартно ΠΈΠΌΠ΅ΡŽΡ‚ прСфикс "dbms_"

6) Π§Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Oracle Database Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±Π΅Π· прСфикса ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ Π² схСмС oracle. Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ имя этой схСмы Π² ΠΏΡƒΡ‚ΡŒ поиска:

postgres=# set search_path TO "$user", public, oracle;

SET

7) ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ dual, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ прилоТСниями Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ с Oracle Database для Π²Ρ‹Π·ΠΎΠ²Π° однострочных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ Oracle Database ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ использованиС Ρ„Ρ€Π°Π·Ρ‹ FROM Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ SELECT, Π² постгрСс Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Oracle Database ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ "SELECT функция() FROM DUAL;". Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# SELECT sysdate() FROM dual;

МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹. Π’ Oracle Database функция SYSDATE ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся Π±Π΅Π· ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок. Π’ постгрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π±Π΅Π· ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎ стандарту SQL Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±Π΅Π· ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок. НапримСр: current_date, current_timestamp, current_catalog, current_role, current_user, session_user, user, current_schema. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ current_schema ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками.

8) Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ создаёт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Oracle Database Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… VARCHAR2:

postgres=# select 'hello'::varchar2;

 varchar2

----------

 hello

(1 строка)

9) Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ создаёт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Oracle Database для ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° Π² составС ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ dbms_output:

postgres=# SELECT dbms_output.serveroutput(true);

 serveroutput

--------------

 

(1 строка)

Аналог ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Orcle Database "SET SERVEROUTPUT ON"

postgres=# SELECT dbms_output.put('aa');

 put

-----

 

(1 строка)

postgres=# SELECT dbms_output.put('bb');

 put

-----

 

(1 строка)

postgres=# SELECT * FROM dbms_output.get_lines(1);

 lines  | numlines

--------+----------

 {aabb} |        1

(1 строка)

postgres=# SELECT dbms_output.put('aa');

 put

-----

 

(1 строка)

postgres=# SELECT dbms_output.put('bb');

 put

-----

 

(1 строка)

postgres=# SELECT * FROM dbms_output.get_line();

 line | status

------+--------

 aabb |      0

(1 строка)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ get_line() ΠΈ get_lines(1) ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ².

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ enable() ΠΈ serveroutput(true) ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ².

10) Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡƒΡ‚ΠΈ поиска ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

postgres=# reset search_path;

RESET


Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ pg_variables

1) Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для хранСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСссии. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ обСспСчиваСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Π² Oracle Database. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ‚Π°ΠΊΠΆΠ΅ схоТ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Β«application contextsΒ» Π² Oracle Database. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: быстрота доступа. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΈ простая Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌ.

УстановитС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅:

postgres=# CREATE EXTENSION pg_variables;

CREATE EXTENSION

2) УстановитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 101 для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Β«Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΡƒΒ») int1 Π² Β«ΠΏΠ°ΠΊΠ΅Ρ‚Π΅Β» («контСкстС», Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…) с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ vars. Π’Π΅Ρ€ΠΌΠΈΠ½ Β«ΠΏΠ°ΠΊΠ΅Ρ‚Β» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ для обозначСния Π³Ρ€ΡƒΠΏΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

postgres=# SELECT pgv_set('vars', 'int1', 101);

 pgv_set

---------

 

(1 строка)

3) УстановитС Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅:

postgres=# SELECT pgv_set('vars', 'text1', 'text variable'::text, true);

 pgv_set

---------

 

(1 строка)

4) Для получСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция pgv_get. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ понятны: имя ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ - Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈ посмотритС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

postgres=# SELECT pgv_get('vars', 'int1');

ERROR:  function pgv_get(unknown, unknown) does not exist

Ошибка ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρƒ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚.

5) ΠŸΡƒΡΡ‚ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ пСрСдаётся:

postgres=# SELECT pgv_get('vars', 'int1', null);

ERROR:  function pgv_get(unknown, unknown, unknown) is not unique

6) ΠŸΠ°ΠΊΠ΅Ρ‚ Π·Π½Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ сообщаСт Π΅Π³ΠΎ:

postgres=# SELECT pgv_get('vars', 'int1', null::numeric);

ERROR:  variable "int1" requires "integer" value

7) ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого Ρ‚ΠΈΠΏΠ° - функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

postgres=# SELECT pgv_get('vars', 'int1', 0);

 pgv_get

---------

     101

(1 строка)

8) МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL::int Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°:

postgres=# SELECT pgv_get('vars', 'int1', NULL::int);

 pgv_get

---------

     101

(1 строка)

9) Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² - нСльзя:

postgres=# SELECT pgv_set('vars', 'int1', null::text);

ERROR:  variable "int1" requires "integer" value

10) ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ значСния тСкстовой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

postgres=# SELECT pgv_get('vars', 'text1', NULL::text);

    pgv_get    

---------------

 text variable

(1 строка)

11) Бписок ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

postgres=# SELECT * FROM pgv_list() order by package, name;

 package | name  | is_transactional 

---------+-------+------------------

 vars    | int1  | f

 vars    | text1 | f

(2 строки)

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ is_transactional=false ΠΈ Π½Π° Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π½Π΅ влияСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π° транзакция ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Если is_transactional=true, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ числС Π΄ΠΎ Ρ‚ΠΎΡ‡Π΅ΠΊ сохранСния дСйствия с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ.

12) Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ задаётся Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pgv_set Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ послС создания нСльзя:

postgres=# SELECT pgv_set('vars', 'text1', 'text variable'::text, true);

ERROR:  variable "text1" already created as NOT TRANSACTIONAL

13) МоТно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π·Π°Π½ΠΎΠ²ΠΎ:

postgres=# SELECT pgv_remove('vars', 'text1');

 pgv_remove

------------

 

(1 строка)

postgres=# SELECT pgv_set('vars', 'text1', 'text variable'::text, true);

 pgv_set

---------

 

(1 строка)

postgres=# SELECT * FROM pgv_list() order by package, name;

 package | name  | is_transactional

---------+-------+------------------

 vars    | int1  | f

 vars    | text1 | t

(2 строки)

14) ИспользованиС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π°ΠΊΡ€ΡƒΡ‚ΠΊΠ΅ счСтчика Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ это. Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² кластСрС:

postgres=# SELECT pg_current_xact_id();

 pg_current_xact_id

--------------------

                871

(1 строка)

15) ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, создадим Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ зафиксируСм Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ:

postgres=# begin transaction;

BEGIN

postgres=*# SELECT pgv_set('vars', 'text2', 'text variable'::text, true);

 pgv_set

---------

 

(1 строка)

postgres=*# SELECT pg_current_xact_id_if_assigned();

 pg_current_xact_id_if_assigned

--------------------------------

                               

(1 строка)

НомСр Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€.

16) ПослС фиксации Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ функция получСния Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€:

postgres=*# commit;

COMMIT

postgres=# SELECT pg_current_xact_id();

 pg_current_xact_id

--------------------

                872

(1 строка)

postgres=# SELECT pg_current_xact_id();

 pg_current_xact_id

--------------------

                873

(1 строка)

Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ транзакция Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»Π° создана транзакционная пСрСмСнная Π½Π΅ использовала Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ вносило Π±Ρ‹ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ. Π Π°Π±ΠΎΡ‚Π° с Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ эффСктивна ΠΊΠ°ΠΊ с Π½Π΅Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ.

17) Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ:

postgres=# SELECT * FROM pgv_stats() order by package;

 package | allocated_memory

---------+------------------

 vars    |            16384

(1 строка)

18) Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ int1:

postgres=# SELECT pgv_remove('vars', 'int1');

 pgv_remove

------------

 

(1 строка)

19) Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ этого ΠΏΠ°ΠΊΠ΅Ρ‚Π°:

postgres=# SELECT pgv_remove('vars');

 pgv_remove

------------

 

(1 строка)

20) Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ всСх ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

postgres=# SELECT pgv_free();

 pgv_free

----------

 

(1 строка)

Π’ любом случаС, срок ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… - Π΄ΠΎ окончания сСссии.


Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ page_repair

  1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ        
  2. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹        
  3. ВосстановлСниС страницы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ page_repair        
  4. ΠžΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ страницы

Π§Π°ΡΡ‚ΡŒ 1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ page_repair Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· сСтСвоС соСдинСниС с физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ Π½Π° ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

Для использования Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½ΡƒΠΆΠ½Π° физичСская Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°. Если ΠΎΠ½Π° Π΅ΡΡ‚ΡŒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ Π΅Ρ‘ создания. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΎΡΡŒ Π² ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ 8a.

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° кластСра ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС:

postgres@tantor:~$ sudo systemctl stop tantor-se-server-16-replica

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° кластСра, Ссли ΠΎΠ½ Π±Ρ‹Π» создан ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π΅Π½ ΠΊ использованию ΠΊΠ°ΠΊ физичСская Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° (стал мастСром, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ·-Π·Π° отсутствия Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ²):

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16-replica/data1

postgres@tantor:~$ rm -rf /var/lib/postgresql/tantor-se-16-replica/data1

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres@tantor:~$ rm /var/lib/postgresql/tantor-se-16/data/global/pg_store_plans.stat

postgres@tantor:~$ pg_basebackup -D /var/lib/postgresql/tantor-se-16-replica/data1 -P -R -C --slot=replica1 --checkpoint=fast

Если Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ: rm -rf /var/lib/postgresql/tantor-se-16-replica/data1

ΠΈ слот Π½Π° мастСрС: psql -c "select pg_drop_replication_slot('replica1')"

postgres@tantor:~$ echo "port=5433" >> /var/lib/postgresql/tantor-se-16-replica/data1/postgresql.auto.conf

Запуск Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ:

postgres@tantor:~$ pg_ctl start -D /var/lib/postgresql/tantor-se-16-replica/data1 -l log_replica1.log

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‡Ρ‚ΠΎ рСпликация Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

postgres@tantor:~$ psql -c "select * from pg_replication_slots"

Π’ столбцС status Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "t".

Π§Π°ΡΡ‚ΡŒ 2. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

1) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π΅Ρ‘ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

postgres=# drop table if exists t;

NOTICE: table "t" does not exist, skipping

DROP TABLE

postgres=# CREATE TABLE t (id bigserial primary key, t text);

CREATE TABLE

postgres=# INSERT INTO t(t) SELECT encode((floor(random()*1000)::numeric ^

100::numeric)::text::bytea, 'base64') from generate_series(1,1000);

INSERT 0 1000

postgres=# update t set t = t || 'a';

UPDATE 1000

Π‘Ρ‹Π»Π° вставлСна тысяча строк ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° тысяча строк. Π² страницах ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ вСрсии строк ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π²Ρ‚ΠΎΠ²Π°ΠΊΡƒΡƒΠΌ.

2) Π Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

postgres=# select  pg_relation_size('t');

 pg_relation_size

------------------

           802816

(1 строка)

3) ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ со строками:

postgres=# SELECT pg_relation_filepath('t'::regclass);

 pg_relation_filepath

----------------------

 base/5/16622

(1 строка)

4) ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ для получСния Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΈΠ· ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ (ΠΎΠ½ ΠΆΠ΅ PGDATA):

postgres=# \dconfig data_directory

             Π‘писок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€    |               Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅                

----------------+---------------------------------------

 data_directory | /var/lib/postgresql/tantor-se-16/data

(1 строка)

5) НомСр Π±Π»ΠΎΠΊΠ° Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ располоТСна строка с id=900:

postgres=# select ctid, id from t  where id=900;

  ctid  | id  

--------+-----

 (92,15) | 900

(1 строка)

6) ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ экзСмпляр:

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16/data

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра.... Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

7) Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ мусор Π² Π±Π»ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится строка с id=100:

postgres@tantor:~$ dd if=/dev/urandom conv=notrunc bs=8192 seek=92 count=1 of=/var/lib/postgresql/tantor-se-16/data/base/5/16622

1+0 записСй ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ

1+0 записСй ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ

8192 Π±Π°ΠΉΡ‚ (8.2 kB, 8.0 KiB) скопирован, 0.000300021 s, 27.3 MB/s

8) ЗапуститС кластСр:

postgres@tantor:~$ sudo systemctl start tantor-se-server-16

9) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ обращСния ΠΊ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½ΠΎΠΉ страницС:

postgres=# select ctid, id from t where id=900;

ERROR:  invalid page in block 92 of relation base/5/16622

postgres=# select count(*) from t;             

ERROR:  invalid page in block 92 of relation base/5/16622

postgres=# analyze verbose t;

INFO:  analyzing "public.t"

ERROR:  invalid page in block 92 of relation base/5/16622

10) Π—Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°:

postgres=# select pg_current_xact_id();

 pg_current_xact_id

--------------------

                797

(1 строка)

postgres=# vacuum freeze t;

ERROR:  invalid page in block 92 of relation base/5/16622

ΠšΠžΠΠ’Π•ΠšΠ‘Π’:  while scanning block 92 of relation "public.t"

postgres=# select relfrozenxid from pg_class where relname='t';

 relfrozenxid

--------------

          795

(1 строка)

11) ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΠ»Π½Ρ‹ΠΌ сканированиСм Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ дойдя Π΄ΠΎ сбойного Π±Π»ΠΎΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Ρ€Π²ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ:

postgres=# explain update t set t = t || 'b' where id > 100;

                         QUERY PLAN                        

------------------------------------------------------------

 Update on t  (cost=0.00..112.75 rows=0 width=0)

   ->  Seq Scan on t  (cost=0.00..112.75 rows=900 width=38)

         Filter: (id > 100)

(3 строки)

postgres=# explain (analyze) update t set t = t || 'b' where id > 100;

ERROR:  invalid page in block 54 of relation base/5/16622

12) ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ с индСксным доступом, Π½Π΅ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ сбойный Π±Π»ΠΎΠΊ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ:

postgres=# update t set t = t || 'b' where id<500;

UPDATE 499

13) Π’Π°ΠΊΡƒΡƒΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ссли обратится ΠΊ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΡƒ (опрСдСляСтся ΠΏΠΎ ΠΊΠ°Ρ€Ρ‚Π΅ видимости) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ. Π‘Ρ‚Π°Ρ€Ρ‹Π΅ вСрсии строк Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒΡΡ, Ρ„Π°ΠΉΠ»Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ† Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ….

postgres=# vacuum verbose t;

INFO:  vacuuming "postgres.public.t"

ERROR:  invalid page in block 92 of relation base/5/16622

ΠšΠžΠΠ’Π•ΠšΠ‘Π’:  while scanning block 92 of relation "public.t"

Π§Π°ΡΡ‚ΡŒ 3. ВосстановлСниС страницы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ page_repair

1) УстановитС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ поврСТдённая страница:

postgres=# CREATE EXTENSION page_repair;

CREATE EXTENSION

2) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ опрСдСлСния Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, входящих Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅:

postgres=# \df pg_repair_page

                                     Π‘писок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

 Π‘Ρ…Π΅ΠΌΠ°  |      Π˜ΠΌΡ       | Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° |    Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²    |  Π’ΠΈΠΏ  

--------+----------------+-----------------------+------------------------------+-------

 public | pg_repair_page | boolean               | regclass, bigint, text       | Ρ„ΡƒΠ½ΠΊ.

 public | pg_repair_page | boolean               | regclass, bigint, text, text | Ρ„ΡƒΠ½ΠΊ.

(2 строки)

3) Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для восстановлСния страницы:

postgres=# select pg_repair_page('t'::regclass, 92, 'port=5433');

ERROR:  data checksums are not enabled

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ Π½ΡƒΠΆΠ½Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы, Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹Π΅ Π½Π° кластСрС. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Π½ΡƒΠΆΠ½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒ Π² восстановлСнии, Ссли администратор Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ. Π˜ΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ содСрТимоС Π±Π»ΠΎΠΊΠ° слоТно, Π° ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммС просто.

4) Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π½Π° кластСрС с ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ:

postgres=# \q

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16/data

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра.... Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

postgres@tantor:~$ rm /var/lib/postgresql/tantor-se-16/data/global/pg_store_plans.stat

postgres@tantor:~$ pg_checksums -e -D /var/lib/postgresql/tantor-se-16/data

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°

ΠŸΡ€ΠΎΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²: 1271

ΠŸΡ€ΠΎΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π±Π»ΠΎΠΊΠΎΠ²: 27179

Записано Ρ„Π°ΠΉΠ»ΠΎΠ²: 1055

Записано Π±Π»ΠΎΠΊΠΎΠ²: 27178

pg_checksums: синхронизация ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π΄Π°Π½Π½Ρ‹Ρ…

pg_checksums: модификация ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Π² кластСрС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹

postgres@tantor:~$ sudo systemctl start tantor-se-server-16

5) Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Π΅Ρ‰Ρ‘ Ρ€Π°Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для восстановлСния страницы:

postgres@tantor:~$ psql -c "select pg_repair_page('t'::regclass, 92, 'port=5433')"

NOTICE:  skipping page repair of the given page --- page is not corrupted

 pg_repair_page

----------------

 t

(1 строка)

Ѐункция ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ сообщив Ρ‡Ρ‚ΠΎ Π½Π΅ стала Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ страницу, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎ Π΅Π΅ Π»ΠΎΠ³ΠΈΠΊΠ΅ страница Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π°.

6) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π° Π»ΠΈ страница:

postgres@tantor:~$ psql -c "select ctid, id from t where id=900"

ERROR:  invalid page in block 92 of relation base/5/16622

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° всё Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π°. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ считаСт страницу Π½Π΅ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½ΠΎΠΉ?

ΠŸΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ подсчСта ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ рассчитаны ΠΈ для ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈ Π½Π° логичСском ΡƒΡ€ΠΎΠ²Π½Π΅, ΠΎΠ½Π° рассчитываСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы ΠΈ вставляСт ΠΈΡ… Π² Π±Π»ΠΎΠΊΠΈ.

7) Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π΅Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ поврСТдСния страницы:

pg_ctl stop -D /var/lib/postgresql/tantor-se-16/data

dd if=/dev/urandom conv=notrunc bs=8192 seek=92 count=1 of=/var/lib/postgresql/tantor-se-16/data/base/5/16622

sudo systemctl start tantor-se-server-16

8) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ восстановлСния страницы:

postgres@tantor:~$ psql -c "select pg_repair_page('t'::regclass, 92, 'port=5433')"

ERROR:  page on standby is also corrupted

Ѐункция сообщаСт, Ρ‡Ρ‚ΠΎ ΠΏΠΎ Π΅Ρ‘ Π»ΠΎΠ³ΠΈΠΊΠ΅ страница Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π°.

9) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π° Π»ΠΈ страница Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

postgres@tantor:~$ psql -p 5433 -c "select ctid, id from t where id=900"

  ctid   | id  

---------+-----

 (92,15) | 900

(1 строка)

postgres@tantor:~$ psql -p 5433 -c "select count(*) from t"

 count

-------

  1000

(1 строка)

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Ρ‹. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ отказываСтся Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ страницу?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ подсчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм. ВСкст ошибки Π²Π²ΠΎΠ΄ΠΈΡ‚ Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅.

10) Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ подсчёт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π±Π»ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

postgres@tantor:~$ pg_ctl stop -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра.... Π³ΠΎΡ‚ΠΎΠ²ΠΎ

сСрвСр остановлСн

postgres@tantor:~$ rm /var/lib/postgresql/tantor-se-16-replica/data1/global/pg_store_plans.stat

postgres@tantor:~$ pg_checksums -e -D /var/lib/postgresql/tantor-se-16-replica/data1

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°

ΠŸΡ€ΠΎΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²: 1271

ΠŸΡ€ΠΎΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π±Π»ΠΎΠΊΠΎΠ²: 27179

Записано Ρ„Π°ΠΉΠ»ΠΎΠ²: 1055

Записано Π±Π»ΠΎΠΊΠΎΠ²: 27178

pg_checksums: синхронизация ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π΄Π°Π½Π½Ρ‹Ρ…

pg_checksums: модификация ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Π² кластСрС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹

postgres@tantor:~$ pg_ctl start -D /var/lib/postgresql/tantor-se-16-replica/data1 -l log_replica1.log

11) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ восстановлСния страницы:

postgres@tantor:~$ psql -c "select pg_repair_page('t'::regclass, 92, 'port=5433')"

 pg_repair_page

----------------

 t

(1 строка)

12) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π»ΠΈ страницы Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

postgres@tantor:~$ psql -c "select count(*) from t"

 count

-------

  1000

(1 строка)

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ, страница Π±Ρ‹Π»Π° восстановлСна ΠΏΡƒΡ‚Ρ‘ΠΌ копирования с физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ.

ИспользованиС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ page_repair Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ подсчСта ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π½Π° мастСрС ΠΈ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ страница Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° мастСр.

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ подсчСта ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм вставляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму Π² Π»ΡŽΠ±Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, Π² Ρ‚ΠΎΠΌ числС ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹Π΅.

Π§Π°ΡΡ‚ΡŒ 4. ΠžΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ страницы

Π’ отсутствии физичСских Ρ€Π΅ΠΏΠ»ΠΈΠΊ, возмоТности Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ с бэкапов, Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ нСльзя. ΠžΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π±Π»ΠΎΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ‚ΠΎΠΆΠ΅ нСльзя - Π²Π°ΠΊΡƒΡƒΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ. Π•ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ±ΠΎΠΉΠ½ΡƒΡŽ страницу пустой. ΠŸΡ€ΠΈ этом всё содСрТимоС Π±Π»ΠΎΠΊΠ° считаСтся Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ.

1) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ поврСТдСния Π±Π»ΠΎΠΊΠ°:

pg_ctl stop -D /var/lib/postgresql/tantor-se-16/data

dd if=/dev/urandom conv=notrunc bs=8192 seek=92 count=1 of=/var/lib/postgresql/tantor-se-16/data/base/5/16622

sudo systemctl start tantor-se-server-16

psql -c "select ctid, id from t where id=900"

WARNING:  page verification failed, calculated checksum 9494 but expected 37021

ERROR:  invalid page in block 92 of relation base/5/16622

ΠŸΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… суммах ΠΊ ошибкС добавилось ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.

2) Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСссии ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:

postgres=# set zero_damaged_pages = on;

SET

3)  Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ запрос ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

postgres=# select count(*) from t;

 count

-------

  1000

(1 строка)

Число строк Π²Π΅Ρ€Π½ΠΎΠ΅, ошибок Π½Π΅Ρ‚. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ²Π°ΠΊΡƒΡƒΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» ΠΊΠ°Ρ€Ρ‚Ρƒ видимости, Π²ΠΎ всСх Π±Π»ΠΎΠΊΠ°Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ вСрсии строк. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ использовании ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ индСкса ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΠΎΠΌΡƒ процСссу Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π° Π»ΠΈ строка Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ссылаСтся индСксная запись.

postgres=# explain select count(*) from t;

                                  QUERY PLAN                                  

-------------------------------------------------------------------------------

 Aggregate  (cost=49.77..49.78 rows=1 width=8)

   ->  Index Only Scan using t_pkey on t  (cost=0.28..47.27 rows=1000 width=0)

(2 строки)

4) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# select count(*) from t where t is not null;

WARNING:  page verification failed, calculated checksum 9494 but expected 37021

WARNING:  invalid page in block 92 of relation base/5/16622; zeroing out page

 count

-------

   980

(1 строка)

Число строк Π΄Ρ€ΡƒΠ³ΠΎΠ΅ - Π½Π° 20 строк мСньшС. Π’ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ 20 строк, ΠΎΠ½ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΡΡ‡Π΅Π·Π½ΡƒΠ²ΡˆΠΈΠΌΠΈ.

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ сообщСния - это Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ установки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° zero_damaged_pages = on ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ подсчёта ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм. Π•ΡΠ»ΠΈ Π±Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (980) Π±Ρ‹Π» Π±Ρ‹ Ρ‚ΠΎΡ‚ ΠΆΠ΅.

5) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

postgres=# vacuum freeze t;

VACUUM

Π’Π°ΠΊΡƒΡƒΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, считая Π±Π»ΠΎΠΊ пустым.

ΠŸΡ€ΠΈ этом Π±Π»ΠΎΠΊ Π½Π΅ мСнялся ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² Ρ„Π°ΠΉΠ»Π΅. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ zero_damaged_pages = on Π½Π΅ мСняСт содСрТимоС Π±Π»ΠΎΠΊΠ° Π² Ρ„Π°ΠΉΠ»Π΅.

pg_ctl stop -D /var/lib/postgresql/tantor-se-16/data

dd if=/dev/zero conv=notrunc bs=8192 seek=92 count=1 of=/var/lib/postgresql/tantor-se-16/data/base/5/16622

sudo systemctl start tantor-se-server-16

psql -c "select ctid, id from t where id=900"

 ctid | id

------+----

(0 строк)

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ сбойного Π±Π»ΠΎΠΊΠ° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ нулями. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ - Ρ‚ΠΎΠΆΠ΅ Π½ΡƒΠ»ΠΈ. Π‘Π»ΠΎΠΊ считаСтся Π½Π΅ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹ΠΌ, просто пустым.

6) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

postgres@tantor:~$ psql -c "select count(*) from t"

 count

-------

   999

(1 строка)

postgres@tantor:~$ psql -c "select ctid, id from t where id=901"

 ctid | id

------+----

(0 строк)

postgres@tantor:~$ psql -c "select count(*) from t"

 count

-------

   998

(1 строка)

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ строк мСняСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ.

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ процСсс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎΠ΅ сканированиС (Π½Π΅ Index Only Scan), провСряСт содСрТимоС Π±Π»ΠΎΠΊΠ° ΠΈ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ строку:

postgres@tantor:~$ psql -c "explain select ctid, id from t where id=903"

                           QUERY PLAN                            

-----------------------------------------------------------------

 Index Scan using t_pkey on t  (cost=0.28..8.29 rows=1 width=14)

   Index Cond: (id = 903)

(2 строки)

7) ΠŸΠ΅Ρ€Π΅ΡΡ‚Ρ€ΠΎΠΉΡ‚Π΅ индСксы:

postgres=# reindex (verbose) table t;

INFO:  index "t_pkey" was reindexed

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s

INFO:  index "pg_toast_16622_index" was reindexed

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s

REINDEX

postgres=# select count(*) from t;

 count

-------

   980

(1 строка)

8) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

postgres=# drop table t;

DROP TABLE


ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ

  1. Установка Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ· исходных ΠΊΠΎΠ΄ΠΎΠ² Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ pldebugger        
  2. ΠžΡ‚Π»Π°Π΄ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² pgAdmin        
  3. ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² DBeaver

Π§Π°ΡΡ‚ΡŒ 1. Установка Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ· исходных ΠΊΠΎΠ΄ΠΎΠ² Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ pldebugger

Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ установку ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, поставляСмых ΠΈΠ· исходных ΠΊΠΎΠ΄ΠΎΠ².

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ установки ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ рассматриваСтся, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… вСдётся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°.

Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½ΡƒΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° со стороны сСрвСра ΠΈ графичСскоС клиСнтскоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» стандартный для ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠ²: ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова, пошаговоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, наблюдСниС Π·Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅.

БСрвСрная Ρ‡Π°ΡΡ‚ΡŒ - ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, (Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅) создано EnterpriseDB ΠΈ свободно распространяСтся ΠΏΠΎ адрСсу https://github.com/EnterpriseDB/pldebugger/releases/tag/v1.5 

ОсновноС клиСнтскоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ pgAdmin. Π”Ρ€ΡƒΠ³ΠΈΠ΅ клиСнтскиС прилоТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ.

1) ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π² root, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния:

astra@tantor:~$ su -

ΠŸΠ°Ρ€ΠΎΠ»ΡŒ: root

root@tantor:~#

2) Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ pldebugger:

root@tantor:~# wget https://github.com/EnterpriseDB/pldebugger/archive/refs/tags/v1.5.zip

3) РаспакуйтС Π°Ρ€Ρ…ΠΈΠ²:

root@tantor:~# unzip pldebugger-1.5.zip

4) ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±Ρ‹Π»ΠΈ распакованы исходныС Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ:

root@tantor:~# cd pldebugger-1.5

5) Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΏΡƒΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ с ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_config ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ make ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ установки Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ PGXS:

root@tantor:~/pldebugger-1.5# export PATH=/opt/tantor/db/16/bin:$PATH

root@tantor:~/pldebugger-1.5# export USE_PGXS=1

6) Π’ Ρ„Π°ΠΉΠ»Π΅ README.pldebugger написано ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅. Π”Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

root@tantor:~/pldebugger-1.5# make

ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅:

plpgsql_debugger.c: In function 'is_datum_visible':

plpgsql_debugger.c:1270:11: warning: declaration of 'i' shadows a previous local [-Wshadow=compatible-local]

    int    i;

           ^

plpgsql_debugger.c:1246:11: note: shadowed declaration is here

ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ качСство написания ΠΊΠΎΠ΄Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°:

In file included from pldbgapi.c:98:

/opt/tantor/db/16/include/postgresql/server/libpq/libpq-be.h:32:10:

fatal error: gssapi/gssapi.h: No such file or directory

 #include <gssapi/gssapi.h>

Π’ строкС 50 Ρ„Π°ΠΉΠ»Π° /opt/tantor/db/16/include/postgresql/server/pg_config.h

ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π‘Π£Π‘Π” Π’Π°Π½Ρ‚ΠΎΡ€ Π±Ρ‹Π» скомпилирован с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ --with-gssapi

Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° это ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° pg_config:

root@tantor:~/pldebugger-1.5# pg_config | grep gssapi

CONFIGURE =  '--prefix=/opt/tantor/db/16' '--enable-tap-tests' '--enable-nls=en ru' '--with-python' '--with-icu' '--with-lz4' '--with-zstd' '--with-ssl=openssl' '--with-ldap' '--with-pam' '--with-uuid=e2fs' '--with-libxml' '--with-libxslt' '--with-gssapi' '--with-selinux' '--with-systemd' '--with-llvm' 'CFLAGS=-O2 -pipe -Wno-missing-braces' 'LLVM_CONFIG=/usr/bin/llvm-config-11' 'CLANG=/usr/bin/clang-11' 'PYTHON=/usr/bin/python3'

LIBS = -lpgcommon -lpgport -lselinux -lzstd -llz4 -lxslt -lxml2 -lpam -lssl -lcrypto -lgssapi_krb5 -lz -lreadline -lpthread -lrt -ldl -lm

7) ΠžΠ±ΠΎΠΉΠ΄Ρ‘ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ (ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ workaround). Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»:

root@tantor:~/pldebugger-1.5# cp /opt/tantor/db/16/include/postgresql/server/pg_config.h /opt/tantor/db/16/include/postgresql/server/pg_config.SAV

Π’ 50 строкС (ΠΎΠ½Π° пустая) Ρ„Π°ΠΉΠ»Π° pg_config.h Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ строку:

#define ENABLE_GSS 0

8) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ сборки модуля Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ· исходных ΠΊΠΎΠ΄ΠΎΠ²:

root@tantor:~/pldebugger-1.5# make

Команда ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π½Π° отсутствиС ΠΊΠ°ΠΊΠΈΡ…-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ для эксплуатации ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ для компиляции сторонних Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΈΠ· исходников:

make: /usr/bin/clang-11: Command not found

9) УстановитС Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚:

root@tantor:~/pldebugger-1.5# apt-get install clang

10) ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ сборки модуля Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ· исходных ΠΊΠΎΠ΄ΠΎΠ²:

root@tantor:~/pldebugger-1.5# make

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

11) Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°, описанная Π² Ρ„Π°ΠΉΠ»Π΅ README.pldebugger ΡΡ‚ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² стандартныС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π‘Π£Π‘Π”.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

root@tantor:~/pldebugger-1.5# make install

root@tantor:~/pldebugger-1.5# make install

/usr/bin/mkdir -p '/opt/tantor/db/16/lib/postgresql'

/usr/bin/mkdir -p '/opt/tantor/db/16/share/postgresql/extension'

/usr/bin/mkdir -p '/opt/tantor/db/16/share/postgresql/extension'

/usr/bin/mkdir -p '/opt/tantor/db/16/share/doc/postgresql/extension'

/usr/bin/install -c -m 755  plugin_debugger.so '/opt/tantor/db/16/lib/postgresql/plugin_debugger.so'

/usr/bin/install -c -m 644 .//pldbgapi.control '/opt/tantor/db/16/share/postgresql/extension/'

/usr/bin/install -c -m 644 .//pldbgapi--1.1.sql .//pldbgapi--unpackaged--1.1.sql .//pldbgapi--1.0--1.1.sql  '/opt/tantor/db/16/share/postgresql/extension/'

/usr/bin/install -c -m 644 .//README.pldebugger '/opt/tantor/db/16/share/doc/postgresql/extension/'

/usr/bin/mkdir -p '/opt/tantor/db/16/lib/postgresql/bitcode/plugin_debugger'

/usr/bin/mkdir -p '/opt/tantor/db/16/lib/postgresql/bitcode'/plugin_debugger/

/usr/bin/install -c -m 644 plpgsql_debugger.bc '/opt/tantor/db/16/lib/postgresql/bitcode'/plugin_debugger/./

/usr/bin/install -c -m 644 plugin_debugger.bc '/opt/tantor/db/16/lib/postgresql/bitcode'/plugin_debugger/./

/usr/bin/install -c -m 644 dbgcomm.bc '/opt/tantor/db/16/lib/postgresql/bitcode'/plugin_debugger/./

/usr/bin/install -c -m 644 pldbgapi.bc '/opt/tantor/db/16/lib/postgresql/bitcode'/plugin_debugger/./

cd '/opt/tantor/db/16/lib/postgresql/bitcode' && /usr/lib/llvm-11/bin/llvm-lto -thinlto -thinlto-action=thinlink -o plugin_debugger.index.bc plugin_debugger/plpgsql_debugger.bc plugin_debugger/plugin_debugger.bc plugin_debugger/dbgcomm.bc plugin_debugger/pldbgapi.bc

12) ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ список Ρ„Π°ΠΉΠ»ΠΎΠ² для поиска:

root@tantor:~/pldebugger-1.5# updatedb

ΠŸΠΎΠΈΡ‰ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» модуля:

root@tantor:~/pldebugger-1.5# locate plugin_debugger

/opt/tantor/db/16/lib/postgresql/plugin_debugger.so

/opt/tantor/db/16/lib/postgresql/bitcode/plugin_debugger

/opt/tantor/db/16/lib/postgresql/bitcode/plugin_debugger.index.bc

/opt/tantor/db/16/lib/postgresql/bitcode/plugin_debugger/dbgcomm.bc

/opt/tantor/db/16/lib/postgresql/bitcode/plugin_debugger/pldbgapi.bc

/opt/tantor/db/16/lib/postgresql/bitcode/plugin_debugger/plpgsql_debugger.bc

/opt/tantor/db/16/lib/postgresql/bitcode/plugin_debugger/plugin_debugger.bc

/root/pldebugger-1.5/plugin_debugger.bc

/root/pldebugger-1.5/plugin_debugger.c

/root/pldebugger-1.5/plugin_debugger.def

/root/pldebugger-1.5/plugin_debugger.o

/root/pldebugger-1.5/plugin_debugger.so

Π­Ρ‚ΠΎΡ‚ ΠΏΡƒΠ½ΠΊΡ‚ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов быстрого поиска Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС.

Π€Π°ΠΉΠ» модуля Π±Ρ‹Π» установлСн Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ:

/opt/tantor/db/16/lib/postgresql/plugin_debugger.so

НазваниС Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠ΄ΡƒΠ»Ρ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

13) Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

root@tantor:~/pldebugger-1.5# exit

logout

14) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ доступно для установки Π² Π±Π°Π·Ρƒ:

astra@tantor:~$ psql

postgres=# select * from pg_available_extensions where name like '%dbg%';

   name   | default_version | installed_version |                       comment                        

----------+-----------------+-------------------+-------------------------------------------

 pldbgapi | 1.1             |                   | server-side support for debugging PL/pgSQL

                                                        functions

(1 строка)

15)

postgres=# \dconfig shared_preload_libraries 

                      Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

         ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€         |                    Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅                    

--------------------------+------------------------------------------------

 shared_preload_libraries | pg_stat_statements,pg_store_plans,auto_explain

(1 строка)

16) Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ:

postgres=# alter system set shared_preload_libraries = pg_stat_statements, pg_store_plans, auto_explain, plugin_debugger;

ALTER SYSTEM

Апострофы послС Π·Π½Π°ΠΊΠ° равСнства нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΠ½Π°Ρ‡Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ трактуя строку ΠΊΠ°ΠΊ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΈ экзСмпляр Π½Π΅ запустится. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, которая выполнится, Π½ΠΎ экзСмпляр Π½Π΅ запустится ΠΏΠΎΠΊΠ° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ Ρ„Π°ΠΉΠ» postgresql.auto.conf, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ALTER SYSTEM Π½Π΅ выполняСтся Π½Π° остановлСнном экзСмплярС:

alter system set shared_preload_libraries = 'pg_stat_statements, pg_store_plans, auto_explain, plugin_debugger';

postgres=# \q

postgres@tantor:~$ pg_ctl stop

waiting for server to shut down.... done

server stopped

postgres@tantor:~$ pg_ctl start

waiting for server to start....

Π’ΠΠ–ΠΠž:  Π½Π΅Ρ‚ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ "pg_stat_statements, pg_store_plans, auto_explain, plugin_debugger": НСт Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π•:  ΡΠΈΡΡ‚Π΅ΠΌΠ° Π‘Π” Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°

 stopped waiting

pg_ctl: could not start server

Examine the log output.

17) РСстартуйтС экзСмпляр:

astra@tantor:~$ sudo systemctl start tantor-se-server-16

18) Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π±Ρ‹Π»Π° Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π°. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… postgres:

astra@tantor:~$ psql

postgres=# create extension pldbgapi;

CREATE EXTENSION

19) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для тСстирования ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°:

CREATE OR REPLACE FUNCTION bobdef()

 RETURNS text

 LANGUAGE plpgsql

 SECURITY DEFINER

AS $function$

 BEGIN

  RAISE NOTICE 'search_path %', current_schemas(true);

  RAISE NOTICE 'current_user %', current_user;

  RAISE NOTICE 'session_user %', session_user;

  RAISE NOTICE 'user %', user;

  RETURN now();

 END;

$function$

;

Π§Π°ΡΡ‚ΡŒ 2. ΠžΡ‚Π»Π°Π΄ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² pgAdmin

1) ЗапуститС pgAdmin.

ΠŸΡ€ΠΈ запросС пароля для доступа ΠΊ паролям Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ tantor.

2) РаскройтС Servers -> master -> Schemas (1) -> public -> Functions (..)

Если соСдинСний с Π±Π°Π·ΠΎΠΉ Π½Π΅Ρ‚, создайтС Π΅Π³ΠΎ ΠΈ Π½Π°Π·ΠΎΠ²ΠΈΡ‚Π΅ master.

3) Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ выполнСния ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ‡ΡƒΠΆΠΎΠΉ сСссии Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bobdef(). ΠΠ°ΠΆΠΌΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Debugging -> Set Breakpoint

4) ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ сообщСниС Β«Waiting for another session to invoke targetΒ».

Π’ psql Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

postgres=# select bobdef();


5) Окно pgAdmin отвиснСт ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ исходный ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎΡ‡ΠΊΠ° останова - пСрвая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

МоТно Π½Π°ΠΆΠ°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΡƒΡŽ слСва Π² ΠΎΠΊΠ½Π΅ с тСкстом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° ΠΈΠΊΠΎΠ½ΠΊΡƒ Step over - Π±ΡƒΠ΄Π΅Ρ‚ пошаговоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ этом Π² ΠΎΠΊΠ½Π΅ psql ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄ RAISE NOTICE.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова. Для ΠΈΡ… установки ΠΈΠ»ΠΈ удалСния Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ»ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΌΡ‹ΡˆΠΊΠΎΠΉ ΠΏΡ€Π°Π²Π΅Π΅ ΠΎΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π° строки. Π‘ΠΏΡ€Π°Π²Π° ΠΎΡ‚ числа 6 Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π²ΠΈΠ΄Π΅Π½ красный ΠΊΡ€ΡƒΠΆΠΎΠΊ - Π² это мСсто ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ»ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΈ ΠΊΡ€ΡƒΠΆΠΎΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΡƒ останова.

6) НаТимая ΠΌΡ‹ΡˆΠΊΠΎΠΉ Π½Π° ΠΈΠΊΠΎΠ½ΠΊΡƒ Step Over ΠΈΠ»ΠΈ Continue/Start Π΄ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π΄ΠΎ окончания выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

7) Для выполнСния ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² сСссии pgAdmin ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ мСню Debugging -> Debug. Π’ этом случаС Π½Π΅ потрСбуСтся Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² psql, ΠΎΠ½Π° запустится Π² pgAdmin ΠΈ Π² ΠΎΠΊΠ½Π΅ pgAdmin Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ client_messages (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄ RAISE NOTICE).

Π§Π°ΡΡ‚ΡŒ 3. ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² DBeaver

1) ЗапуститС DBeaver. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Sample Database, Π΅Ρ‘ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, ΠΎΠ½Π° Π½Π΅ относится ΠΊ постгрСс.

2) Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠΊΠΎΠ½ΠΊΡƒ PostgreSQL:

3) Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅, Ссли Π½Π΅ создано Ρ€Π°Π½Π΅Π΅ соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ локального ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π’Π°Π½Ρ‚ΠΎΡ€ 16, создав ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ /opt/tantor/db/16:


4) Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠΎΠ»Π΅ вСрсии ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΡƒΠΊΠ°Π·Π°Π½ΠΎ число:

5) DBeaver написан Π½Π° java ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ jdbc Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€:


6) Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ ΠΊΠ»ΠΈΠΊΠ½ΠΈΡ‚Π΅ Π½Π° ΠΎΠΊΠ½ΠΎ Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

7) Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π² мСню Π‘ΠΏΡ€Π°Π²ΠΊΠ° -> Install New Software. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ для установки DBeaver Debug Extension:


8) Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Select All, установится Π³Π°Π»ΠΎΡ‡ΠΊΠ°:

9) Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π½Π° radio button:


10) Π’ появившСмся ΠΎΠΊΠ½Π΅ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Select All ΠΈ ΠΊΠ½ΠΎΠΏΠΊΡƒ Trust Selected

Если ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° повисла ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π΅ наТимаСтся, ΡƒΠ±Π΅ΠΉΡ‚Π΅ процСсс. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π²ΠΈΡΠ½ΡƒΡ‚ΡŒ Ссли ΠΊΠ»ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² этом ΠΎΠΊΠ½Π΅ ΠΊΡƒΠ΄Π°-Π»ΠΈΠ±ΠΎ ΠΊΡ€ΠΎΠΌΠ΅ Select All ΠΈ Π·Π°Ρ‚Π΅ΠΌ Trust Selected.

11) Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ, пСрСзапуститС Π΅Ρ‘:


12) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ послС пСрСзапуска, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ с исходным ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ, Ρ‚ΠΎ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Β«Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄Β»:

13) НаТмитС Π·Π΅Π»Ρ‘Π½ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ Π½Π° toolbar:


14) Π’ появившСмся ΠΎΠΊΠ½Π΅ настроСк ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НаТмитС «ОК»:

15) Π’ появившСмся ΠΎΠΊΠ½Π΅ Π²Ρ‹Π±ΠΎΡ€Π° интСрфСйса ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π½Π°ΠΆΠΌΠΈΡ‚Π΅ No:


16) Кликая Π² Π½Π°Ρ‡Π°Π»Π΅ строк исполняСмого ΠΊΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова, ΠΎΠ½ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ синими ΠΊΡ€ΡƒΠΆΠΊΠ°ΠΌΠΈ. Π‘ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ останова ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° наТимая Π½Π° ΠΈΠΊΠΎΠ½ΠΊΡƒ с Π·Π΅Π»Ρ‘Π½Ρ‹ΠΌ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ:

ВсС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° toolbar стандартны для ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠ² Π² графичСских срСдах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (IDE): Step into (F5), Step over (F6), Terminate (Ctrl+F2), Resume (F8).


ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° строк большого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° - StringBuffer

1) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

drop table if exists t2;

create table t2 (c1 text, c2 text);

insert into t2 (c1)

VALUES (repeat('a', 1024*1024*512));

update t2 set c2 = c1;

select * from t2;

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ select ΠΏΠΎΡΠ²ΠΈΡ‚ся ΠΎΡˆΠΈΠ±ΠΊΠ°:

ERROR:  out of memory

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Cannot enlarge string buffer containing 536870922 bytes by 536870912 more bytes.

ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ Π² строковый Π±ΡƒΡ„Π΅Ρ€ Π²Ρ‹Π±ΠΈΡ€Π°Π»ΠΎΡΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля c1 ΠΏΠ»ΡŽΡ 10 Π±Π°ΠΉΡ‚. Для Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ значСния Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ поля c2 Π±ΡƒΡ„Π΅Ρ€ пытался ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ поля c2.

2)  ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ с мСньшими полями:

drop table if exists t1;

create table t1 (c1 text, c2 text, c3 text, c4 text);

insert into t1 (c1) VALUES (repeat('a', 1024*1024*256));

update t1 SET c2=c1;

update t1 SET c3=c1;

update t1 SET c4=c1;

select * from t1;

ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ ΠΎΡˆΠΈΠ±ΠΊΠ°:

ERROR:  out of memory

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Cannot enlarge string buffer containing 805306386 bytes by 268435456 more bytes.

ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ Π² строковый Π±ΡƒΡ„Π΅Ρ€ Π²Ρ‹Π±ΠΈΡ€Π°Π»ΠΈΡΡŒ значСния ΠΏΠΎΠ»Π΅ΠΉ c1, c2, c3. Π‘ΡƒΡ„Π΅Ρ€ достиг Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚Ρ€Ρ‘Ρ… ΠΏΠΎΠ»Π΅ΠΉ плюс 18 Π±Π°ΠΉΡ‚. ΠŸΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±ΡƒΡ„Π΅Ρ€Π° Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ поля c4 Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ 1Π“Π±.

         3) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

 postgres=# COPY t2 TO '/tmp/test';

ERROR:  out of memory

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Cannot enlarge string buffer containing 536870913 bytes by 536870912 more bytes.

Π’ΠΎΠ·Π½ΠΈΠΊΠ»Π° Ρ‚Π° ΠΆΠ΅ самая ошибка.

4) Π‘Ρ‚Ρ€ΠΎΠΊΠΈ большС 1Π“Π± ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ столбцам. Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… text ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ поля 1Π“Π±. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰ΡƒΡŽ содСрТимоС ΠΎΠ΄Π½ΠΎΠ³ΠΎ столбца:

 postgres=# COPY t2 (c1) TO '/tmp/test';

COPY 1

 

postgres=# \! ls -al /tmp/test

-rw-r--r-- 1 postgres postgres 536870913 /tmp/test

 

postgres=# \! rm /tmp/test

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ столбца Π±Ρ‹Π»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ.

5) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅:

 drop table if exists t2;

create table t2 (c1 text);

insert into t2 (c1) VALUES (repeat(E'a\n', 357913941));

COPY t2 TO '/tmp/test';

         ΠŸΠΎΡΠ²ΠΈΡ‚ся ошибка:

postgres=# COPY t2 TO '/tmp/test';

ERROR:  out of memory

ΠŸΠžΠ”Π ΠžΠ‘ΠΠžΠ‘Π’Π˜:  Cannot enlarge string buffer containing 1073741822 bytes by 1 more bytes.

         Π‘Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΎ Π½Π° 1 Π±Π°ΠΉΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ строкового Π±ΡƒΡ„Π΅Ρ€Π°.

         Π Π°Π·ΠΌΠ΅Ρ€ поля - Ρ‚Ρ€Π΅Ρ‚ΡŒ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Π° с ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ сторону.

ΠŸΡ€ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π² тСкстовом Π²ΠΈΠ΄Π΅ содСрТимоС поля Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

a\na\na\na\n ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ поля увСличится Π² Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π° Π΄ΠΎ 1073741823 Π±Π°ΠΉΡ‚, Ρ‡Ρ‚ΠΎ Π½Π° 1 Π±Π°ΠΉΡ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ.

6) ΠŸΡ€ΠΈ использовании Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° binary ΠΏΠΎΠ»Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ:

postgres=# COPY t2 TO '/tmp/test' WITH BINARY;

COPY 1

 

postgres=# \! ls -al /tmp/test

-rw-r--r-- 1 postgres postgres 715827909 /tmp/test

 

postgres=# \! rm /tmp/test

         7) ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ сколько памяти выдСляСт сСрвСрный процСсс ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ строки. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

drop table if exists t2;

create table t2 (c1 text, c2 text);

insert into t2 (c1) values (repeat('a', 1024*1024*1024-69));

Π’ процСссС выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ insert, Ссли ΡƒΡΠΏΠ΅Ρ‚ΡŒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ мСнялся объСм занятой ΠΈ свободной памяти (наТимая Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <стрСлка Π²Π²Π΅Ρ€Ρ…> ΠΈ <Enter>):

postgres@tantor:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792   633286656  2788950016   148430848    80027648   607465472  3033432064

Swap:             0           0           0

postgres@tantor:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792  1280106496  2164342784   148439040    80093184   585187328  2386747392

Swap:             0           0           0

postgres@tantor:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792  1514721280  1929728000   148439040    80093184   585187328  2152132608

Swap:             0           0           0

postgres@tantor:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792  1948651520  1495797760   148439040    80093184   585187328  1718202368

Swap:             0           0           0

postgres@tantor:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792  2772905984   671543296   148439040    80093184   585187328   893947904

Swap:             0           0           0

postgres@tantor:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792   656199680  2735239168   148439040    80093184   638197760  3010174976

Swap:             0           0           0

 

ΠŸΠ°ΠΌΡΡ‚ΡŒ выдСляСтся динамичСски.

ИспользованиС памяти ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡŒ Π½Π° ~2Π“Π± (2125635584 Π±Π°ΠΉΡ‚). Π‘Π²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ памяти ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ~670Мб.

         8) Если Π½Π° хостС (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС) Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ физичСской памяти для выдСлСния Π±ΡƒΡ„Π΅Ρ€Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ строк, Ρ‚ΠΎ экзСмпляр ΠΌΠΎΠΆΠ΅Ρ‚ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

 update t2 set c2 = c1;

select * from t2;

сСрвСр Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Π» соСдинСниС

        Π‘ΠΊΠΎΡ€Π΅Π΅ всСго сСрвСр ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ·-Π·Π° сбоя

        Π΄ΠΎ ΠΈΠ»ΠΈ Π² процСссС выполнСния запроса.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру потСряно. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° восстановлСния Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Π°.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру потСряно. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° восстановлСния Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Π°.

!?> \q

postgres@tantor:~$ psql

psql (16.1)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ "help", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку.

Вакая ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΏΡ€ΠΈ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ΅ физичСской памяти. Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ процСсс пытался Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ~4Π“Π± ΠΏΠ°ΠΌΡΡ‚ΠΈ, Π° свободной памяти Π±Ρ‹Π»ΠΎ мСньшС 2.7Π“Π±. oom-kill (out of memory killer) ΡƒΠ±ΠΈΠ» сСрвСрный процСсс. Однако oom-kill ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ±ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ процСссы. ΠŸΡ€ΠΎΡ†Π΅ΡΡ postgres остановил всС процСссы ΠΈ запустил Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ процСссы.

Π’ процСссС динамичСского выдСлСния памяти опСрационная систСма ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π»Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ кэша ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Если Π² кэшС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎ страниц Π½Π΅ записанных Π½Π° диск, опСрационная систСма ΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ Π±Ρ‹ ΠΈΡ… Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ стала ΠΌΠ΅Π½Π΅Π΅ Β«ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΠΉΒ».  

postgres@edu-tantordb-px-001:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792  3190587392   145354752   148439040    80482304   693305344   474697728

Swap:             0           0           0

postgres@edu-tantordb-px-001:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792  3805593600   117968896   148439040      237568   185929728    21350400

Swap:             0           0           0

postgres@edu-tantordb-px-001:~$ free -b -w

              total        used        free      shared     buffers       cache   available

Mem:     4109729792   629743616  3223060480   134189056     4390912   252534784  3134205952

Swap:             0           0           0

 

БообщСния Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы:

postgres@tantor:~$ sudo dmesg

[79734.048885] oom-kill: constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0-1,global_oom, task_memcg=/system.slice/tantor-se-server-16.service,task=postgres,pid=5041,uid=999

[79734.048904] Out of memory: Killed process 5041 (postgres) total-vm:4425648kB, anon-rss:3177400kB, file-rss:4kB, shmem-rss:34624kB, UID:999 pgtables:6444kB oom_score_adj:0

БообщСния Π² Π»ΠΎΠ³Π΅ кластСра:

postgres@tantor:~$ cat $PGDATA/current_logfiles

stderr log/postgresql-000000.log

postgres@tantor:~$ tail -n 15 $PGDATA/log/ postgresql-000000.log

 

[31030] LOG:  server process (PID 31038) was terminated by signal 9: Killed

[31030] DETAIL:  Failed process was running: select * from t2;

[31030] LOG:  terminating any other active server processes

[31030] LOG:  all server processes terminated; reinitializing

[31039] LOG:  database system was interrupted; last known up at 19:58:59 MSK

[31042] FATAL:  the database system is in recovery mode

Failed.

[31039] LOG:  database system was not properly shut down; automatic recovery in progress

[31039] LOG:  redo starts at 116/CE344C0

[31039] LOG:  invalid record length at 116/DF34798: expected at least 26, got 0

[31039] LOG:  redo done at 116/DF34770 system usage: CPU: user: 0.02 s, system: 0.12 s, elapsed: 0.15 s

[31040] LOG:  checkpoint starting: end-of-recovery immediate wait

[31040] LOG:  checkpoint complete: wrote 2105 buffers (12.8%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.025 s, sync=0.003 s, total=0.031 s; sync files=25, longest=0.001 s, average=0.001 s; distance=17408 kB, estimate=17408 kB; lsn=116/DF34798, redo lsn=116/DF34798

[31030] LOG:  database system is ready to accept connections

oom-kill ΠΏΠΎΡΠ»Π°Π» сигнал 9 (SIGKILL) сСрвСрному процСссу, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ select * from t2 пытался Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ памяти, Π½ΠΎ oom-kill ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ ΡΠΈΠ³Π½Π°Π» 9 (SIGKILL) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссам.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ postgres останавливаСт всС процСссы ΠΈ снова запускаСт процСссы, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ запускС экзСмпляра.

 9) Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

postgres=# drop table t1;

DROP TABLE

postgres=# drop table t2;

DROP TABLE

tantorlabs.ru

 ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π°  ΠΈΠ·