|
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ°Π±ΠΎΡΠ°. ΠΡΡΡ: Β«ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π‘Π£ΠΠ TantorΒ» |
ΠΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
Π Π°Π·Π΄Π΅Π» 1. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π‘Π£ΠΠ Tantor 7
Π§Π°ΡΡΡ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° 7
Π§Π°ΡΡΡ 2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΡΡΠΈΠ»ΠΈΡΠΎΠΉ initdb 10
Π§Π°ΡΡΡ 3. Π Π΅ΠΆΠΈΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ 15
Π§Π°ΡΡΡ 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
Π§Π°ΡΡΡ 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
Π§Π°ΡΡΡ 1. ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ 65
Π§Π°ΡΡΡ 2. ΠΡΠΎΡΠΌΠΎΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ 66
Π§Π°ΡΡΡ 3. ΠΡΠΎΡΠΌΠΎΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ 66
Π§Π°ΡΡΡ 6. ΠΠ±Π΅ΡΡΠΊΠΈ Π²Π½Π΅ΡΠ½ΠΈΡ Π΄Π°Π½Π½ΡΡ 69
Π Π°Π·Π΄Π΅Π» 3. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ 73
Π§Π°ΡΡΡ 1. ΠΠ±Π·ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ 73
Π§Π°ΡΡΡ 2. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ΠΉ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ 81
Π§Π°ΡΡΡ 3. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΈΠΏΠ° 83
Π§Π°ΡΡΡ 4. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ 85
Π§Π°ΡΡΡ 5. Π€Π°ΠΉΠ» ΡΠ»ΡΠΆΠ± 90
Π Π°Π·Π΄Π΅Π» 4. ΠΠ°Π·Ρ Π΄Π°Π½Π½ΡΡ 92
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠ»Π°ΡΡΠ΅ΡΠ° 92
2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΡΡΠΈ ΠΏΠΎΠΈΡΠΊΠ° Π² ΡΡΠ½ΠΊΡΠΈΡΡ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°Ρ 92
Π§Π°ΡΡΡ 2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΡΡΠΈ ΠΏΠΎΠΈΡΠΊΠ° Π² ΡΡΠ½ΠΊΡΠΈΡΡ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°Ρ 102
Π€ΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠ»Π°ΡΡΠ΅ΡΠ° 105
6. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΈΠ»ΠΈΡΡ pgcompacttable 105
a. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ 105
b. Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΡΠΆΠ°ΡΠΈΡ 105
c. Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ 105
Π§Π°ΡΡΡ 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ 105
Π§Π°ΡΡΡ 2. Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°Π±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° 108
Π§Π°ΡΡΡ 3. Π€Π°ΠΉΠ» ΠΎΠ±ΡΠ΅ΠΊΡΠ° Β«ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΒ» 112
Π§Π°ΡΡΡ 6. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΈΠ»ΠΈΡΡ pgcompacttable 117
Π§Π°ΡΡΡ 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
Π§Π°ΡΡΡ 1. Π Π°Π±ΠΎΡΠΈΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° 225
Π§Π°ΡΡΡ 2. ΠΠ±Π·ΠΎΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° 225
Π§Π°ΡΡΡ 3. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° 225
Π§Π°ΡΡΡ 4. ΠΡΠΎΡΠ°ΠΉΠ»ΠΈΠ½Π³ Π·Π°ΠΏΡΠΎΡΠΎΠ² 225
Π§Π°ΡΡΡ 5. Π’Π΅ΠΊΡΡΠΈΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ 226
Π§Π°ΡΡΡ 6. Π Π΅Π³Π»Π°ΠΌΠ΅Π½ΡΠ½ΡΠ΅ ΡΠ°Π±ΠΎΡΡ 226
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ orafce 227
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ pg_variables 229
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ page_repair 234
Π§Π°ΡΡΡ 1. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ 234
Π§Π°ΡΡΡ 2. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΠ°Π±Π»ΠΈΡΡ 235
Π§Π°ΡΡΡ 3. ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ page_repair 237
Π§Π°ΡΡΡ 4. ΠΠ±Π½ΡΠ»Π΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ 240
ΠΡΠ»Π°Π΄ΠΊΠ° ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ 243
Π§Π°ΡΡΡ 2. ΠΡΠ»Π°Π΄ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π² pgAdmin 247
Π§Π°ΡΡΡ 3. ΠΡΠ»Π°Π΄ΠΊΠ° ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π² DBeaver 249
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΡΠΎΠΊ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° - StringBuffer 258
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΎ:
ΠΠ»Π΅Π³ ΠΠ²Π°Π½ΠΎΠ², ΠΠΌΠΈΡΡΠΈΠΉ ΠΡΠΎΠ½ΡΠΊΠΈΠ½, ΠΠΌΠΈΠ»Ρ Π¨ΠΊΠΎΠ»ΡΠ½ΠΈΠΊ, ΠΠ°ΡΡΡ ΠΠΈΡΠ°ΡΠΈΠ½Π°, ΠΠ»Π΅ΠΊΡΠ°Π½Π΄Ρ ΠΠΎΡΠ±Π°ΡΡΠΊ
! |
ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅
ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: 30 ΠΌΠ°Ρ 2024 Π³. |
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
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", ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΈ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°ΠΌ Π² ΡΠ°Π±ΠΎΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΆΡΡΠ½Π°Π»Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΊΡΡΡΠ°.
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
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)
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)
ΠΠ°Π»ΡΡΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ΡΠ»ΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π±ΡΠ»ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π½ΠΈΠΆΠ΅ Π² ΡΡΠΎΠΌ ΠΏΡΠ½ΠΊΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ, Ρ Π½ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ:
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.
ΠΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Ρ ΡΡΠΈΠ»ΠΈΡΠ°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ 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
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 - Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΎΠΌ. ΠΡΡΠ°Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΎΡΠ΅.
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 Π΅ΡΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½Π° –
Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π½Π΅Π·Π°ΠΊΡΡΡΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ * Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π½Π΅Π·Π°ΠΊΡΡΡΠ°Ρ ΠΊΠ°Π²ΡΡΠΊΠ° ΡΠΎ '
Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½Π°Ρ Π΄Π²ΠΎΠΉΠ½Π°Ρ ΠΊΠ°Π²ΡΡΠΊΠ° ΡΠΎ "
Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π½Π°ΡΠ°ΡΠ°Ρ, Π½ΠΎ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½Π°Ρ $ΡΡΡΠΎΠΊΠ°$ (ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈ Π½Π°Π±ΠΎΡΠ΅ ΡΠ΅ΠΊΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΉ) ΡΠΎ $
Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π»Π΅Π²Π°Ρ ΡΠΊΠΎΠ±ΠΊΠ° Π° ΠΏΡΠ°Π²Π°Ρ ΡΠΊΠΎΠ±ΠΊΠ° Π½Π΅ Π²Π²Π΅Π΄Π΅Π½Π°, ΡΠΎ (
Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ 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 Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² ΡΡΠΎΡ ΡΠ°ΠΉΠ» ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ.
Π ΠΏΡΠ½ΠΊΡΠ΅ 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 ΡΡΡΠΎΠΊΠΈ)
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
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 ΡΡΡΠΎΠΊΠ°)
Π’Π΅ΠΏΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Ρ.
ΠΡΠ²ΠΎΠ΄ - Π²ΠΈΠ΄Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Ρ.
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 ΡΡΡΠΎΠΊ)
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 ΡΡΡΠΎΠΊΠΈ)
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ. Π’Π΅ΠΏΠ΅ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² Π±ΡΡΠ΅ΡΠ½ΠΎΠΌ ΠΊΡΡΠ΅
Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
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 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ.
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
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) ΠΠ°Π³ΡΡΠ·ΠΈΠΌ 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)
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
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 ΡΡΡΠΎΠΊΠΈ)
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
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) ΠΠ°Π³ΡΡΠ·ΠΈΠΌ 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 ΡΡΡΠΎΠΊΠ°)
ΠΠ°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΈΡΡΠΊΠΈ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π΅ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ.
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 ΡΡΡΠΎΠΊΠ°)
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) Π Π°Π·ΠΌΠ΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΡΠΌΠ΅Π½ΡΡΠΈΠ»ΡΡ, ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΡ ΠΎΡΡΠ°Π»ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌ.
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
ΠΠ°Π΄Π°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ.
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) ΠΠ°Π³ΡΡΠ·ΠΈΠΌ 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 ΡΡΡΠΎΠΊΠ°)
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 ΡΡΡΠΎΠΊ)
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 ΡΡΡΠΎΠΊ)
Π£Π±Π΅Π΄ΠΈΠ»ΠΈΡΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΡΠ±Π΅ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ.
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 ΡΡΡΠΎΠΊΠΈ. Π§ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π½ΠΈΠ·ΠΊΠ°Ρ ΡΠ΅Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΈ Π²ΡΡΠΎΠΊΠ°Ρ ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»ΡΠ½ΠΎΡΡΡ.
Π£Π±Π΅Π΄ΠΈΠ»ΠΈΡΡ, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΈΠΌ ΠΈ Π‘Π£ΠΠ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌΡ Π΄ΠΎΡΡΡΠΏΡ.
Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΡΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ 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%
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) ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ 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
…………
………
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)
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 ΡΡΡΠΎΠΊΠΈ)
ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ 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 ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΠΠ. ΠΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π² Π»ΡΠ±ΠΎΠΉ ΠΠ.
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
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
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
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" Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΎΠ·Π½Π°ΡΠ°ΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°.
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.
…
Π‘ΡΡΠΎΠΊΠΈ (Π΅ΡΠ»ΠΈ ΠΈΡ Π±ΡΠ»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΡ ΠΏΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π° Π²ΡΡΡΠ½ΡΡ) Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ shared_buffers ΠΈΡΡΠ΅Π·Π½ΡΡ.
Π ΡΡΠΎΠΌ ΠΏΡΠ½ΠΊΡΠ΅ ΠΌΡ ΠΈΠ·ΡΡΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΡΠ±ΠΈΡΠ°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈΠ· postgresql.auto.conf.
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 ΡΡΡΠΎΠΊΠ°)
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ.
Β«ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΒ» (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 ΡΠ΅ΠΊΡΡΡ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°.
ΠΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ Π·Π°ΡΡΡΠ΄Π½Π΅Π½ΠΈΡ Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΉΠ»Π° ΠΈΠ·-Π·Π° ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠΎ ΡΡΡ ΡΠ°ΡΡΡ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ, Π° ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² Π½ΠΈΠΆΠ΅ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ.
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.
Π¦Π΅Π»Ρ ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΈΠ·ΡΡΠΈΡΡ, ΠΊΠ°ΠΊ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠΎΠ²Π½ΡΡ , ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΠΎΠ²Π½ΠΈ ΠΏΡΠ΅Π²Π°Π»ΠΈΡΡΡΡ.
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;
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) ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ 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.
ΠΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π΅ΡΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
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.
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 Π²ΡΡΡΠ½ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ Π½Π΅Ρ.
ΠΠΎΡΡΡΠΏ ΠΊ Π±Π»ΠΎΠΊΠ°ΠΌ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΠ»ΠΎΡΠ² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ΅Π· Π±ΡΡΠ΅ΡΠ½ΡΠΉ ΠΊΡΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΌΡ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ.
ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΈΠΏ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΡΠΎΠ»Π±ΡΠ° Π±ΡΠ» ΡΠΊΠ°Π·Π°Π½ ΠΊΠ°ΠΊ 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 ΡΡΡΠΎΠΊΠΈ)
ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΡΠ°Π±Π»ΠΈΡΡ 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.
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.
ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°.
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
Π§ΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠΎΠ² ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²… ΠΠΎΡΠΎΠ²ΠΎ
ΠΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π΄Π΅ΡΠ΅Π²Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
Π§ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ… ΠΠΎΡΠΎΠ²ΠΎ
Π£ΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΏΠ°ΠΊΠ΅Ρ 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
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;
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 ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ.
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
ΠΠ°Π³ΡΡΠ·ΠΈΠΌ 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-Π°Π΄ΡΠ΅Ρ ΠΈ ΠΏΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
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
Π£Π±Π΅Π΄ΠΈΠ»ΠΈΡΡ, ΡΡΠΎ ΠΌΠ°ΡΠΊΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ.
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);
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=#
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)
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 | ΠΡ ΠΎΠ΄ Π·Π°ΠΏΡΠ΅ΡΡΠ½
postgres=# ALTER ROLE user1 LOGIN CREATEDB;
ALTER ROLE
postgres=# \du
Π‘ΠΏΠΈΡΠΎΠΊ ΡΠΎΠ»Π΅ΠΉ
ΠΠΌΡ ΡΠΎΠ»ΠΈ | ΠΡΡΠΈΠ±ΡΡΡ
----------------+-------------------------------------------------------------------------
anon_test_user | Π‘ΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
pma_user | Π‘ΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ»ΠΈ
postgres | Π‘ΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ»ΠΈ, Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΠ, Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ, ΠΡΠΎΠΏΡΡΠΊΠ°ΡΡ RLS
replicator | Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ
user1 | Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΠ
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½Π° ΡΠΎΠ»Ρ, ΠΏΠΎΠ΄ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΊ ΠΊΠ»Π°ΡΡΠ΅ΡΡ, Π° ΠΏΠΎΠ΄ Π²ΡΠΎΡΠΎΠΉ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΠ Π½ΠΎ Π½Π΅Π»ΡΠ·Ρ Π΄Π΅Π»Π°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊ ΠΠ.
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".
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 ΡΡΡΠΎΠΊΠ°)
ΠΠΎΠΊΠ° Π½Π΅Ρ Π½ΠΈ Ρ ΠΊΠ°ΠΊΠΎΠΉ ΡΠΎΠ»ΠΈ, ΠΊΡΠΎΠΌΠ΅ ΡΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ.
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
Π£Π΄Π°Π»ΠΈΠΌ ΡΡ Π΅ΠΌΡ.
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) ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ 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 | | |
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)
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 ΡΡΡΠΎΠΊ)
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
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 ΡΡΡΠΎΠΊ)
postgres@tantor:~$ rm -rf $HOME/backup
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) , ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π»ΠΈ.
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
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΎΡΠΊΡΡΠ»ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ (Β«ΡΡΠ΅Π½ΠΈΠ΅-Π·Π°ΠΏΠΈΡΡΒ», ΡΠ΅ΠΆΠΈΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅ΠΉ Π²Π½ΠΎΡΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ), ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
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
ΠΠΎΠΆΠ½ΠΎ ΡΡΠ°Π²Π½ΠΈΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Π½Π° ΡΡΡΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅.
ΠΠ°Π»Π΅Π΅ Π² ΡΡΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΡΠΈΠ»ΠΈΡ Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅, ΡΡΠΎΠ±Ρ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Π½Π° ΡΡΡΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ.
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
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"
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
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
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 ΡΡΡΠΎΠΊΠ°)
ΠΠ»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ΅ΡΡ Π΄Π°Π½Π½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎ ΠΏΠΎΡΠ΅ΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΠΆΠΈΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ.
ΠΡΠ»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ 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) ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
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).
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.
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);
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
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 ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ° Π±ΡΠ»Π° Π²Π·ΡΡΠ° Π² ΠΊΠ°Π²ΡΡΠΊΠΈ.
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
Π³ΠΎΡΠΎΠ²ΠΎ
ΡΠ΅ΡΠ²Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½
ΠΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ (ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΠ°Π±ΠΎΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°) Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π».
Π Π΅ΠΏΠ»ΠΈΠΊΠ° ΡΠΎΠ·Π΄Π°Π½Π°, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π±Π΅Π· Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΆΡΡΠ½Π°Π»ΡΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΠΈΡ .
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
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.
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
Π’ΠΎΡΠΊΠ° ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ° - ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ ΠΌΠ°ΡΡΠ΅ΡΠ°.
Π‘ΠΈΠΌΡΠ»ΠΈΡΡΠ΅ΠΌ ΡΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΆΡΡΠ½Π°Π»ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΡ ΡΠ΅ΠΏΠ»ΠΈΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠΎΡΠΎΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΡ Π² ΠΆΡΡΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ. ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ Π½ΡΠΆΠ΅Π½, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°:
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 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅Ρ, ΠΌΠ°ΡΡΠ΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠ³ ΠΏΡΠΈΠ½ΡΡΡ.
Π‘Π΅ΠΉΡΠ°Ρ ΠΎΠ±Π΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π°ΠΊΠ°ΡΠΈΠ»ΠΈ Π²ΡΠ΅ ΠΆΡΡΠ½Π°Π»ΡΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΡΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ Π»ΡΠ±ΠΎΠΉ ΠΈΠ· ΡΠ΅ΠΏΠ»ΠΈΠΊ ΠΏΠΎΡΠ΅ΡΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
ΠΠ΅ΡΠ²Π°Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° ΡΡΠΏΠ΅Π»Π° ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠ΅Ρ Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° Π±ΡΠ»Π° ΠΊ Π½Π΅ΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π°. ΠΠ° Π²ΡΠΎΡΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΡ ΠΌΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π»ΠΈ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΆΡΡΠ½Π°Π»ΠΎΠ² ΠΌΠ°ΡΡΠ΅ΡΠ°.
ΠΠ°ΡΡΡΠΎΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π±ΡΠ²ΡΠ΅Π³ΠΎ ΠΌΠ°ΡΡΠ΅ΡΠ°.
ΠΠΌΡ ΡΠ»ΠΎΡΠ° Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ 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. ΠΡΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ (ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ).
ΠΠ°ΠΊ ΡΠ΅ΠΏΠ»ΠΈΠΊΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΌΠ°ΡΡΠ΅ΡΠΎΠΌ? ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡ 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 Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΆΡΡΠ½Π°Π»Ρ.
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
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) ΠΠΎΠ²ΡΡΡΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΡ Π½Π° ΠΏΠΎΡΡΡ 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"
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 ΡΡΡΠΎΠΊΠΈ)
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
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 ΡΡΡΠΎΠΊ)
ΠΡ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ Π΄Π²ΡΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ. Π ΠΎΠ΄Π½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°. Π€ΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΎΠ±ΠΎΠΈΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ .
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
1) ΠΠΎΠΉΠ΄ΠΈΡΠ΅ Π² ΠΠ»Π°ΡΡΠΎΡΠΌΡ ΠΏΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅ https://education.tantorlabs.ru/platform/login
2) ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΡΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅: student@student.ru ΠΏΠ°ΡΠΎΠ»Ρ Student123!
3) ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Β«TantorΒ»
4) ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Β«demoΒ».
5) ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ΅ Β«ΠΠ±Π·ΠΎΡΒ» ΠΈΠ·ΡΡΠΈΡΠ΅ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΡ.
ΠΠ·ΡΡΠΈΡΠ΅ Π²ΡΠΏΠ°Π΄Π°ΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ Β«Π‘Π΅ΡΡΠΈΠΈΒ», Β«ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π¦ΠΠ£Β», Β«ΠΠΎΡΡΡΠΏΠ½ΠΎ ΠΠΠ£Β», Β«Π‘Π΅ΡΡΒ», Β«ΠΠ»ΠΎΠΊ ΠΈΠ· Π±ΡΡΠ΅ΡΠ°Β».
1) ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Β«ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈΒ» → Β«Π‘ΡΡΠ°Π½ΠΈΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°Β» β Β«ΠΠΠ ΠΠΠΠ’Π Π« POSTGRESQLΒ».
2) ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ autovacuum_analyze_scale_factor.
3) ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Β«ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΒ».
4) ΠΠ·ΡΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠ»ΡΡΡΠ°.
1) ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Β«ΠΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²ΡΠΈΠΊ Π·Π°ΠΏΡΠΎΡΠΎΠ²Β».
2) ΠΡΠ±Π΅ΡΠ΅ΡΠ΅ Π·Π°ΠΏΡΠΎΡ Ρ ΡΠ°ΠΌΡΠΌ Π±ΠΎΠ»ΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Β«ΠΠ°ΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π±Π»ΠΎΠΊΠΎΠ²Β».
3) ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ»Π΅ Β«Π₯ΡΡ Π·Π°ΠΏΡΠΎΡΠ°Β» β ΠΈΠ·ΡΡΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π·Π°ΠΏΡΠΎΡΠ°.
4) ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π½Π° Π·Π°ΠΊΠ»Π°Π΄ΠΊΡ Β«ΠΠ»Π°Π½ΡΒ».
5) ΠΡΠ±Π΅ΡΠ΅ΡΠ΅ ΠΏΠ»Π°Π½ β Π½Π°ΠΆΠΌΠΈΡΠ΅ Π½Π° Π»ΡΠ±ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΏΡΠ°Π²Π΅Π΅ Β«Π₯ΡΡ Π·Π°ΠΏΡΠΎΡΠ°Β».
6) ΠΠ·ΡΡΠΈΡΠ΅ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠ»Π°Π½ Π·Π°ΠΏΡΠΎΡΠ°.
1) ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Β«Π’Π΅ΠΊΡΡΠ°Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΒ».
2) ΠΡΠ±Π΅ΡΠ΅ΡΠ΅ ΠΠ postgres.
3) ΠΠ·ΡΡΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅Β».
1) ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Β«ΠΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅Β».
2) ΠΡΠ±Π΅ΡΠ΅ΡΠ΅ ΠΠ test_db.
3) ΠΡΠ±Π΅ΡΠ΅ΡΠ΅ Β«Π Π°Π·Π΄ΡΡΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²Β».
4) ΠΡΡΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΠΏΠΎ ΡΠ±ΡΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ Β«ΠΠΠΠ€Π€. Π ΠΠΠΠ£Π’ΠΠ― %Β»
5) ΠΡΠ±Π΅ΡΠ΅ΡΠ΅ ΡΠ°ΠΌΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅ Β«ReindexΒ».
6) ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΡ Β«ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅Β».
7) ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Β«ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅Β».
8) ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΡΡΡΠ»ΠΊΡ Β«ΠΡΡΠΎΡΠΈΡΒ».
9) ΠΠ·ΡΡΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π·Π°ΠΏΡΡΠΊΠ°.
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
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 Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΈ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ. Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΠ΅Π²ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ Π½Π° ΠΎΠ΄ΠΈΠ½ Π²ΡΠ·ΠΎΠ² ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ.
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½Π° ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°. ΠΡΠ»ΠΈ ΠΎΠ½Π° Π΅ΡΡΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΠΏΡΠ½ΠΊΡΡ Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΎΡΡ Π² ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ 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".
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"
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 ΡΡΠ΅Π±ΡΠ΅Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌ Π½Π° ΠΌΠ°ΡΡΠ΅ΡΠ΅ ΠΈ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ΅ Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ° Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΌΠ°ΡΡΠ΅Ρ.
ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌ Π²ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ Π² Π»ΡΠ±ΡΠ΅ Π±Π»ΠΎΠΊΠΈ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½Π½ΡΠ΅.
Π ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΠΏΠ»ΠΈΠΊ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ Ρ Π±ΡΠΊΠ°ΠΏΠΎΠ², Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½Π½ΡΠΉ Π±Π»ΠΎΠΊ Π½Π΅Π»ΡΠ·Ρ. ΠΡΡΠ°Π²Π»ΡΡΡ ΡΠ°ΠΊΠΎΠΉ Π±Π»ΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΡΠΎΠΆΠ΅ Π½Π΅Π»ΡΠ·Ρ - Π²Π°ΠΊΡΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΌΠΎΡΠΎΠ·ΠΊΠ° Π½Π΅ Π±ΡΠ΄ΡΡ ΠΎΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ. ΠΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ±ΠΎΠΉΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΡΡΡΠΎΠΉ. ΠΡΠΈ ΡΡΠΎΠΌ Π²ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π±Π»ΠΎΠΊΠ° ΡΡΠΈΡΠ°Π΅ΡΡΡ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ.
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
ΠΡΠ° ΡΠ°ΡΡΡ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ, ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΠΊΠΎΠ΄ΠΎΠ².
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅, ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π²Π΅Π΄ΡΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°.
ΠΠ»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π½ΡΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (ΡΡΠ΅Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ), ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ»Π°Π΄ΠΊΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΎΠ²: ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠΎΡΠΊΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²Π°, ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π·Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΈ ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅.
Π‘Π΅ΡΠ²Π΅ΡΠ½Π°Ρ ΡΠ°ΡΡΡ - ΠΌΠΎΠ΄ΡΠ»Ρ, (Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅) ΡΠΎΠ·Π΄Π°Π½ΠΎ 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$
;
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).
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).
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