Linux下逐行比较两个文本文件

Linux很多情况下需要逐行比较两个文本文件,并显示出两个文件中所有不同的行。推荐使用diff和vimdiff(需要安装vim)

很多情况下需要逐行比较两个文本文件,并显示出两个文件中所有不同的行。推荐使用diff和vimdiff(需要安装vim)

vimdiff zhuzhan20170830 zhuzhan20170831
:qa! #退出

未分类

cat diffzhuzhan20170831
--- /root/checkdir/zhuzhan20170830  2017-08-30 07:05:03.250349499 +0800
+++ /root/checkdir/zhuzhan20170831  2017-08-31 07:05:02.523044481 +0800
@@ -93,10 +93,12 @@
367b63c971d06817126273caaf7520ff /baidu_push.php
47396f597f8b06e103c7d53014febc80 /vote/index.php
c509a365abe6ced5adb8d09ba59e993d /ViewClick/zt.php
+5d36bb18cf3d737672e856aa67281a2e /ViewClick/zhibojump.php
082a0ee07a3467779091d1d71980965f /ViewClick/ViewMore.php
-3dc18566881ef1420a6f8988cd1eefda /ViewClick/jump.php
-097555dcc2718ece2fac34070a14b1c2 /ViewClick/index.php
-ad168ec79acf8bf3861a099b08a7c0c8 /ViewClick/dell.php
+3dbe6a57c87f1d3d0fe6eef4bd1472bb /ViewClick/jump.php
+3d88ddf568f0279767cf671b10f63484 /ViewClick/index.php
+aa5ce6769a9a8e8e73a4c13aad24753f /ViewClick/dell.php
+40cd750bba9870f18aada2478b24840a /ViewClick/cacheZhiboJump.php
32c01ba72925465a3a437f41ffb9e4ee /uvonclick/index.php
477344028faf48e0cb70088a5cb4c266 /PPHD/index.php
f82b7e6311a0cff4af01092fd07a541f /onclick/index.php
--- /root/checkdir/zhuzhan20170830  2017-08-30 07:05:03.250349499 +0800
+++ /root/checkdir/zhuzhan20170831  2017-08-31 07:05:02.523044481 +0800
@@ -93,10 +93,12 @@

字母”a”、”d”、”c”分别表示添加、删除及修改操作

+ 比较的文件的后者比前着多一行
- 比较的文件的后者比前着少一行

显示结果分成三部分

第一部分是文件的基本信息,“—”表示变动前的文件,“+++”表示变动后的文件。

第二部分,变动的位置用两个@作为起首和结束。@@ -93,10 +93,12 @@,前面的“-93,10”分成三个部分:减号表示第一个文件(即f1),“93”表示第93行,“10”表示连续10行,
合在一起,就表示下面是第一个文件从第93行开始的连续10行。同样的,“+93,12”表示变动后,成为第二个文件从第93行开始的连续12行。

第三部分是变动的具体内容,它将两个文件的上下文,合并显示在一起,每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。

diff的输出可以做为补丁

制作补丁:
  

diff -urN linux-3.4.2 linux-3.4.2-my > linux-3.4.2-my.patch

打补丁:
  

patch -p1 < ../linux-3.4.2-my.patch

修改jenkins目录和端口及启动用户

当前系统Centos6.9,Jenkins版本2.60.2

由于jenkins默认目录安装在/var/lib/jenkins/下,更改目录,移到单独的一个磁盘上

jenkins默认配置文件在/etc/sysconfig/jenkins

目录端口及启动用户都是通过配置文件来更改的

1、修改jenkins目录

vi /etc/sysconfig/jenkins

将JENKINS_HOME=”/var/lib/jenkins”改成JENKINS_HOME=”/data/jenkins”

我这里修改jenkins目录到/data,创建对应的/data目录

mkdir /data

cp -a /var/lib/jenkins/ /data/

2、修改jenkins启动用户

vi /etc/sysconfig/jenkins

JENKINS_USER=”jenkins”改成JENKINS_USER=”root”

这样就是以root用户启动了

3、修改jenkins端口

vi /etc/sysconfig/jenkins

JENKINS_PORT=”8080″改成JENKINS_PORT=”8088″

最后保存,重启jenkins服务

service jenkins restart

这样jenkins端口就改成了8088

Linux检测远程端口是否打开

本文介绍3中检测远程端口方式,telnet、nmap和nc。

如果Linux提示找不到命令,请用apt-get或者yum安装。

1、telnet方式

telnet 101.101.101.101 80

如果提示Connected to 101.101.101.101,说明80端口可以访问。
如果超时,说明端口未开放。

2、nmap方式

命令:

nmap 101.101.101.101 -p 80

# 显示全部打开的端口
nmap ip

根据显示close/open确定端口是否打开。

3、nc方式

命令:

nc -v 101.101.101.101 80

端口未打开返回状态为非0。

Linux系统下find命令递归删除查找目录的方法

本文将会讲述如何使用linux系统下的find查找命令来查找目录或文件,并将查找到的所有文件和目录递归删除掉。

Linux find 命令递归删除非空目录

通常情况下我们会想到find命令里的删除操作是使用-delete选项,但是使用该选项只能删除空目录的文件,不能递归删除该目录里的其它文件。如下面的例子:

$ ls dir1
test1

$ find ./ -name "dir1" -type d -delete
find: cannot delete `./dir1': Directory not empty

可以使用下面的Linux find 命令删除非空目录,如:

$ find ./ -name “dir1” -type d -exec rm -rf {} +

或者

$ find ./ -name “dir1” -type d -exec rm -rf  ;

Linux find 命令结合xargs命令实现删除非空目录

删除当前目录下的所有空目录

$ find ./ -type d -empty -print0 |xargs -0 -i {} rm -rf  “{}”

删除当前目录下所有以“dir”开头的目录

$ find ./ -type d -name “dir*” -print0 |xargs -0 -I {} rm -rf “{}”

Linux 命令行 创建指定大小的文件

经常有看到VPS、服务器等主机商有提供个例如100MB-fremont.bin、100mb.test等的文件,供用户下载测试网络使用。

本文介绍下如何在Linux,命令行下创建指定大小的文件(这里以创建13MB大小的文件onebox.test为例)。

truncate

truncate -s 13M onebox.test

未分类

fallocate

fallocate -l 13000000 onebox.test

未分类

dd

dd if=/dev/urandom of=onebox.test bs=13MB count=1
OR
head -c 13MB /dev/urandom > onebox.test

未分类

dd if=/dev/zero of=onebox.test bs=13MB count=1
OR
head -c 13MB /dev/zero > onebox.test

未分类

额外

13MB=1310001000字节;如果想要1310241024,则替换MB为M,示例:

dd if=/dev/urandom of=onebox.test bs=13M count=1
head -c 13M /dev/zero > onebox.test

未分类

命令fallocate只支持字节(bytes)单位,如果想创建1310241024大小的文件,则1310241024=13631488:

fallocate -l 13631488 onebox.test

未分类

s权限位引发postfix及crontab异常处理

一、问题现象

业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法使用crontab -e 编辑自身任务计划时,也会提示“ crontab: edits left in /tmp/crontab.XXXXCl0bLz” 。

二、问题分析与解决

1、postdrop异常问题

未分类

使用postfix check命令检测发现有如下报错:

postfix/postfix-script: warning: not set-gid or not owner+group+world executable: /usr/sbin/postqueue
postfix/postfix-script: warning: not set-gid or not owner+group+world executable: /usr/sbin/postdrop 

上面的提示其实已经非常清楚了,在这两个可执行文件的组权限中,没有s权限位。慎重起见,不审找了一台主机对比下,发现确实不存在s权限,正常的权限如下:

# ll /usr/sbin/postqueue
-rwxr-sr-x. 1 root postdrop 259992 Jan 27  2014 /usr/sbin/postqueue

解决方法非常简单:

chmod g+s /usr/sbin/postqueue
chmod g+s /usr/sbin/postdrop
postfix reload 

2、crontab普通用户无法编辑问题

使用crontab -e发现可以正常查看,但是编辑完,保存时提示“ crontab: edits left in /tmp/crontab.XXXXCl0bLz” 。即然上面第一个问题是s权限位引起的,这个问题想必也是,所以未做strace 或审计跟踪,地接查看/usr/bin/crontab权限位,发现和正常主机对比,发现用户权限上少了s权限 ---crontab命令和passwd命令类似,需要用户具有s权限位。执行如下命令后,问题解决:

chmod u+s /usr/bin/crontab
rccron restart

注:这点对比了下SuSE和redhat下的区别,发现user权限下如果没有s权限位。在redhat下提示:

You (test) are not allowed to use this program (crontab)
See crontab(1) for more information

而且直接crontab -l命令查看时,都会提示上面的错误。而在SuSE没有这个s权限,仍然可以正常的通过crontab -l 进行查看。

Linux下通过配置Crontab实现进程守护

我们在实际运维过程中,经常会出现某一个程序(如tomcat,perl等)的进程无缘无故就在服务器上消失了,这样的话第一我们需要投入精力去分析它为什么会消失,第二还需要配置相关检查人员,比较耗费时间。

我们可以通过在Linux下写一个shell脚本,并且配置到Crontab中,这样的话当服务器上没有程序进程的时候,让shell自动帮我们完成这个操作,将业务影响的风险降到最低,同时我们可以定期观察Crontab中输出的日志,看是否有这种情况发生,再进行针对性处理,比问题突发起来再处理好很多。

Shell内容:如果需要配置多个程序的话,将最下方注释放开即可。

#!/bin/sh
# 守护脚本,通过 grep 命令检查进程是否存在然后重新启动进程
# 可以配置多个进程
        # 根据进程名判断进程是否消失(行数为0),红字为查询进程关键字,必须唯一
        if test `ps -ef | grep 'programme name' |grep -v vi |grep -v grep| wc -l` -eq 0
        then
                #记录发生时间 ,记录丢失进程名
                echo `date`                        
                echo 'programme name  is missing.And the programme is restarting...!'  
                #重新启动程序,自己配置
                cd /home/inm/ueap-mysql/redis-2.6.17
                src/redis-server redis.conf
        fi

        # 多个进程守护(配置方法与上方相同)
        # if test `ps -ef | grep INASProcessManager |grep -v vi |grep -v grep| wc -l` -eq 0
        # then
        #         echo 'INASProcessManager is missing!'
        #         echo 'INASProcessManager starting!'
        #         java -jar /jh_app/inas/bin/INASProcessManager.jar >> mng.dump &
        # fi

在crontab中配置上以上脚本,并记录日志:

*/3 * * * * /bin/sh /home/aiuap/esb/ueap-collect/watch.sh>>/home/aiuap/esb/ueap-collect/watch.log

使用cgroup限制某个程序对内存的使用

线上的mongodb是复制集模式的。为了便于监控mongodb的慢查询等状态,在3台机器上都部署了packetbeat,通过抓取27017端口的流量发送到ES集群。

但是第二天发现zabbix告警,显示某一台机器A(从节点)上的mongod进程宕了。日志显示是OOM导致的。

未分类

再一想到,我们每天的mongodb的备份脚本是通过远程主机连接到机器A的27017端口进行dump数据的,通过对比zabbix的网卡流量趋势图、备份脚本的执行时间、message日志中OOM的时间点,可以分析出就是因为mongodump时候产生的大量的数据包被packetbeat抓取到并缓存住,造成服务器的内存被吃光了。

解决方法:

关闭这个机器A(从节点)上面的packetbeat进程,或者配置计划任务以确保备份数据的时候,packetbeat进程不要开启。

当然,这里我们还可以用cgroup限制住packetbeat使用的内存大小,这样的话,最多导致packetbeat宕掉,不会影响到mongod进程的正常工作。

以限制mongod使用的内存大小为例(packetbeat的启动有点复杂,没去折腾)

/etc/init.d/cgconfig start 自动会在/cgroup/下生成一堆文件。

mkdir /cgroup/memory/test/    
echo 1024M > /cgroup/memory/test/memory.limit_in_bytes    
echo 1024M > /cgroup/memory/test/memory.memsw.limit_in_bytes    
cgexec -g memory:test /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongod.conf

这样通过cgroup限制后,当mongod使用的内存达到限额1024MB后,进程会被自动kill。

Postgresql数据库主从流复制

由于某个项目前期资源紧张,使用的Postgresql单节点数据库;为解决项目数据库安全性问题,小蜗牛应要求整理Postgresql数据库主从高可用方案,以下操作为部署主从流复制测试过程,后续整理pgpool高可用、负载均衡方案。。

一、安装依赖

yum install -y gcc-c++ zlib-devel vim openssh-clients

二、安装PG

tar zxvf postgresql-9.3.4.tar.gz 
mkdir /opt/pgsql-9.3
cd postgresql-9.3.4
./configure --prefix=/opt/pgsql-9.3/ --without-readline
make -j 2
make install

三、配置PG环境变量

vim /etc/profile
export PGHOME=/opt/pgsql-9.3
export PGDATA=/var/lib/pgsql/9.3/data/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGHOME/lib/
export PATH=$PGHOME/bin:$PATH:$HOME/bin
source /etc/profile

1、添加postgres用户

useradd postgres -d /var/lib/pgsql

四、配置PG主库

1、初始化PG数据库

su - postgres
initdb

2、启动PG数据库,并创建同步用户

pg_ctl -D /var/lib/pgsql/9.3/data/ -l logfile start
psql
postgres# CREATE ROLE replica login replication encrypted password 'replica';

3、配置用户允许远程登录

vi  /var/lib/pgsql/9.3/data/pg_hba.conf
host    replication     replica     192.168.52.0/24                 trust

4、修改PG主库配置,并重启

vi /var/lib/pgsql/9.3/data/postgresql.conf 
listen_addresses = '*'
wal_level = hot_standby  # 这个是设置主为wal的主机
max_wal_senders = 2 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 7 # 设置流复制保留的最多的xlog数目
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的
pg_ctl -D /var/lib/pgsql/9.3/data/ -l logfile restart

五、配置PG备库

1、从库不用初始化,直接同步主库数据

su - postgres
pg_basebackup -F p --progress -D $PGDATA -h 192.168.52.101 -p 5432 -U replica --password

2、添加一个recovery.conf配置文件

vim  $PGDATA/recovery.conf
standby_mode = on  # 这个说明这台机器为从库
primary_conninfo = 'host=192.168.52.101 port=5432 user=replica password=replica'  # 这个说明这台机器对应主库的信息
trigger_file = '/var/lib/pgsql/9.3/data/postgresql.trigger.192.168.52.101'
recovery_target_timeline = 'latest' # 这个说明这个流复制同步到最新的数据

3、修改PG从库配置

vi $PGDATA/postgresql.conf 
max_connections = 1000 # 一般查多于写的应用从库的最大连接数要比较大
hot_standby = on  # 说明这台机器不仅仅是用于数据归档,也用于数据查询
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 1s  # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈

六、验证是否正常同步

1、主库查看

$ psql
psql (9.3.4)
Type "help" for help.
postgres=# select client_addr,sync_state from pg_stat_replication;
  client_addr   | sync_state 
----------------+------------
 192.168.52.102 | async
(1 row)
postgres=# 

2、通过查看进程

ps aux | grep postgres

主节点有如下进程

postgres  74442  0.0  0.2 258652  2424 ?        Ss   15:02   0:00 postgres: wal sender process replica 192.168.52.102(58199) streaming 0/30101D0

从节点有如下进程

postgres   1676  0.0  0.0 113328   748 ?        Ss   15:01   0:00 postgres: stats collector process

3、通过主库增删改查验证

postgres@master ~]$ psql
psql (9.3.4)
Type "help" for help.
postgres=# create table t_user(id int primary key,name varchar(30));
CREATE TABLE
postgres=# dt
         List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | t_user | table | postgres
(1 row)
postgres=# insert into t_user values(1,'kbson');
INSERT 0 1
postgres=# insert into t_user values(2,'kbsonlong');                                                          
INSERT 0 1
postgres=# select * from t_user;
 id |   name    
----+-----------
  1 | kbson
  2 | kbsonlong
(2 rows)
postgres=# 

从库查看是否同步

[postgres@slave ~]$ psql
psql (9.3.4)
Type "help" for help.
postgres=# dt
No relations found.   ##最开始从库并没有表
postgres=# dt
         List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | t_user | table | postgres
(1 row)
postgres=# select * from t_user;
 id |   name    
----+-----------
  1 | kbson
  2 | kbsonlong
(2 rows)
postgres=# 

七、手动测试切换主从

1、手动停止主库,模拟主库宕机

[postgres@master data]$ pg_ctl stop

此时查看从库会提示连接不上主库

LOG:  replication terminated by primary server
DETAIL:  End of WAL reached on timeline 1 at 0/3000518.
FATAL:  could not send end-of-streaming message to primary: no COPY in progress
LOG:  record with zero length at 0/3000518
FATAL:  could not connect to the primary server: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
FATAL:  could not connect to the primary server: could not connect to server: Connection refused
        Is the server running on host "192.168.52.101" and accepting
        TCP/IP connections on port 5432?
FATAL:  could not connect to the primary server: could not connect to server: Connection refused
        Is the server running on host "192.168.52.101" and accepting
        TCP/IP connections on port 5432?

2、从库手动生成触发文件

在从库生成一个触发文件,就是在配置从库中recovery.conf中配置的trigger_file

[postgres@kbsonlong data]$ touch /var/lib/pgsql/9.3/data/postgresql.trigger.5432
    [postgres@kbsonlong data]$ ll /var/lib/pgsql/9.3/data/postgresql.trigger.5432 
-rw-rw-r-- 1 postgres postgres 0 Jul 30 17:49 /var/lib/pgsql/9.3/data/postgresql.trigger.5432

此时日志会提示找到触发文件,自动切换为新的主库

LOG:  trigger file found: /var/lib/pgsql/9.3/data/postgresql.trigger.5432
LOG:  redo done at 0/30004B0
LOG:  last completed transaction was at log time 2017-07-30 17:38:43.592351+08
LOG:  selected new timeline ID: 2
LOG:  archive recovery complete
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

3、新的主库生成测试数据

在新的主库写入测试数据,方便后面旧的主库恢复为从库是查看是否同步数据

postgres=# select * from t_user;
 id |   name    
----+-----------
  1 | kbson
  2 | kbsonlong
(2 rows)
postgres=# insert into t_user values(3,'kbsonlong3');  
insert into t_user values(4,'kbsonlong4');  
insert into t_user values(5,'kbsonlong5');  INSERT 0 1
postgres=# INSERT 0 1
postgres=# 
INSERT 0 1
postgres=# select * from t_user;
 id |    name    
----+------------
  1 | kbson
  2 | kbsonlong
  3 | kbsonlong3
  4 | kbsonlong4
  5 | kbsonlong5
(5 rows)
postgres=# 

4、旧的主库恢复为新的从库

4.1 生成recovery.conf

[postgres@master data]$ cat recovery.conf |grep -v '^#'
    standby_mode = on 
    primary_conninfo = 'host=192.168.52.102 port=5432 user=replica password=replica'   ##注意host指向新的主库
    trigger_file = '/var/lib/pgsql/9.3/data/postgresql.trigger.5432'
    recovery_target_timeline = 'latest'
    [postgres@master data]$

4.2 启动新的从库,并查看数据是否同步

pg_ctl start
[postgres@master data]$ psql 
psql (9.3.4)
Type "help" for help.
postgres=# select * from t_user;
 id |    name    
----+------------
  1 | kbson
  2 | kbsonlong
  3 | kbsonlong3
  4 | kbsonlong4
  5 | kbsonlong5
(5 rows)
postgres=# insert into t_user values(6,'kbsonlong6');  
ERROR:  cannot execute INSERT in a read-only transaction
STATEMENT:  insert into t_user values(6,'kbsonlong6');
ERROR:  cannot execute INSERT in a read-only transaction
postgres=# 

可以看到刚才在新的主库写入的测试数据已经同步,并且无法再次新的从库写入数据

八、配置启动脚本

PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下

Linux文件即为linux系统上的启动脚本

1、修改linux文件属性,添加X属性

#chmod a+x linux

2、 复制linux文件到/etc/init.d目录下,更名为postgresql

#cp linux /etc/init.d/postgresql

3、修改/etc/init.d/postgresql文件的两个变量

prefix设置为postgresql的安装路径:/opt/pgsql-9.3
PGDATA设置为postgresql的数据目录路径:/var/libg/pgsql/9.3/data

4、执行service postgresql start,就可以启动PostgreSQL服务

#service postgresql start

5、设置postgresql服务开机自启动

#chkconfig --add postgresql

Ubuntu PostgreSQL安装和配置

一、安装

1、安装

使用如下命令,会自动安装最新版,这里为9.5

sudo apt-get install postgresql

安装完成后,默认会:

(1)创建名为”postgres”的Linux用户
(2)创建名为”postgres”、不带密码的默认数据库账号作为数据库管理员
(3)创建名为”postgres”的表

安装完成后的一些默认信息如下:

config /etc/postgresql/9.5/main 
data /var/lib/postgresql/9.5/main
locale en_US.UTF-8
socket /var/run/postgresql
port 5432

2、psql命令

安装完后会有PostgreSQL的客户端psql,通过 sudo -u postgres psql 进入,提示符变成: postgres=#
在这里可用执行SQL语句和psql的基本命令。可用的基本命令如下:

password:设置密码
q:退出
h:查看SQL命令的解释,比如h select。
?:查看psql命令列表。
l:列出所有数据库。
c [database_name]:连接其他数据库。
d:列出当前数据库的所有表格。
d [table_name]:列出某一张表格的结构。
du:列出所有用户。
e:打开文本编辑器。
conninfo:列出当前数据库和连接的信息。

二、修改数据库默认账号的密码

1、登录

使用psql命令登录数据库的命令为:

psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432

上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。

输入上面命令以后,系统会提示输入dbuser用户的密码。

psql命令存在简写形式:

如果当前Linux系统用户,同时也是PostgreSQL用户,则可以省略用户名(-U参数的部分)

如果PostgreSQL内部还存在与当前系统用户同名的数据库,则数据库名也可以省略。

2、修改默认管理员账号的密码

以Linux用户”postgres”的身份(此时只有该用户有psql命令)执行psql客户端,进入该客户端的提示符界面(这里系统用户名、数据库用户名、数据库名都为postgres,故可采用简写形式)

sudo -u postgres psql

未分类

postgres=# alter user postgres with password '123456';

这样,管理员”postgres”的密码就为”123456″。
退出psql客户端命令:q
若要删除该管理员的密码,则可用命令:sudo -u postgres psql -d postgres

三、修改Linux用户的密码

这个其实与安装postgresql关系不大。
以Linux用户”postgres”为例,对其运行passwd命令:

zsm@ubuntu:/etc/postgresql/9.5/main$ sudo -u postgres passwd //也可以 sudo passwd postgres
Changing password for postgres.
(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

四、配置数据库以允许远程连接访问

安装完成后,默认只能本地才能连接数据库,其他机子访问不了,需要进行配置。(以下示例开放了最大连接权限,实际配置根据你的需要而定)

1、修改监听地址

sudo gedit /etc/postgresql/9.5/main/postgresql.conf 

将 #listen_addresses = ‘localhost’ 的注释去掉并改为 listen_addresses = ‘*’

2、修改可访问用户的IP段

sudo gedit /etc/postgresql/9.5/main/pg_hba.conf 

在文件末尾添加: host all all 0.0.0.0 0.0.0.0 md5 ,表示允许任何IP连接

3、重启数据库

sudo /etc/init.d/postgresql restart

其他:管理用户、建立数据库等

五、添加新用户和新数据库

方法一:使用PostgreSQL客户端psql

运行系统用户”postgres”的psql命令,进入客户端:

sudo -u postgres psql

创建用户”xiaozhang”并设置密码:

postgres=# create user xiaozhang with password '123456';

创建数据库exampledb,所有者为xiaozhang:

postgres=# create database exampledb owner xiaozhang;

将exampledb数据库的所有权限赋予xiaozhang,否则xiaozhang只能登录psql,没有任何数据库操作权限:

grant all privileges on database exampledb to xiaozhang;

方法二:使用shell命令行

安装PostgreSQL后提供了createuser和createdb命令行程序。

首先创建数据库用户”xiaozhang1″,并指定为超级用户:

sudo -u postgres createuser --superuser xiaozhang1;

接着登录psql控制台设置其密码后退出:

zsm@ubuntu:~$ sudo -u postgres psql
psql (9.5.3)
Type "help" for help.

postgres=# password xiaozhang1;
Enter new password: 
Enter it again: 
postgres=# q

然后在shell命令行下创建数据库并指定所有者:

sudo -u postgres createdb -O xiaozhang1 exampledb1;

方法三:使用paadmin3以管理员连接数据库后创建

经过方法一、方法二操作后,执行 postgres=# du 得到用户列表如下:

未分类

执行 postgres=# l 得到数据库列表如下:

未分类

若要删除用户(如删除xiaozhang)可先 postgres=# drop database example; 再 postgres=# drop user xiaozhang; 。

六、基本数据库操作命令

# 创建新表 
CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);
# 插入数据 
INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');
# 选择记录 
SELECT * FROM user_tbl;
# 更新数据 
UPDATE user_tbl set name = '李四' WHERE name = '张三';
# 删除记录 
DELETE FROM user_tbl WHERE name = '李四' ;
# 添加栏位 
ALTER TABLE user_tbl ADD email VARCHAR(40);
# 更新结构 
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;
# 更名栏位 
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;
# 删除栏位 
ALTER TABLE user_tbl DROP COLUMN email;
# 表格更名 
ALTER TABLE user_tbl RENAME TO backup_tbl;
# 删除表格 
DROP TABLE IF EXISTS backup_tbl;