как посмотреть sql запрос к базе, зная данные из htop ? те которые висят более часа
Для просмотра SQL-запросов, которые висят более часа, можно использовать различные инструменты в зависимости от типа базы данных. Вот несколько примеров для популярных баз данных:
### PostgreSQL
1. **Использование `pg_stat_activity`**:
```sql
SELECT pid, usename, datname, state, query, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '1 hour';
```
2. **Использование `pg_cancel_backend` или `pg_terminate_backend`** для остановки запросов:
```sql
SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE now() - query_start > interval '1 hour';
```
### MySQL
1. **Использование `information_schema.processlist`**:
```sql
SELECT id, user, host, db, command, time, state, info
FROM information_schema.processlist
WHERE time > 3600;
```
2. **Использование `KILL` для остановки запросов**:
```sql
KILL <process_id>;
```
### Oracle
1. **Использование `v$session` и `v$sql`**:
```sql
SELECT s.sid, s.serial#, s.username, s.status, s.sql_id, q.sql_text
FROM v$session s
JOIN v$sql q ON s.sql_id = q.sql_id
WHERE s.status = 'ACTIVE' AND s.last_call_et > 3600;
```
### SQL Server
1. **Использование `sys.dm_exec_requests` и `sys.dm_exec_sql_text`**:
```sql
SELECT r.session_id, r.status, r.command, r.start_time, t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.start_time < DATEADD(hour, -1, GETDATE());
```
### Общие шаги:
1. **Использование `htop`**:
- Запустите `htop` и найдите процессы, которые висят более часа.
- Запомните PID (Process ID) этих процессов.
2. **Использование базы данных**:
- Подключитесь к базе данных и выполните SQL-запросы, чтобы найти запросы, которые висят более часа.
- Используйте PID из `htop` для идентификации конкретных запросов.
### Пример скрипта на Python для PostgreSQL:
```python
import psycopg2
# Подключение к базе данных
conn = psycopg2.connect(
host="localhost",
database="your_database",
user="your_user",
password="your_password"
)
# Создание курсора
cur = conn.cursor()
# Выполнение запроса
cur.execute("""
SELECT pid, usename, datname, state, query, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '1 hour';
""")
# Получение результатов
rows = cur.fetchall()
# Вывод результатов
for row in rows:
print(row)
# Закрытие курсора и соединения
cur.close()
conn.close()
```
Этот скрипт подключается к базе данных PostgreSQL и выполняет запрос для поиска активных запросов, которые висят более часа. Результаты выводятся на экран.