PostgreSQL常用操作命令整理

使用yum安装PostgreSQL:

安装PostgreSQL客户端

yum install postgresql-client -y

安装PostgreSQL服务端:

yum install postgresql -y

安装完成后,PostgreSQL服务器会自动在本机的5432端口开启。
安装图形管理界面(可选)

yum install pgadmin3 -y

启动服务

service postgresql start

安装参考:https://www.aliang.org/PostgreSQL/centos7-4-install-postgresql10-1.html

进入控制台

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

退出

postgres=# q

创建用户

CREATE USER youusername WITH PASSWORD 'youpassword';

创建数据库并赋予用户

postgres=# CREATE DATABASE youdbname OWNER youusername;
postgres=# GRANT ALL PRIVILEGES ON DATABASE youdbname to youusername;
postgres=# c youdbname;
postgres=# ALTER SCHEMA public OWNER to dbuser;
postgres=# GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO youusername;
postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO youusername;

查看所有用户

postgres=# du

更改密码

postgres=# password youusername

删除用户

postgres=# drop user youusername ;

查看所有库

postgres=# l

切换数据库

postgres=# c exampledb

常用控制台命令

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

基本的 SQL 语句

# 创建新表
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 ALTER COLUMN email SET DEFAULT '[email protected]';

# 去除字段默认值
ALTER TABLE user_tbl ALTER email DROP DEFAULT;

# 重命名字段
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;

# 删除库
c hello2;
DROP DATABASE IF EXISTS hello;

PostgreSQL获取table名,字段名

PostgreSQL获取数据库中所有table名:

SELECT   tablename   FROM   pg_tables  
WHERE   tablename   NOT   LIKE   'pg%'  
AND tablename NOT LIKE 'sql_%'
ORDER   BY   tablename;

PostgreSQL获取数据库中所有table名及table的注解信息:

SELECT   tablename,obj_description(relfilenode,'pg_class')  FROM   pg_tables  a, pg_class b
WHERE   
a.tablename = b.relname
and a.tablename   NOT   LIKE   'pg%'  
AND a.tablename NOT LIKE 'sql_%'
ORDER   BY   a.tablename;

PostgreSQL获取指定table的所有字段信息:

SELECT col_description(a.attrelid,a.attnum) as comment,format_type(a.atttypid,a.atttypmod) as type,a.attname as name, a.attnotnull as notnull
FROM pg_class as c,pg_attribute as a
where c.relname = 'tablename' and a.attrelid = c.oid and a.attnum>0

Tornado Web服务器多进程启动的2个方法

一、Tornado简介

Tornado 是 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个理想框架。

二、多进程启动方法

正常启动方法:

server = HTTPServer(app)
server.listen(8888)
IOLoop.instance().start()

多进程、方案1:

server = HTTPServer(app)
server.bind(8888)
server.start(0)  # Forks multiple sub-processes
IOLoop.instance().start()

多进程、方案2:

sockets = tornado.netutil.bind_sockets(8888)
tornado.process.fork_processes(0)
server = HTTPServer(app)
server.add_sockets(sockets)
IOLoop.instance().start()

使用简单zzupdate命令轻松升级Ubuntu到较新版本

zzupdate是一个开源的命令行实用程序,通过将几个更新命令组合到一个命令中,使得将Ubuntu桌面版和服务器版升级到更新版本的任务变得容易一些。

将Ubuntu系统升级到更新的版本并不是一项艰巨的任务。 无论是使用GUI还是使用几个命令,都可以轻松地将系统升级到最新版本。

另一方面,由Gianluigi’Zane’Zanettini编写的zzupdate只需一个命令即可处理Ubuntu系统的清理,更新,自动删除,版本升级和作曲者自我更新。

它清理本地缓存,更新可用的软件包信息,然后执行分发升级。 在下一步中,它会更新Composer并删除未使用的软件包。

脚本必须以root用户身份运行。

未分类

安装zzupdate将Ubuntu升级到更新的版本

要安装zzupdate,请在终端中执行以下命令。

curl -s https://raw.githubusercontent.com/TurboLabIt/zzupdate/master/setup.sh | sudo sh

未分类

然后将提供的示例配置文件复制到zzupdate.conf并设置您的首选项。

sudo cp /usr/local/turbolab.it/zzupdate/zzupdate.default.conf /etc/turbolab.it/zzupdate.conf

未分类

一旦你拥有了所有的东西,只要使用下面的命令,它就会开始升级你的Ubuntu系统到一个更新的版本(如果有的话)。

sudo zzupdate

请注意,在正常版本的情况下,zzupdate会将系统升级到下一个可用版本。 但是,当您运行Ubuntu 16.04 LTS时,它将尝试仅搜索下一个长期支持版本,而不是可用的最新版本。

如果您想要移出LTS版本并升级到最新版本,您将需要更改一些选项。

对于Ubuntu桌面,打开“软件和更新”,在“更新”选项卡下,将新的Ubuntu版本的“有新版本时通知我”更改为“适用于任何新版本”。

未分类

对于Ubuntu服务器,编辑版本升级文件

vi /etc/update-manager/release-upgrades

Prompt=normal

未分类

配置zzupdate [可选]

zzupdate选项配置

REBOOT = 1
如果此值为1,升级后将执行系统重新启动。

REBOOT_TIMEOUT = 15
这会将重新启动超时设置为900秒,因为某些硬件比其他硬件重新启动需要更长的时间。

VERSION_UPGRADE = 1
如果升级可用,则执行版本升级。

VERSION_UPGRADE_SILENT = 0
版本进展自动发生。

COMPOSER_UPGRADE = 1
值“1”会自动升级作曲家。

SWITCH_PROMPT_TO_NORMAL = 0
此功能将Ubuntu版本更新为正常状态,即如果您运行了LTS发行版,zzupdate将不会将其升级到Ubuntu 17.10(如果其设置为0)。它将仅搜索LTS版本。相比之下,值1搜索最新版本是否运行LTS或正常版本。

一旦完成,你所要做的就是在控制台中运行一个完整的Ubuntu系统更新

sudo zzupdate

最后

尽管Ubuntu的升级过程本身就很简单,但是zzupdate将它简化为一个命令。没有必要的编码知识,这个过程是完整的配置文件驱动。我个人发现是一个很好的工具来更新几个Ubuntu系统,而不需要分别处理不同的事情。

如何在redhat上安装并配置Postfix

Postfix是一套邮件传输代理(简称MTA),用于发送并接收邮件。在本教程中,我们将安装并配置Postfix,并利用它仅为本地应用发送邮件——所谓本地应用,即与Postfix安装于同一服务器的应用。

一、搭建DNS服务

1.安装bind包

未分类

2.更改主配置文件 vim /etc/named.conf:

未分类

3.更改区域配置文件 vim /etc/named.rfc1912.zones

未分类

4.更改区域数据配置文件

(1) cp -p named.localhost benet.com.zone 将模板配置文件拷贝到新建的区域配置文件中,区域数据配置文件存放在 /var/named/下

未分类

(2) 编辑区域数据配置文件

未分类

未分类

5.重启服务,并测试

未分类

二、postfix配置

linux默认安装好postfix服务包,所以无需安装。

1.编辑postfix配置文件,配置文件是/etc/postfix/main.cf,进行如下的操作。

未分类

未分类

未分类

未分类

2.开启服务

未分类

三、Dovecot配置

1.安装dovecot安装包

未分类

2.编辑/etc/dovecot下的dovecot配置文件dovecot.conf

未分类

3.编辑/etc/dovecot/conf.d/10-mail.conf 开启邮箱的位置及格式

未分类

4.开启dovecot服务

未分类

四、在linux和windows7环境下测试

1.在linux客户端测试

(1).创建邮箱用户组,并创建用户,将用户添加到邮箱组,设置密码

未分类

(2).登陆zhangsan用户,发送给邮件给lisi用户

未分类

(3).用lisi用户登陆到接收邮件服务,并查看邮箱内容

未分类

2.在windows 7 下安装postfix进行测试

(1)关闭linux服务器的防火墙并更改win7 ip地址

未分类

未分类

(2)在fixmail下登陆zhangsan用户,

未分类

发送邮件给lisi

未分类

3)登陆lisi邮箱

未分类

可以看到zhangsan给lisi发的邮件内容。

未分类

Python Web 腾讯云部署:flask+fabric+gunicorn+nginx+supervisor

最近看了《Flask Web开发–基于Python的Web应用开发实战》,还有廖雪峰老师的Python教程,前者是基于Web框架flask进行开发,后者是自己搭建了一个Web框架。Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求。Web框架和Web服务器之间的通信,需要一套双方都遵守的接口协议。WSGI协议就是用来统一这两者的接口的。

为了部署一个完整的环境,本文将使用flask作为Web框架,Gunicorn作为WSGI容器,Nginx作为Web服务器,同时使用Supervisor进行进程管理,并使用Fabric实现自动化部署。

前期准备

申请一个腾讯云服务器Ubuntu Server 16.04.1 LTS 64位:

账户:ubuntu
密码:**********
内网ip:172.16.0.17
外网ip:139.199.184.183

使用《Flask Web开发》源码:

$ mkdir web
$ cd web
~/web$ git clone https://github.com/miguelgrinberg/flasky.git

设置并进入虚拟环境:

~/web$ cd flasky
~/web/flasky$ virtualenv venv
~/web/flasky$ source venv/bin/activate

安装对应的库:

(venv) ~/web/flasky$ cd requirements
(venv) ~/flasky/requirements$ pip3 install -r common.txt
(venv) ~/flasky/requirements$ pip3 install -r dev.txt
(venv) ~/flasky/requirements$ pip3 install -r heroku.txt
(venv) ~/flasky/requirements$ pip3 install -r prod.txt

创建数据库:

(venv) ~/flasky/requirements$ cd ..
(venv) ~/flasky/$ python3 manage.py deploy

Fabric

Fabric入门看这里https://www.jianshu.com/p/0be28f6c4607

新开一个终端,远程登陆服务器:

$ ssh [email protected]

在服务器端定义好部署结构:

ubuntu@VM $ mkdir web
ubuntu@VM $ mkdir web/flasky
ubuntu@VM $ mkdir web/log

即:

  • web/    Web App根目录
    • flasky/  存放python文件
    • log/    存放日志文件

我们使用Fabric将代码上传到服务器,首先,安装Fabric:

(venv) ~/web$ sudo apt-get install fabric

在web目录下创建fabfile.py(必须这个名字),写入:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os, re
from datetime import datetime

# 导入Fabric API:
from fabric.api import *

# 服务器登录用户名:
env.user = 'ubuntu'
# sudo用户为root:
env.sudo_user = 'root'
# 服务器地址,可以有多个,依次部署:
env.hosts = ['139.199.184.183']

_TAR_FILE = 'dist-flasky.tar.gz'

def build():
    includes = ['app', 'migrations', 'requirements', 'tests', 'venv', *.py', '*.sqlite']
    excludes = ['.*', '*.pyc', '*.pyo']
    local('rm -f dist/%s' % _TAR_FILE)
    with lcd(os.path.join(os.path.abspath('.'), 'flasky')):
        cmd = ['tar', '--dereference', '-czvf', '../dist/%s' % _TAR_FILE]
        cmd.extend(['--exclude='%s'' % ex for ex in excludes])
        cmd.extend(includes)
        local(' '.join(cmd))


_REMOTE_TMP_TAR = '/tmp/%s' % _TAR_FILE
_REMOTE_BASE_DIR = '/home/ubuntu/web/flasky'

def deploy():
    newdir = 'flask-%s' % datetime.now().strftime('%y-%m-%d_%H.%M.%S')
    # 删除已有的tar文件:
    run('rm -f %s' % _REMOTE_TMP_TAR)
    # 上传新的tar文件:
    put('dist/%s' % _TAR_FILE, _REMOTE_TMP_TAR)
    # 创建新目录:
    with cd(_REMOTE_BASE_DIR):
        sudo('mkdir %s' % newdir)
    # 解压到新目录:
    with cd('%s/%s' % (_REMOTE_BASE_DIR, newdir)):
        sudo('tar -xzvf %s' % _REMOTE_TMP_TAR)
    # 重置软链接:
    with cd(_REMOTE_BASE_DIR):
        sudo('rm -f flask')
        sudo('ln -s %s flask' % newdir)
        sudo('chown ubuntu:ubuntu flask')
        sudo('chown -R ubuntu:ubuntu %s' % newdir)
    # 重启Python服务和nginx服务器:
    #with settings(warn_only=True):
    #    sudo('supervisorctl stop flask')
    #    sudo('supervisorctl start flask')
    #    sudo('/etc/init.d/nginx reload')

使用fab命令将代码打包:

(venv) ~/web$ mkdir dist
(venv) ~/web$ fab build

将代码传上服务器:

(venv) ~/web$ fab deploy

Gunicorn部署

gunicorn入门看这里https://www.jianshu.com/p/260f18aa5462

代码上传给服务器后,可以直接运行manage.py文件,就可以访问网站了。可是实际情景中需要处理高并发访问的情况,我们使用Gunicorn来解决这个问题。

在服务器上进入flask所在目录,激活虚拟环境,并安装gunicorn:

ubuntu@VM ~/web/flasky/flask$ source venv/bin/activate
(venv) ubuntu@VM ~/web/flasky/flask$  sudo apt-get install gunicorn

使用gunicorn运行web应用(支持4个并发请求):

(venv) ubuntu@VM ~/web/flasky/flask$ gunicorn -w 4 -b 172.16.0.17:5000 manage:app

其中172.16.0.17是服务器内网ip,这样设置后就可以通过外网ip访问网站了。在浏览器地址栏中输入139.199.184.183:5000,就可以看到网站了。

Nginx

Nginx入门看这里

使用gunicorn的话,需要将端口暴露给外界,这不利于服务器的安全问题。Nginx是一个高性能的HTTP和反向代理服务器,通过配置一个代理服务器,可以实现反向代理的功能。所谓反向代理,是指一个请求,从互联网过来,先进入代理服务器,再由代理服务器转发给局域网的目标服务器。

先安装nginx:

(venv) ubuntu@VM ~$ sudo apt-get install nginx

设置反向代理服务器:在服务器,进入目录/etc/nginx/sites-available/,在目录下的default文件写入一个server。

首先,先备份default文件:

$ cd /etc/nginx/sites-available/
$ sudo cp default default-backup

在default文件中写入server:

server {
    listen 80;
    root /home/ubuntu/web/flasky/flask/;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    }
}

配置完成后,重启nginx:

$ sudo nginx -s reload

此时,该反向代理服务器就开始监听80端口。80端口是为HTTP开放的端口,浏览网页服务默认的端口号都是80 (8080端口跟80端口一样)。只要访问服务器,代理服务器就会将请求转发到127.0.0.1:5000.

回到目录/home/ubuntu/web/flasky/flask/下,再次使用gunicorn运行web app:

(venv) ubuntu@VM ~/web/flasky/flask$ gunicorn -w 4 -b 127.0.0.1:5000 manage:app

用的ip地址是127.0.0.1

而外界要访问网站只需要在浏览器地址栏输入139.199.184.183,使用默认端口80。这样web app实际使用的5000就不用暴露了。

Supervisor

supervisor入门看这里https://www.jianshu.com/p/0226b7c59ae2

如果你需要进程一直执行,若该进程因各种原因中断,也会自动重启的话,supervisor是一个很好的选择。

supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常终端,则父进程可以准确的获取子进程异常终端的信息,通过在配置文件中设置autostart=true,可以实现对异常中断的子进程的自动重启。

安装supervisor:

(venv) ubuntu@VM ~$ sudo apt-get install supervisor

在目录/etc/supervisor/conf.d/下创建flask.conf,并加入:

;/etc/supervisor/conf.d/flask.conf

[program:flask]

command     = /home/ubuntu/.local/bin/gunicorn -w 4 -b 127.0.0.1:5000 manage:app
;这里/home/ubuntu/.local/bin/是我服务器上gunicorn的安装目录
directory   = /home/ubuntu/web/flasky/flask
user        = ubuntu
startsecs   = 3
autostart   = true

redirect_stderr         = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups  = 10
stdout_logfile          = /home/ubuntu/web/flasky/log/app.log

配置完后,进入目录/home/ubuntu/web/flasky/, 创建log目录:

(venv) ubuntu@VM ~/web/flasky$ mkdir log

启动supervisor:

(venv) ubuntu@VM /etc/supervisor$ sudo supervisord -c supervisor.conf                 

执行服务(运行app.py):

(venv) ubuntu@VM $ sudo supervisorctl start flask

此时,进程flask运行,执行command后边的语句,即/home/ubuntu/.local/bin/gunicorn -w 4 -b 127.0.0.1:5000 manage:app。

在浏览器地址栏输入139.199.184.183,使用默认端口80,即可访问网站。

如果supervisor遇到错误,可以在/var/log/supervisor/supervisord.log中查看日志;
如果app运行出现问题,可以在 /home/ubuntu/web/flasky/log/app.log中查看日志。

自动化部署

为了实现自动化部署,将上边fabfile.py文件的最后四个语句的注释取消,就能在将修改后的代码传上服务器后,用supervisor自动重载配置并重启flask进程。之后便可以直接访问网站。
因此,每次更改代码后,只需要执行以下两个语句,无需登陆服务器,便可以启动网站:

$ fab build
$ fab deploy

gunicorn配置文件

gunicorn的配置除了可以在命令行中设置,也可以使用配置文件实现更复杂的配置:

$ gunicorn -c gunicorn.py manage:app

gunicorn.py文件如下:

# gunicorn.py
import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing
bind = '127.0.0.1:5000'       #绑定ip和端口号
backlog = 512                 #监听队列
chdir = '/home/test/server/bin'   #gunicorn要切换到的目的工作目录
timeout = 30      #超时
worker_class = 'gevent' #使用gevent模式,还可以使用sync 模式,默认的是sync模式
workers = multiprocessing.cpu_count() * 2 + 1    #进程数

threads = 2 #指定每个进程开启的线程数

loglevel = 'info' #日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'     #设置gunicorn访问日志格式,错误日志无法设置
"""
其每个选项的含义如下
        h           remote address
        l           '-'
        u           currently '-', may be user name in future releases
        t           date of the request
        r           status line (e.g. ``GET / HTTP/1.1``)
        s           status
        b           response length or '-'
        f           referer
        a           user agent
        T           request time in seconds
        D           request time in microseconds
        L           request time in decimal seconds
        p           process ID
        {Header}i   request header
        {Header}o   response header
"""
accesslog = "/home/ubutnu/web/flasky/log/gunicorn_access.log"      #访问日志文件
errorlog = "/home/ubutnu/web/flasky/log/gunicorn_error.log"        #错误日志文件

在本地将gunicorn.py放在/home/ubutnu/web/flasky/flask/目录下,在服务器端将/etc/supervisor/conf.d/flask.conf中的command改为:

command     = /home/ubuntu/.local/bin/gunicorn -c /home/ubutnu/web/flasky/flask/gunicorn.py manage:app

然后,在本地执行:

$ fab build
$ fab deploy

便可以访问网站了。

未分类

Ubuntu 下搭建微信小程序开发环境

ubuntu 下首次搭建微信小程序开发环境

首先安装 wine,参考 https://wiki.winehq.org/Ubuntu

安装微信小程序开发工具

1.拉取小程序工具代码:git clone [email protected]:cytle/wechat_web_devtools.git
2.进入小程序工具目录:cd wechat_web_devtools
3.安装 wxdt:./bin/wxdt install
4.启动:./bin/wxdt

升级小程序开发工具

更新 github 仓库即可

git pull origin

但是更新过程异常缓慢,因为源码库太大了,属于滥用了。

已测试环境

Ubuntu 18.04
Ubuntu 16.10

CentOS 7 root 密码重置

平日里让运维人员头疼的事情已经很多了,因此偶尔把 Linux 系统的密码忘记了并不用慌,只需简单几步就可以完成密码的重置工作。但前提是必须可以直接登录系统终端,也就是直连主机,因为需要修改启动项。

步骤一:重启系统

首先要重启系统,在出现启动项选项时快速按下 ⬆️ 或 ⬇️,避免系统自动选择。然后选择第一项,按下 e 键进入引导编辑界面。
未分类

步骤二:编辑引导选项

在 linux16 参数这行的最后面追加 rd.break 参数,然后按下 Ctrl+X 来运行修改过的引导选项。
未分类

步骤三:修改 root 密码

重新引导后,即可进入系统的紧急求援模式。
未分类
这时候,依次输入以下命令即可修改 root 密码。

mount -o remount,rw /sysroot
chroot /sysroot
passwd
touch /.autorelabel
exit
reboot

未分类
由于我安装时系统选择的是中文,所以在终端上密码提示显示的是方块。
重启后即可以新密码进入系统。

Centos 7 查看内存占用情况相关命令

1、 top命令

top命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令。
按 q 退出
未分类

2、free -m:看内存占用

未分类
主要看第一行Mem 总共 15710 M , 使用了 823 M , 剩余空闲 7895 M 。这个shared 223M 也不知道用在哪里。

3、 df -h :看硬盘占用率

未分类

Shell中使用grep、sed正则提取、替换字符串

Linux中使用grep正则提取字符串

echo office365 | grep -P 'd+' -o
find . -name "*.txt" | xargs grep -P 'regex' -o

xargs会将find结果作为grep的输入,防止find结果过多无法处理
-P参数表明要应用正则表达式
-o表示只输出匹配的字符串,这样我们就可以把正则匹配到的结果拿到了。

Linux、Mac OS中使用sed正则提取字符串

Mac OS上用正则的话要用e参数取代P参数,也可以用sed命令:
sed命令格式:

sed 's/oldValue/newValue/g'

提取字符串

echo here365test | sed 's/.*ere([0-9]*).*/1/g'

输出:

365

s表示替换,1表示用第一个括号里面的内容替换整个字符串,sed支持*,不支持?、+,不能用d之类,正则支持有限。

替换字符串

echo here365test | sed 's/365/789/g'

输出:

here789test