猫哥负责公司的postgre-XL数据库集群已经有一年多的时间,总结了一套postgre数据库的运维方法,涉及数据库日志查看、集群重启、自定义词典、数据库参数分类、数据库用户创建、数据库常用运维指令等。
★查看pg集群日志:
node1节点,路径:/home/postgres/pgxc_ctl/pgxc_log
★查看pg日志:
非gtm节点
路径:/data1/pgxl_1/nodes/coord/pg_log
ps:coord中的pg_log保存的是该服务器的连接日志
dn_master的pg_log保存的是数据库数据具体操作日志
★集群重启:
node1节点(gtm)
停止:pgxc_ctl -c /home/pgxl/pgxc_ctl/pgxc_ctl.conf stop all
启动:pgxc_ctl -c /home/pgxl/pgxc_ctl/pgxc_ctl.conf start all
★文件传输(Bash命令)
scp dict_extra.txt root@node2:/usr/pgsql-10/share/tsearch_data
★自定义词典路径(只需修改node2节点)
第一步: /home/postgres/pgxl/share/tsearch_data/dict_extra.txt
第二步:并在postgres.conf中添加:
zhparser.extra_dicts = "dict_extra.txt"
hparser.dict_in_memory = true
★修改数据库用户密码
第一步:登录每个服务器的pg数据库,修改对应用户名的密码:alter user "postgres" with password '123456';
第二步:登录每台服务器(除gtm)修改协调节点和数据节点下的pg_hba.conf文件(路径:/data1/pgxl_1/nodes/coord;/data1/pgxl_1/nodes/dn_master),将对应的Method设置为password;
第三步:重启集群
★数据库主进程:postmaster
路径:/usr/local/pgxl/bin/postmaster
##查看系统信息的常用命令
★查看缓存命中率ratio (缓存命中率不可低于99%,如果低于了99%,表明,cache效率太低了,需要增大shared buffer。)
SELECT blks_read,blks_hit, blks_hit::numeric / (blks_read + blks_hit ) AS ratio FROM pg_stat_database WHERE datname = 'postgres' ;
★查看数据库的大小
SELECT pg_database_size('postgres'), pg_size_pretty(pg_database_size('postgres'));
★查看具体表的大小
包括索引: SELECT pg_size_pretty(pg_total_relation_size('dwd_match_20180601_simple'));
不包括索: SELECT pg_size_pretty(pg_relation_size('dwd_match_20180601_simple'));
仅索引: SELECT pg_size_pretty(pg_indexes_size('dwd_match_20180601_simple'));
★查看全局表空间(pg_global)和默认表空间(pg_default)的大小
SELECT pg_size_pretty(pg_tablespace_size('pg_global'));
SELECT pg_size_pretty(pg_tablespace_size('pg_default'));
##系统维护的常用命令
★修改postgres.conf后,使修改生效的方法(仅针对生效的配置项均为不需要重启数据库服务的)
方法一,在操作系统中使用如下命令:pg_ctl reload
方法二,在psql中使用如下命令:SELECT pg_reload_conf();
★取消一个长时间执行的SQL方法
*pg_cancel_backend(pid) :取消一个正在执行的SQL
*pg_terminate_backend(pid) :终止一个后台服务进程,同事释放此后台进程的资源
PS:这两个函数的区别是,前者实际上是给正在执行的SQL任务配置一个取消标志,正在执行的任务在合适的时候检测到此标志后会主动退出;但此任务没有主动检测到这个标志,则该任务就无法正常退出,这是就需要使用后者来终止SQL命令。
具体过程:
1.SELECT pid, usename,query_start, query from pg_stat_activity WHERE datname='postgres' and state='active';
2.SELECT pg_cancel_backend(pid)
3.若取消不了,则用 SELECT pg_terminate_backend(pid);
##PG参数分类:
internal:只读参数,由postgres程序和在初始化实例时写死。
postmaster:改变这些参数的值需要重启PostgreSQL。在postgres.conf中修改这些参数后,需要重启PG才能生效。
sighup:在postgres.conf中修改这些参数后,不需要重启PG,reload即可。
backend:在postgres.conf中修改这些参数后,不需要重启PG,reload即可。
superuser:这类参数可以由超级用户使用set来改变,不需要重启PG,reload即可。
user:除普通用户可以改变外,此参数与superuser参数没有区别。
★查看参数类型:
SELECT name, context FROM pg_settings WHERE name LIKE 'shared_buffers';
★reload语法
pg_ctl reload -D /home/postgres/pgdata
★创建只读用户
1.REVOKE CREATE ON SCHEMA public from public;(收回建表权限)
2.CREATE USER readonly with password '123456';(创建readonly用户)
3.GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;(将当前public 下的schema下的所有表的SELECT权限赋予readonly)
4.ALTER DEFAULT PRIVILEGES IN SCHEMA public grant select on tables to readonly; (将今后新建表的SELECT权限赋予readonly
若希望此用户访问其他schema下的表,需要重复执行如下语句:
5.GRANT SELECT ON ALL TABLES IN SCHEMA other_schema TO readonly;
6.ALTER DEFAULT PRIVILEGES IN SCHEMA other_schema grant select on tables to readonly;
★查看某用户的表权限
SELECT* FROM information_schema.table_privileges WHERE grantee='readonly';
★lunix查看表数据具体存放的数据节点
方法一:\d+ tablename;
方法二:EXPLAIN TABLE tablename
★ EXPLAIN(执行计划的解释)
联合使用analyze选项和buffers选项,可通过实际执行来查看实际的代价和缓冲区命中的情况,命令如下: EXPLAIN ( analyze true, buffers true) SELECT * FROM tablename;
ps具体含义:在共享内存中直接读到16284个块,整行表示从磁盘中共读了196482,写了196450块。为什么select会写?因为共享内存中有脏块,从磁盘中读出的块必须把内存中的脏块挤出去,所以产生了很多的写