From 40ba9a93c4d2c5efda94a0de92f5889977594d8a Mon Sep 17 00:00:00 2001
From: ilyamak04 <makilya04@gmail.com>
Date: Tue, 25 Feb 2025 23:10:18 +0300
Subject: [PATCH] commit

---
 docs/linux/Vim.md             |   1 +
 docs/linux/Команды.md         |  20 ++-
 docs/postgresql/Разное.md     |   3 +
 docs/postgresql/Репликация.md | 278 ++++++++++++++++++++++++++++++++++
 4 files changed, 301 insertions(+), 1 deletion(-)
 create mode 100644 docs/postgresql/Репликация.md

diff --git a/docs/linux/Vim.md b/docs/linux/Vim.md
index 706639c..c5e4125 100644
--- a/docs/linux/Vim.md
+++ b/docs/linux/Vim.md
@@ -100,6 +100,7 @@
 - `n` - перейти к строке `n`
 - `set number` - показать номера строк
 - `set nonumber` - скрыть номера строк
+- `%d_` - удалить содержимое файла без копирования в буфер
 
 Чтобы поменять кодировку файла в Vim, выполнить следующие действия:
 
diff --git a/docs/linux/Команды.md b/docs/linux/Команды.md
index fc78e49..976763b 100644
--- a/docs/linux/Команды.md
+++ b/docs/linux/Команды.md
@@ -218,14 +218,31 @@
     ```
 - `tar -zxvf apache-activemq-6.1.3-bin.tar.gz -C /opt` - распаковать в каталог
 - `tar -zxvf apache-tomcat-9.0*tar.gz -C /opt/_Tomcat/application1-8080 --strip-components=1` - каталог apache-tomcat-9.0* не будет создан
+- `tar -czvf logs_archive.tar.gz log1.log log2.log log3.log` - создать архив `.tar.gz`
+- `tar -tzvf logs_archive.tar.gz` - просмотр содержимого архива
 
 ---
+
+- `zip <final_file_name> <file_1> <file_2> <file_N>` (`-r` - рекурсивное сжатие, `-v` - подробный вывод)
+- `zip -u <final_file_name> <file_N+1>` - добавление файлов к существующему архиву
+- `unzip -l <final_file_name>` - проверить содержимое zip-архива
 - `gzip -c <file_name>` - сохранить оригинальный файл после сжатия 
 - `unzip <file_name> -d <dir_name>` - извлечь файлы в указанный каталог
 - `unzip -l <file_name>` - посмотреть содержимое файла без распаковки
 - `gunzip <file_name>` - не сохраняет исходный архив
+- `gunzip -c <file_name>` - распаковывает сжатый .gz файл и выводит его содержимое в стандартный вывод (stdout), без удаления оригинального сжатого файла
 
 
+#### Screen
+
+- `screen -L -Logfile mylog.txt -S mysession` - запуск новой сессии скрин, лог будет писаться в каталог, из которого запустили `screen` (`-a` - писать лог уже в существующий в лог файл)
+
+Чтобы выйти из сессии, нажать `Ctrl + A`, затем `D` (detach). Это вернет в основной терминал, оставив сессию `screen` работать в фоновом режиме.
+
+- `screen -ls` - просмотр активных сессий `screen`
+- `screen -r mysession` - вернуться к сессии
+- `exit` - завершить сессию
+
 ### Система
 - `lsof` - Команда lsof (List Open Files) в Linux используется для отображения списка открытых файлов в системе. В Linux (и Unix-подобных системах) практически все является файлом, включая сетевые соединения и устройства. 
     - `lsof` - просмотр всех открытых файлов
@@ -238,7 +255,7 @@
 
 ---
 
-- `killall -s 9 <hello>` - убивает все процессы в названием hello (`-s` - тип сигнала) 
+- `killall -s 9 <hello>` - убивает все процессы с названием `hello` (`-s` - тип сигнала) 
 - `w` - залогиненые пользователи и время `uptime`
 - `whoami` - имя залогиненного пользователя
 - `uptime` - сколько работает система без перезагрузки 
@@ -376,6 +393,7 @@ mount [OPTIONS] <DEVICE> <MOUNTPOINT>
     - `x` - совпадение всей строки
     
 - `cat <filename> | grep -P "May 2 08:5(3|4|5):"` - ну понятно
+- `grep --text -A 1000000 "2025-02-23 13:00:00" catalina.out > cut.log` - вывести `1000000` строк после `"2025-02-23 13:00:00"` 
 
 ### Логирование
 
diff --git a/docs/postgresql/Разное.md b/docs/postgresql/Разное.md
index 63aecbe..3410779 100644
--- a/docs/postgresql/Разное.md
+++ b/docs/postgresql/Разное.md
@@ -210,6 +210,9 @@ JOIN pg_catalog.pg_stat_activity blocking_activity
 WHERE NOT blocked_locks.GRANTED;
 ```
 ```sql
+select * from pgstats where tablename = '<table_name>' and attname = '<att_name>'
+```
+```sql
 -- использование памяти и ресурсов в БД
 SELECT *
 FROM pg_stat_database;
diff --git a/docs/postgresql/Репликация.md b/docs/postgresql/Репликация.md
new file mode 100644
index 0000000..451b1ca
--- /dev/null
+++ b/docs/postgresql/Репликация.md
@@ -0,0 +1,278 @@
+## Настройка репликации Master-Slave
+
+- `apt install postgresql postgresql-contrib -y` - устанавливаем СУБД на обе машины
+- `systemctl status postgresql`
+
+### Настройка Master
+```conf
+# /etc/postgresql/16/main/postgresql.conf
+listen_addresses = 'localhost,150.241.66.94' # 150.241.66.94 адрес ВМ, на которой slave
+wal_level = replica # минимальный уровень необходимый для репликации
+max_wal_senders = 5 # максимальное количество подключений для передачи WAL, максимум 5 слейвов 
+wal_keep_size = 1024MB
+hot_standby = on # разрешаем селекты с реплики, по умолчанию нельзя
+archive_mode = on # включаем архивирование WAL
+archive_command = 'find /var/lib/postgresql/16/main/archive -type f -mtime +7 -delete; gzip < %p > /var/lib/postgresql/16/main/archive/%f.gz'
+```
+
+```
+# /etc/postgresql/16/main/pg_hba.conf
+# файл pg_hba.conf (Host-Based Authentication) управляет доступом к PostgreSQL, определяя, какие пользователи могут подключаться
+# c каких IP-адресов и каким способом аутентификации
+
+host    replication     replicator      192.168.1.2/32           scram-sha-256
+```
+
+Создадим роль для репликации, выполнить:
+
+```bash
+sudo -u postgres psql
+```
+```sql
+CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD '<password>'; 
+```
+```sql
+\q
+```
+Открыть «MASTER» базу данных, выполнить скрипт на обновление информации о настройках доступа из файла `pg_hba.conf`:
+SELECT pg_reload_conf();
+
+??? info "Сжатый WAL"
+    PostgreSQL не умеет автоматически разархивировать сжатые WAL-файлы.
+    Если WAL-логи в сжатом формате (.gz), то перед восстановлением их нужно разархивировать вручную в `restore_command`.
+
+    Если archive_command на master сжимает WAL при архивации, например:
+
+    archive_command = 'gzip < %p > /var/lib/postgresql/archive/%f.gz'
+
+    То restore_command на slave должен разархивировать WAL перед восстановлением:
+
+    restore_command = 'gunzip -c /var/lib/postgresql/archive/%f.gz > %p'
+
+    Как это работает?
+
+    restore_command ищет запрашиваемый WAL-файл в архиве.
+    Если он найден в сжатом виде (.gz), команда gunzip -c разархивирует его в нужное место (%p).
+
+    slave применяет этот WAL-файл и продолжает репликацию.
+
+### Настройка Slave
+
+По умолчанию реплику (slave) нельзя записывать данные, потому что она работает в режиме только для чтения (read-only), на то она и слейв реплика.
+
+```bash
+sudo systemctl stop postgresql
+```
+```bash
+sudo -u postgres rm -rf /var/lib/postgresql/16/main/*
+```
+```bash
+sudo -u postgres pg_basebackup -h 192.109.139.92 -U replicator -D /var/lib/postgresql/16/main -P -R --wal-method=stream` # 192.109.139.92 - ip мастера
+```
+
+Если файл standby.signal присутствует в директории данных ($PGDATA) при запуске PostgreSQL, сервер не будет принимать записи и будет получать данные с Master.
+Он создаётся автоматически при запуске pg_basebackup с флагом -R или вручную.
+Если удалить standby.signal и перезапустить PostgreSQL, сервер станет обычным Master (потеряет связь с репликой).
+
+После выполнения pg_basebackup в `/var/lib/postgresql/16/main/` на Slave должен появиться файл standby.signal. Он сообщает PostgreSQL, что сервер работает как Standby (slave).
+
+```bash
+sudo systemctl start postgresql
+```
+```bash
+sudo systemctl status postgresql
+```
+```sql
+# проверить репликацию на мастере 
+SELECT * FROM pg_stat_replication;
+```
+```sql
+# проверить репликацию на слейве
+SELECT * FROM pg_stat_wal_receiver; 
+```
+
+На slave после окончания загрузки бд и запуска postgres проверить наличие файла `/var/lib/pgsql/16/data/standby.signal`, а также наличие строки подключения к серверу master в файле `/var/lib/pgsql/16/data/postgresql.auto.conf`
+
+Открыть master базу данных, выполнить скрипт на проверку состояния репликации (скрипт должен вернуть строку, в поле «state» должно быть значение «streaming»)
+```sql
+select * from pg_stat_replication;
+```
+
+Открыть slave базу данных, выполнить скрипт на проверку состояния репликации (скрипт должен вернуть строку, в поле «status» должно быть значение «streaming»)
+```sql
+select * from pg_stat_wal_receiver;
+```
+
+## Бэкапирование
+
+По умолчанию pg_dump создает логический бэкап в формате plain (обычный SQL-скрипт)
+
+В PostgreSQL есть два типа дампов:
+
+- `Физические (pg_basebackup)` — побайтовая копия файлов БД.
+- `Логические (pg_dump, pg_dumpall)` — SQL-скрипты или архивные файлы.
+
+!!! info ""
+    `pg_dumpall` создает резервную копию всех баз данных, роли (пользователи и группы), права доступа (GRANT/REVOKE), настройки tablespace, глобальные параметры (например, настройки аутентификации). Умеет отдавать только дамп в формате .sql
+
+    `pg_dump` не экспортирует роли, права доступа, tablespaces, параметры кластера (например, `pg_hba.conf`)
+
+1. plain (Текстовый SQL-скрипт)
+
+Описание:
+
+В этом формате по дефолту снимает `pg_dump`. Формат plain представляет собой обычный SQL-скрипт, содержащий скрипты `CREATE TABLE`, `INSERT INTO`, `ALTER TABLE` и другие скрипты для создания и наполнения бд .
+
+Дамп в формате `plain`:
+```bash
+pg_dump -U postgres -d mydatabase -Fp -f backup.sql
+```
+Пример содержимого файла дампа:
+
+```sql
+CREATE TABLE users (
+    id SERIAL PRIMARY KEY,
+    name TEXT
+);
+INSERT INTO users (id, name) VALUES (1, 'Alice');
+```
+- Можно редактировать в текстовом редакторе.
+- Можно восстановить частично, скопировав нужные команды.
+- Относительно долгое восстановление, так как все данные вставляются скриптами.
+
+Как восстановить:
+```bash
+psql -U postgres -d mydatabase -f backup.sql
+```
+
+2. custom (Сжатый бинарный формат)
+
+Описание:
+
+Формат custom является бинарным, поддерживает сжатие и позволяет восстанавливать отдельные объекты базы данных, такие как таблицы и схемы.
+
+Как создать дамп в формате `custom`:
+```bash
+pg_dump -U postgres -d mydatabase -Fc -Z 9 -f backup.dump
+```
+Параметры:
+
+- `Fc` - указывает на использование формата custom.
+- `Z 9` - применяет максимальное сжатие дампа.
+- `-a` или `--data-only`: Дамп только данных, без схемы
+- `-s` или `--schema-only`: Дамп только схемы, без данных
+- `-O` или `--no-owner`: Исключает команды SET OWNER из дампа   
+- `-x` или `--no-privileges`: Исключает команды GRANT/REVOKE из дампа.
+
+- Поддерживает выборочное снятие отдельных объектов.
+- Поддерживает параллельное снятие с `-j`.
+
+Посмотреть содержимое дампа без восстановления:
+```bash
+pg_restore -l backup.dump
+```
+
+Как восстановить базу данных:
+```bash
+pg_restore -U postgres -d mydatabase -f backup.dump
+```
+
+3. directory (Каталог с дампом)
+
+Описание:
+
+Формат `directory` сохраняет резервную копию в виде каталога, содержащего отдельные файлы для каждой таблицы и других объектов базы данных. Этот формат позволяет параллельно снимать бэкап.
+
+Дамп в формате `directory`:
+
+```bash
+pg_dump -U postgres -d mydatabase -Fd -j4 -f backup_dir/
+```
+
+Параметры:
+
+- `Fd` — указывает на формат directory.
+- `j4` — использует 4 параллельных потока для ускорения процесса.
+
+- Можно восстанавливать отдельные таблицы и объекты.
+
+Восстановление
+```bash
+pg_restore -U postgres -d mydatabase -j 4 backup_dir/
+```
+
+4. tar (Архив tar)
+Описание:
+
+Формат tar создает архив tar, содержащий все необходимые файлы для восстановления базы данных. Он удобен для хранения и передачи, но восстановление в данном формате выполняется медленнее по сравнению с `directory` или `custom`.
+
+Дамп в формате `tar`:
+```bash
+pg_dump -U postgres -d mydatabase -F t -f backup.tar
+```
+Параметры:
+
+- Ft — указывает на формат tar.
+- Медленное восстановление, так как данные сначала извлекаются из архива.
+
+Восстановление бд:
+```bash
+pg_restore -U postgres -d mydatabase -Ft backup.tar
+```
+
+!!! info ""
+    Все форматы дампов кроме `.sql` восстанавливаются через `pg_restore`
+
+
+### Пример организации бэкапирования
+
+Скрипт `backup.sh` для снятия бэкапа, удаления бэкапов
+```bash
+#!/bin/bash
+
+if [ "$#" -ne 3 ]; then
+    echo "Необходимо передать три аргумента."
+    echo "Пример: $0 <имя_стенда> <имя_базы_данных> <время_жизни_бэкапа_в_днях>"
+    exit 1
+fi
+
+PG_PASSWORD="postgres"
+PG_PORT="5432"
+STAND_NAME="$1"
+DB_NAME="$2"
+BACKUP_TTL="$3"
+BACKUP_DIR="/opt/backups/${STAND_NAME}"
+BACKUP_FILE="${STAND_NAME}_$(date +%Y%m%d).dump"
+LOG_DIR="${BACKUP_DIR}/logs"
+LOG_FILE="${LOG_DIR}/backup_${STAND_NAME}.log"
+
+mkdir -p "${BACKUP_DIR}"
+mkdir -p "${LOG_DIR}"
+
+echo "$(date +%Y%m%d_%H%M%S) Начало резервного копирования базы данных ${DB_NAME}" >> ${LOG_FILE}
+
+PGPASSWORD=${PG_PASSWORD} pg_dump -p ${PG_PORT} -h localhost -U postgres -d ${DB_NAME} -Fc -Z 9 -f "${BACKUP_DIR}/${BACKUP_FILE}" 2>> ${LOG_FILE}
+
+if [ $? -eq 0 ]; then
+    echo "$(date +%Y%m%d_%H%M%S) Резервное копирование успешно завершено: ${BACKUP_DIR}/${BACKUP_FILE}" >> ${LOG_FILE}
+
+    find ${BACKUP_DIR} -type f -name "*.dump" -mtime +${BACKUP_TTL} -exec rm {} \;
+
+    if [ $? -eq 0 ]; then
+        echo "$(date +%Y%m%d_%H%M%S) Бэкапы старше ${BACKUP_TTL} дней удалены." >> ${LOG_FILE}
+    else
+        echo "$(date +%Y%m%d_%H%M%S) Ошибка при удалении бэкапов." >> ${LOG_FILE}
+    fi
+
+else
+    echo "$(date +%Y%m%d_%H%M%S) Ошибка при резервном копировании базы данных ${DB_NAME}" >> ${LOG_FILE}
+fi
+```
+
+Добавить в `cron`
+
+```bash
+# Для снятия бэкапа: <путь к скрипту> <имя каталога для бэкапа> <имя базы данных стенда> <кол-во хранимых бэкапов>
+00 23 * * * /opt/backups/backup.sh stand1 database1 3
+59 23 * * * /opt/backups/backup.sh stand2 database2 3
+```
\ No newline at end of file