Introduction
This post compiles useful SQL scripts and commands for common database administration tasks across MySQL, Oracle, and PostgreSQL. These scripts help with version checking, monitoring, user management, performance analysis, and maintenance operations.
MySQL
1. Display version info of DB
mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.7.28 |
+-----------+
2. Display DB instance info
mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| innodb_version | 5.7.28 |
| protocol_version | 10 |
| slave_type_conversions | |
| tls_version | TLSv1,TLSv1.1,TLSv1.2 |
| version | 5.7.28 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86_64 |
| version_compile_os | macos10.14 |
+-------------------------+------------------------------+
3. Display the status of DB schema
mysql> SELECT table_schema, SUM(data_length + index_length)/1024/1024 AS "Size (MB)" FROM information_schema.tables GROUP BY table_schema;
+--------------------+------------+
| table_schema | Size (MB) |
+--------------------+------------+
| iems | 2.70312500 |
| iems_quartz | 0.64062500 |
| information_schema | 0.15625000 |
| mysql | 2.58428860 |
| pdcs | 0.06250000 |
| performance_schema | 0.00000000 |
| sys | 0.01562500 |
+--------------------+------------+
4. Display DB connection info
mysql> SHOW PROCESSLIST;
+----+------+-----------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------+------+---------+------+----------+------------------+
| 3 | root | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST |
| 5 | root | localhost:50373 | NULL | Sleep | 527 | | NULL |
| 6 | root | localhost:50374 | NULL | Sleep | 527 | | NULL |
| 7 | root | localhost:50382 | NULL | Sleep | 1084 | | NULL |
| 8 | root | localhost:50383 | NULL | Sleep | 2 | | NULL |
+----+------+-----------------+------+---------+------+----------+------------------+
5. Display status of cache hits
mysql> SHOW STATUS LIKE "Qcache_hits";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 0 |
+---------------+-------+
6. Display use of the tables
mysql> SHOW OPEN TABLES WHERE In_use > 0;
+--------------------+------------------------------------------------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+--------------------+------------------------------------------------------+--------+-------------+
| ***** | ***** | ? | ? |
...
7. Display slow log
mysql> SELECT * FROM mysql.slow_log;
8. Display index info
mysql> SHOW INDEX FROM mysql.user;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user | 0 | PRIMARY | 1 | Host | A | NULL | NULL | NULL | | BTREE | | |
| user | 0 | PRIMARY | 2 | User | A | 4 | NULL | NULL | | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
9. Display status of procedure or function
mysql> SHOW PROCEDURE STATUS;
mysql> SHOW FUNCTION STATUS;
10. DB backup and restore
mysqldump -u username -p database_name > backup.sql
mysql -u username -p database_name < backup.sql
11. Search DB user
mysql> SELECT USER, Host FROM mysql.user;
+---------------+-----------+
| USER | Host |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
12. Create a new user and give permissions
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database_name.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;
13. Change password for a user
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
14. Optimize table
OPTIMIZE TABLE table_name;
15. Display DB status
mysql> SHOW STATUS;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| ***** | ? |
...
Oracle
1. Search locked processes and unlock
SELECT L.SESSION_ID, S.SERIAL#, L.ORACLE_USERNAME, L.OS_USER_NAME, S.MACHINE, S.TERMINAL, O.OBJECT_NAME
FROM V$LOCKED_OBJECT L
INNER JOIN ALL_OBJECTS O ON O.OBJECT_ID = L.OBJECT_ID
INNER JOIN V$SESSION S ON S.SID = L.SESSION_ID;
ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#';
2. Monitor queue
SELECT b.SID, b.serial#, b.username, machine, event, wait_time, ...
FROM v$session_wait a, v$session b
WHERE a.event = 'enqueue' ...;
3. Display tablespace I/O
SELECT df.tablespace_name, f.phyrds, f.phywrts ...
FROM v$filestat f, dba_data_files df
WHERE f.file# = df.file_id;
4. Display DB objects (an example for displaying table objects)
SELECT object_name
FROM user_objects
WHERE object_type = 'TABLE';
5. Display user privileges
SELECT * FROM session_privs;
6. Change user password
ALTER USER username IDENTIFIED BY "newpassword";
7. Create and delete a user
CREATE USER username IDENTIFIED BY "password";
DROP USER username CASCADE;
8. Give permissions to user
GRANT CREATE SESSION, CREATE TABLE TO username;
9. Display datafile I/O
SELECT substr(a.file#,1,2) "#", substr(a.name,1,30) "Name", a.status, a.bytes, b.phyrds, b.phywrts
FROM v$datafile a, v$filestat b
WHERE a.file# = b.file#;
PostgreSQL
1. Display version info
SELECT version();
2. Display database size
SELECT pg_database.datname,
pg_size_pretty(pg_database_size(pg_database.datname)) AS size
FROM pg_database
ORDER BY pg_database_size(pg_database.datname) DESC;
3. Display table sizes
SELECT schemaname, tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
4. Display active connections
SELECT pid, usename, application_name, client_addr, state, query_start, query
FROM pg_stat_activity
WHERE state = 'active';
5. Display database connections info
SELECT datname, usename, application_name, client_addr, state, count(*)
FROM pg_stat_activity
GROUP BY datname, usename, application_name, client_addr, state;
6. Display locks
SELECT blocked_locks.pid AS blocked_pid,
blocking_locks.pid AS blocking_pid,
blocked_activity.usename AS blocked_user,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement,
blocking_activity.query AS blocking_statement
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;
7. Kill a query/connection
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = <process_id>;
8. Display index usage
SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes
ORDER BY idx_scan ASC;
9. Display slow queries
SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes'
AND state != 'idle';
10. Display table statistics
SELECT schemaname, tablename,
n_tup_ins AS inserts,
n_tup_upd AS updates,
n_tup_del AS deletes,
n_live_tup AS live_tuples,
n_dead_tup AS dead_tuples,
last_vacuum,
last_autovacuum,
last_analyze,
last_autoanalyze
FROM pg_stat_user_tables
ORDER BY schemaname, tablename;
11. Display user information
SELECT usename, usesuper, usecreatedb, usecreaterole
FROM pg_user;
12. Create a new user and give permissions
CREATE USER newuser WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE database_name TO newuser;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO newuser;
13. Change user password
ALTER USER username WITH PASSWORD 'new_password';
14. Display database objects
SELECT table_schema, table_name, table_type
FROM information_schema.tables
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name;
15. Vacuum and analyze
VACUUM ANALYZE table_name;
16. DB backup and restore
pg_dump -U username -d database_name > backup.sql
psql -U username -d database_name < backup.sql
References
blog comments powered by Disqus