清明---风大雨急

岁月无声,时间如飞;

又到一年清明节,降温、下雨、大风冷嗖嗖,温度骤降,夜无眠;

想起了很多......
qingming.jpg

生活,生容易,活不易;

操蛋的社会;

谁不是喊着不想活了,又努力活着......

为了谁?为了打破自己所处的阶层;

我们不都是如此么?

安装greenplum-cc-web-3.2.0监控工具

所有节点都提前部署好了greenplum-db数据库,且数据库及节点能启动正常并可访问,参考安装文档:https://mhl.xyz/PostgreSQL/GreenPlum.html
一、解压安装

unzip greenplum-cc-web-3.2.0-LINUX-x86_64.zip
./greenplum-cc-web-3.2.0-LINUX-x86_64.bin
安装过程中控制台提示一律yes

greenplum-cc-web默认安装在/usr/local/目录下
在/home/gpadmin/.bash_profile文件中增加

source /usr/local/greenplum-cc-web/gpcc_path.sh

赋予gpadmin用户权限:

chown -R gpadmin:gpadmin /usr/local/greenplum-cc-web-3.2.0
chown -R gpadmin:gpadmin /usr/local/greenplum-cc-web

给其他三台机器安装greenplum-cc-web

cat /usr/local/greenplum-db/gpconfig/dw234
smdw
sdw1
sdw2
gpccinstall -f /usr/local/greenplum-db/gpconfig/dw234

在/data/gpmaster/gpseg-1/pg_hba.conf中添加用户登录权限(如果不添加可能会导致不能创建gpcc实例)

host  all   all   ::1/128  trust

重启GP

gpstop -r

设置the Command Center Console

[gpadmin@dw01 ~]$ gpcmdr --setup

The instance name identifies the GPDB cluster this Greenplum Command Center web UI monitors and controls.
Instance names can contain letters, digits, and underscores and are not case sensitive.

Please enter the instance name
gpmon_ys

The display name is shown as the "server" in the web interface and does not need to be
a hostname.Display names can contain letters, digits, and underscores and ARE case sensitive.

Please enter the display name for this instance:(Press ENTER to use instance name)
gpmon_db

A GPCC instance can be set to manage and monitor a remote Greenplum Database.
Notice: remote mode will disable these functionalities:
1. Standby host for GPCC.
2. Workload Manager UI.

Is the master host for the Greenplum Database remote? Yy/Nn (default=N)
n

What port does the Greenplum Database use? (default=5432)


Enable kerberos login for this instance? Yy/Nn (default=N)
n

Creating instance schema in GPDB.  Please wait ...

The Greenplum Command Center runs a small web server for the UI and web API.
This web server by default runs on port 28080, but you may specify any available port.

What port would you like the new web server to use for this instance? (default=28080)


Users logging in to the Command Center must provide database user
credentials. In order to protect user names and passwords, it is recommended
that SSL be enabled.

Enable SSL for the Web API Yy/Nn (default=N)
n

Copy the instance to a standby master host Yy/Nn (default=Y)
y

What is the hostname of the standby master host?
smdw
standby is smdw
Done writing webserver configuration to  /usr/local/greenplum-cc-web/instances/gpmon_ys/webserver/conf/app.conf
Copying instance gpmon_ys to host smdw ...
=>Cleanup standby host's instance gpmon_ys if any ...
=>Copying the instance folder to standby host ...

Creating instance at /usr/local/greenplum-cc-web/instances/gpmon_ys

Greenplum Command Center UI configuration is now complete.

To change parameters of this instance, edit the configuration file
at /usr/local/greenplum-cc-web/instances/gpmon_ys/webserver/conf/app.conf

To configure multi-cluster view, edit the configuration file at /usr/local/greenplum-cc-web/instances/gpmon_ys/conf/clusters.conf

The web UI for this instance is located at http://dw01:28080

You can now start the web UI for this instance by running: gpcmdr --start gpmon_ys

启动实例

gpcmdr --start gpmon_ys
Starting instance gpmon_ys ...
Greenplum Command Center UI for instance 'gpmon_ys' - [RUNNING on PORT: 28080, pid 11984]

访问console,打开浏览器,在地址栏输入http://mastert[或者你主机的ip地址]:28080,如果出现以下界面,那么恭喜你,你的greenplum-cc-web全部安装成功!
web1.png
用户名是默认的gpmon
密码是安装Performance Monitor时的密码,登陆进去界面如下:
web2.png
web3.png
官方安装文档:
https://gpcc.docs.pivotal.io/320/gpcc/topics/setup-software.html

ucloud云上部署GreenPlum4.3.12集群

一、机器环境、版本如下:
操作系统:CentOS6.5
数据库版本:
greenplum-db-4.3.12.0-rhel5-x86_64
greenplum-cc-web-3.2.0-LINUX-x86_64

节点信息:

主机名        Ip地址          说明
mdw          172.28.1.11     主库master
smdw         172.28.1.12     备库standby master
sdw1         172.28.1.13     segment库节点一
sdw2         172.28.1.14     segment库节点二

二、系统初始化设置(四台机器都修改)
1、修改系统参数/etc/sysctl.conf

kernel.shmmax = 500000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 250 512000 100 2048
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.arp_filter = 1
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 1025 65535
net.core.netdev_max_backlog = 10000
vm.overcommit_memory = 2

2、文件句柄数修改/etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
* soft core unlimited

3、关闭selinux、iptables

修改/etc/selinux/config中SELINUX=disabled
关闭iptables
service iptables stop
chkconfig iptables off

4、调整磁盘IO调度
Linux磁盘I/O调度器对磁盘的访问支持不同的策略,默认的为cfq,GreenPlum建议设置为deadline
查看磁盘的I/O调度策略,看到默认的为[cfq]

查看系统分区情况:
[root@dw01 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  3.3G   16G  18% /
tmpfs            12G     0   12G   0% /dev/shm
/dev/vdb        493G  311M  467G   1% /data
查看/分区的I/O调度策略
[root@dw01 ~]# cat /sys/block/vda/queue/scheduler  
noop anticipatory [deadline] cfq 
查看/data分区的I/O调度策略
[root@dw01 ~]# cat /sys/block/vdb/queue/scheduler 
noop anticipatory [deadline] cfq 

查看当前系统内核

[root@dw01 ~]# uname -r
2.6.32-696.18.7.1.el6.ucloud.x86_64

修改系统引导文件,在/boot/grub/menu.lst 文件里面关于kernel这一行的末尾添加elevator=deadline

 /boot/grub/menu.lst 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,0)
#          kernel /boot/vmlinuz-version ro root=/dev/vda1
#          initrd /boot/initrd-[generic-]version.img
#boot=/dev/vda
default=0
timeout=1
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-696.18.7.1.el6.ucloud.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-696.18.7.1.el6.ucloud.x86_64 ro root=/dev/vda1 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=512M-2G:64M,2G-4G:128M,4G-:192M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM quiet console=tty1 console=ttyS0,115200n8 elevator=deadline
        initrd /boot/initramfs-2.6.32-696.18.7.1.el6.ucloud.x86_64.img
title CentOS (2.6.32-696.18.7.el6.x86_64.debug)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-696.18.7.el6.x86_64.debug ro root=/dev/vda1 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=512M-2G:64M,2G-4G:128M,4G-:192M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM quiet console=tty1 console=ttyS0,115200n8
        initrd /boot/initramfs-2.6.32-696.18.7.el6.x86_64.debug.img
title CentOS (2.6.32-431.11.29.el6.ucloud.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-431.11.29.el6.ucloud.x86_64 ro root=/dev/vda1 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=512M-2G:64M,2G-4G:128M,4G-:192M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM quiet console=tty1 console=ttyS0,115200n8
        initrd /boot/initramfs-2.6.32-431.11.29.el6.ucloud.x86_64.img
title CentOS (2.6.32-431.11.25.el6.ucloud.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-431.11.25.el6.ucloud.x86_64 ro root=/dev/vda1 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=512M-2G:64M,2G-4G:128M,4G-:192M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM quiet console=tty1 console=ttyS0,115200n8
        initrd /boot/initramfs-2.6.32-431.11.25.el6.ucloud.x86_64.img

查看硬盘I/O预读扇区值:默认为256

[root@dw01 ~]# blockdev --getra /dev/vda1 
256
[root@dw01 ~]# blockdev --getra /dev/vdb
256

修改为65536

blockdev --setra 65536 /dev/vda1
blockdev --setra 65536 /dev/vdb

须将其写入开机配置文件/etc/rc.d/rc.local 否则重启就会失效。

/etc/rc.d/rc.local 
echo "blockdev --setra 65536 /dev/vda1" >> /etc/rc.d/rc.local 
echo "blockdev --setra 65536 /dev/vdb" >> /etc/rc.d/rc.local 

5、修改hostname

[root@dw01 ~]# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=dw01
NOZEROCONF=yes

6、修改hosts

 /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.28.1.11   dw01 mdw
172.28.1.12   dw02 smdw
172.28.1.13   dw03 sdw1
172.28.1.14   dw04 sdw2

以上设置四台机器都需设置,重启生效;

7、创建配置文件
a、创建包含Greenplum部署的所有主机名,内容如下

[gpadmin@dw01 gpconfig]$ cat host_file 
mdw
smdw
sdw1
sdw2

b、创建包含备库standby mastersegment库节点一节点二的主机名,内容如下

[gpadmin@dw01 gpconfig]$ cat dw234 
smdw
sdw1
sdw2

c、创建包含segment库节点一节点二的主机名,内容如下

[gpadmin@dw01 gpconfig]$ cat seg_hosts 
sdw1
sdw2

三、下载GreenPlum安装包
根据操作系统版本下载:
https://network.pivotal.io/products/pivotal-gpdb#/releases/4540/file_groups/560
这里选择
Greenplum Database 4.3.12.0 for RedHat Entrerprise Linux 5, 6 and 7
122 MB4.3.12.0
注意 登陆Pivotal Network账号以后,才能下载

md5sum *zip
ee90c7a35c706404840be38ba1be557b  greenplum-cc-web-3.2.0-LINUX-x86_64.zip
edaa67d561653fbf81431c968e5f297f  greenplum-db-4.3.12.0-rhel5-x86_64.zip

四、解压安装

unzip greenplum-db-4.3.12.0-rhel5-x86_64.zip
./greenplum-db-4.3.12.0-rhel5-x86_64.bin

根据系统提示输入yes和回车,默认会按照在/usr/local/greenplum-db-4.3.12.0下,并创建软链接greenplum-db ---/greenplum-db-4.3.12.0
在/home/gpadmin/.bash_profile文件中添加

source /usr/local/greenplum-db/greenplum_path.sh
export GPHOME=/usr/local/greenplum-db
export MASTER_DATA_DIRECTORY=/data/gpmaster/gpseg-1

五、免key登陆
四台机器之间互相做免密码登陆,参考https://mhl.xyz/Linux/ssh-key.html

source  /usr/local/greenplum-db/greenplum_path.sh
gpssh-exkeys -f /usr/local/greenplum-db/gpconfig/host_file     #打通所有服务器       

六、创建配置文件gpinitsystem_config
在master机器上创建

mkdir -p /usr/local/greenplum-db/gpconfig
创建/usr/local/greenplum-db/gpconfig/gpinitsystem_config文件内容如下:
ARRAY_NAME="EMC Greenplum DW"
SEG_PREFIX=gpseg
PORT_BASE=40000
declare -a DATA_DIRECTORY=(/data/gpdata/gpdatap1 /data/gpdata/gpdatap1)
MASTER_HOSTNAME=dw01
MASTER_DIRECTORY=/data/gpmaster
MASTER_PORT=5432
TRUSTED_SHELL=ssh
CHECK_POINT_SEGMENTS=8
ENCODING=UNICODE
MIRROR_PORT_BASE=50000
REPLICATION_PORT_BASE=41000
MIRROR_REPLICATION_PORT_BASE=51000
declare -a MIRROR_DATA_DIRECTORY=(/data/gpdata/gpdatam1 /data/gpdata/gpdatam1)
MACHINE_LIST_FILE=/usr/local/greenplum-db/gpconfig/seg_hosts

gpinitsystem_config关键配置项参数说明:

DATA_DIRECTORY:决定了每个Segment上部署多少个Primary Instance,一个目录就是一个Instance。这里建议把所有的Instance都指向一个目录,例如部署两个实例,则为:/gpdata/primary /gpdata/primary。原因是我们在使用中会创建新的文件系统,这样便于和文件系统区分。
MASTER_HOSTNAME:Master的主机名。
MASTER_DIRECTORY:Master文件目录。
MASTER_PORT:该端口用于访问Greenplum数据库。
MIRROR_DATA_DIRECTORY:(如果需要部署Mirror),决定了每个Segment上部署多少个Mirror Instance。类似于DATA_DIRECTORY,例如:/gpdata/mirror /gpdata/mirror。
DATABASE_NAME:创建一个数据库,输入数据库名称。也可以之后手工创建。

六、分发、创建用户、目录、权限
安装包分发:master上操作

cd /usr/local
scp -r greenplum-db-4.3.12.0/ dw02:/usr/local/
scp -r greenplum-db-4.3.12.0/ dw03:/usr/local/
scp -r greenplum-db-4.3.12.0/ dw04:/usr/local/
gpssh -f /usr/local/greenplum-db/gpconfig/host_file
Note: command history unsupported on this machine ...
=>
依次执行以下命令
useradd -g gpadmin gpadmin
useradd -g gpmon gpmon
echo 123456 | passwd gpadmin --stdin
echo 123456 | passwd gpmon --stdin
mkdir -p /data/gpdata/gpdatap1
mkdir -p /data/gpdata/gpdatam1
mkdir -p /data/gpmaster
chown -R gpadmin.gpadmin /data/gpdata/
chown -R gpadmin.gpadmin /data/gpmaster/
chown -R gpadmin.gpadmin /usr/local/greenplum-db-4.3.12.0/

七、系统检查

source /usr/local/greenplum-db/greenplum_path.sh
gpcheck -f /usr/local/greenplum-db/gpconfig/host_file -m mdw -s smdw          
20180406:14:39:12:026168 gpcheck:dw01:root-[INFO]:-dedupe hostnames
20180406:14:39:13:026168 gpcheck:dw01:root-[INFO]:-Detected platform: Generic Linux Cluster
20180406:14:39:13:026168 gpcheck:dw01:root-[INFO]:-generate data on servers
20180406:14:39:13:026168 gpcheck:dw01:root-[INFO]:-copy data files from servers
20180406:14:39:13:026168 gpcheck:dw01:root-[INFO]:-delete remote tmp files
20180406:14:39:13:026168 gpcheck:dw01:root-[INFO]:-Using gpcheck config file: /usr/local/greenplum-db/./etc/gpcheck.cnf
20180406:14:39:13:026168 gpcheck:dw01:root-[INFO]:-GPCHECK_NORMAL
20180406:14:39:13:026168 gpcheck:dw01:root-[INFO]:-gpcheck completing...

如果系统检查有Error提示,需根据提示修改系统参数,然后重新检查
检查网络性能

gpcheckperf -f host_file -r N -d /tmp/ > checknet.out
cat checknet.out
-------------------
--  NETPERF TEST
-------------------

====================
==  RESULT
====================
Netperf bisection bandwidth test
mdw -> smdw = 287.060000
sdw1 -> sdw2 = 279.900000
smdw -> mdw = 299.840000
sdw2 -> sdw1 = 302.450000

Summary:
sum = 1169.25 MB/sec
min = 279.90 MB/sec
max = 302.45 MB/sec
avg = 292.31 MB/sec
median = 299.84 MB/sec

八、初始化数据库
seg_hosts是segment服务器列表,一行存一个hostname,smdw是standby master的hostname名字,在gpadmin账号下运行:

su - gpadmin
cd /usr/local/greenplum-db/gpconfig/
gpinitsystem -c /usr/local/greenplum-db/gpconfig/gpinitsystem_config  -h seg_hosts -s smdw

如有报错参考官方文档:http://gpdb.docs.pivotal.io/43120/install_guide/init_gpdb.html
安装完以后登陆

[gpadmin@dw01]$ psql -d postgres

psql (8.2.15)

Type "help" for help.

 

postgres=# help

You are using psql, the command-line interface to PostgreSQL.

Type:  \copyright for distribution terms

       \h for help with SQL commands

       \? for help with psql commands

       \g or terminate with semicolon to execute query

       \q to quit

postgres=#

查看各机器进程

gpssh -f /usr/local/greenplum-db/gpconfig/host_file 
Note: command history unsupported on this machine ...
=> netstat -nltp | grep postgres
[sdw2] (Not all processes could be identified, non-owned process info
[sdw2]  will not be shown, you would have to be root to see it all.)
[sdw2] tcp        0      0 0.0.0.0:40000               0.0.0.0:*                   LISTEN      10601/postgres      
[sdw2] tcp        0      0 0.0.0.0:40001               0.0.0.0:*                   LISTEN      10602/postgres      
[sdw2] tcp        0      0 172.28.64.190:41000         0.0.0.0:*                   LISTEN      10636/postgres      
[sdw2] tcp        0      0 172.28.64.190:41001         0.0.0.0:*                   LISTEN      10641/postgres      
[sdw2] tcp        0      0 0.0.0.0:50000               0.0.0.0:*                   LISTEN      10603/postgres      
[sdw2] tcp        0      0 0.0.0.0:50001               0.0.0.0:*                   LISTEN      10600/postgres      
[sdw2] tcp        0      0 172.28.64.190:51000         0.0.0.0:*                   LISTEN      10621/postgres      
[sdw2] tcp        0      0 172.28.64.190:51001         0.0.0.0:*                   LISTEN      10620/postgres      
[sdw2] tcp        0      0 :::40000                    :::*                        LISTEN      10601/postgres      
[sdw2] tcp        0      0 :::40001                    :::*                        LISTEN      10602/postgres      
[sdw2] tcp        0      0 :::50000                    :::*                        LISTEN      10603/postgres      
[sdw2] tcp        0      0 :::50001                    :::*                        LISTEN      10600/postgres      
[smdw] (Not all processes could be identified, non-owned process info
[smdw]  will not be shown, you would have to be root to see it all.)
[smdw] tcp        0      0 0.0.0.0:5432                0.0.0.0:*                   LISTEN      8501/postgres       
[smdw] tcp        0      0 :::5432                     :::*                        LISTEN      8501/postgres       
[ mdw] (Not all processes could be identified, non-owned process info
[ mdw]  will not be shown, you would have to be root to see it all.)
[ mdw] tcp        0      0 0.0.0.0:5432                0.0.0.0:*                   LISTEN      17489/postgres      
[ mdw] tcp        0      0 :::5285                     :::*                        LISTEN      17496/postgres      
[ mdw] tcp        0      0 :::5432                     :::*                        LISTEN      17489/postgres      
[sdw1] (Not all processes could be identified, non-owned process info
[sdw1]  will not be shown, you would have to be root to see it all.)
[sdw1] tcp        0      0 0.0.0.0:40000               0.0.0.0:*                   LISTEN      10662/postgres      
[sdw1] tcp        0      0 0.0.0.0:40001               0.0.0.0:*                   LISTEN      10660/postgres      
[sdw1] tcp        0      0 172.28.56.68:41000          0.0.0.0:*                   LISTEN      10685/postgres      
[sdw1] tcp        0      0 172.28.56.68:41001          0.0.0.0:*                   LISTEN      10684/postgres      
[sdw1] tcp        0      0 0.0.0.0:50000               0.0.0.0:*                   LISTEN      10661/postgres      
[sdw1] tcp        0      0 0.0.0.0:50001               0.0.0.0:*                   LISTEN      10663/postgres      
[sdw1] tcp        0      0 172.28.56.68:51000          0.0.0.0:*                   LISTEN      10693/postgres      
[sdw1] tcp        0      0 172.28.56.68:51001          0.0.0.0:*                   LISTEN      10694/postgres      
[sdw1] tcp        0      0 :::40000                    :::*                        LISTEN      10662/postgres      
[sdw1] tcp        0      0 :::40001                    :::*                        LISTEN      10660/postgres      
[sdw1] tcp        0      0 :::50000                    :::*                        LISTEN      10661/postgres      
[sdw1] tcp        0      0 :::50001                    :::*                        LISTEN      10663/postgres      
=> 

九、安装PerformanceMonitor数据收集Agent

source /usr/local/greenplum-db/greenplum_path.sh
gpperfmon_install --enable --password 123456 --port 5432
gpstop -r   #重启GP生效

查看进程

ps -ef |grep gpmmon
gpadmin  17498 17489  0 Apr04 ?        00:01:04 /usr/local/greenplum-db-4.3.12.0/bin/gpmmon -D /data/gpmaster/gpseg-1/gpperfmon/conf/gpperfmon.conf -p 5432

查看端口

netstat -nltp | grep gp
tcp        0      0 0.0.0.0:28080               0.0.0.0:*                   LISTEN      11984/gpmonws             
tcp        0      0 :::8888                     :::*                        LISTEN      17611/gpsmon 

查看监控数据是否写入数据库

psql -d gpperfmon -c 'select * from system_now;'
        ctime        | hostname |  mem_total  |  mem_used  | mem_actual_used | mem_actual_free | swap_total | swap_used | swap_page_in | swap_page_out | c
pu_user | cpu_sys | cpu_idle | load0 | load1 | load2 | quantum | disk_ro_rate | disk_wo_rate | disk_rb_rate | disk_wb_rate | net_rp_rate | net_wp_rate | n
et_rb_rate | net_wb_rate 
---------------------+----------+-------------+------------+-----------------+-----------------+------------+-----------+--------------+---------------+--
--------+---------+----------+-------+-------+-------+---------+--------------+--------------+--------------+--------------+-------------+-------------+--
-----------+-------------
 2018-04-06 14:59:15 | dw01     | 25132879872 | 1774948352 |       391598080 |     24741281792 |  536866816 |         0 |            0 |             0 |  
   0.22 |    0.34 |    99.44 |  0.02 |  0.04 |     0 |      15 |            0 |            3 |            0 |        47850 |          40 |          43 |  
      9267 |       21458
 2018-04-06 14:59:15 | dw02     |  8188444672 |  963731456 |       157970432 |      8030474240 |  536866816 |         0 |            0 |             0 |  
   0.13 |    0.32 |    99.55 |  0.05 |  0.03 |     0 |      15 |            0 |            2 |            0 |         9788 |           3 |           3 |  
       331 |         572
 2018-04-06 14:59:15 | dw03     |  8188444672 | 2338099200 |       239792128 |      7948652544 |  536866816 |         0 |            0 |             0 |  
   0.28 |    0.42 |    99.27 |     0 |     0 |     0 |      15 |            0 |            9 |            0 |       178355 |         169 |          66 |  
    174387 |      154813
 2018-04-06 14:59:15 | dw04     |  8188444672 | 2338926592 |       242188288 |      7946256384 |  536866816 |         0 |            0 |             0 |  
   0.28 |    0.61 |    99.07 |     0 |     0 |     0 |      15 |            0 |            8 |            0 |       175088 |         165 |          65 |  
    167569 |      162326
(4 rows)

至此GreenPlum4.3.12集群安装完毕·

GreenPlum启动、关闭及状态查看命令参数说明

GreenPlum启动:
greenplum.jpg
在Master主机上运行gpstart启动Greenplum数据库:

gpstart

常用的启动参数有以下几个参数:
-a,该模式不需要在启动过程中输入Y进行确认,将直接启动数据库。
-m,只启动Master节点,不启动Segment节点,通常在维护的时候使用。
-y,只启动Master的primary节点,不启动standby节点。

GreenPlum停止或重启:
不要发出kill命令来结束任何Postgres进程,发出kill -9或者kill -11可能会导致数据库损坏并且妨碍对根本原因的分析。
在Master主机上运行gpstop停止Greenplum数据库:

gpstop
常用的参数如下:
-a,不需要输入Y确认是否关闭,将直接关闭数据库。

-m,只关闭Master节点,一般用于维护模式

-r,重启数据库。

-u,加载参数文件,使修改的参数生效。pg_hba.conf配置文件和Master上postgresql.conf、pg_hba.conf文件中运行时参数的更改,活动会话将会在它们重新连接到数据库时使用这些更新。很多服务器配置参数需要完全重启系统(gpstop -r)才能激活

-M,设置关闭数据库的级别,有三种级别,fast、immediate和smart。
Immediate smart 这是默认的关闭级别,所有连接的会话会收到关闭警告,不允许新链接访问数据库。
gpstop –M immediate,强制关闭数据库,这种方式是不一致的关闭模式,不建议使用。
gpstop –M fast 快速模式,停止所有连接将中断并且回滚

GreenPlum状态查看gpstate

常用的参数如下:

-s,详细信息。

-m,Mirror信息。

-f,Master的Standby信息。

-e,Segment的Mirror信息。

-i,版本信息。

参考文档:https://gp-docs-cn.github.io/docs/admin_guide/managing/startstop.html

cp保持目录结构复制

cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。
参数如下:

cp(选项)(参数)
-a:此参数的效果和同时指定"-dpR"参数相同;
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
-f:强行复制文件或目录,不论目标文件或目录是否已存在;
-i:覆盖既有文件之前先询问用户;
-l:对源文件建立硬连接,而非复制文件;
-p:保留源文件或目录的属性;
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
-s:对源文件建立符号连接,而非复制文件;
-u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
-S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
-b:覆盖已存在的文件目标前将目标文件备份;
-v:详细显示命令执行的操作。
--parents 保持目录结构复制
find  ./ -name pcm_*.* -exec cp -rp --parents {}  ../zxc \;    #和find命令结合
cp --parents /data/fastdfs/group1/data/M00/01/8B/CvkBIVl7CNSAK6LFAAOwUyPe8Xk298.png /run   #复制以后/run目录下面的文件保持源地址结构

MySQL5.7.x中group concat函数数据被截断问题解决

MySQL5.6中没这个问题,5.7中存在group concat函数数据被截断的问题,查询默认初始设置

mysql> show variables like 'group_concat_max_len';
+----------------------+-------+
| Variable_name  | Value |
+----------------------+-------+
| group_concat_max_len | 1024 |
+----------------------+-------+
1 row in set (0.00 sec)

能查询出来,但是查询结果异常,
MySQL官方手册 对它的定义是 The maximum permitted result length in bytes for the GROUP_CONCAT() function. ,也就是它限制了 GROUP_CONCAT 数据的长度。
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

The maximum value for group_concat_max_len for 64-bit is  18446744073709551615
The maximum value for group_concat_max_len for 32-bit is  4294967295

解决方法:
1、修改MySQL配置文件my.cnf,在[mysqld]节点中添加

group_concat_max_len = 18446744073709551615

2、更改全局配置

SET GLOBAL group_concat_max_len=18446744073709551615;
SET SESSION group_concat_max_len=18446744073709551615;

使配置在当前会话中也立即生效,其它已经登录的会话终端需要重启生效,查询查询结果正常。

/lib/libz.so.1: no version information available问题解决

出现了/lib/libz.so.1: no version information available 警告信息,但命令还是可以执行的
安装zlib新版本即可解决

wget http://zlib.net/zlib-1.2.11.tar.gz  
tar zxvf zlib-1.2.11.tar.gz  
cd zlib-1.2.11
./configure  
make  
make install  
  
#覆盖原版本,可以先备份一下原版本  
cp /usr/local/lib/libz.so.1 /lib/ 

MongoDB删除集合db.collection.drop

MongoDB 的 db.collection.drop() 用于从数据库中删除集合,删除集合collection语法如下:

db.COLLECTION_NAME.drop()

首先,检查数据库 test 中可用的集合。

>use test
switched to db test
> show collections
mycol
mycollection
newcollection

现在删除名称为 mycollection 的集合。

>db.mycollection.drop()
true

再次检查当前数据库的集合列表,如下 -

> show collections
mycol
newcollection

如果选定的集合成功删除,drop()方法将返回true,否则返回false。

CentOS7下快速安装部署Svn服务

Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统,Subversion 在 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。SVN相对于的RCS、CVS,采用了分支管理系统,它的设计目标就是取代CVS,互联网上免费的版本控制服务多基于Subversion。
subversion_logo.png
Subversion官网地址:http://subversion.apache.org/packages.html
SVN客户端:TortoiseSVN 官网下载地址:http://tortoisesvn.net/downloads.html
安装SVN服务:

yum install subversion -y

创建svn目录

mkdir -p /data/svn

新建资源仓库

svnadmin create /data/svn/project
ll /data/svn/project/
total 24
drwxr-xr-x 2 root root 4096 Mar 23 14:43 conf
drwxr-sr-x 6 root root 4096 Mar 23 15:15 db
-r--r--r-- 1 root root    2 Mar 23 14:35 format
drwxr-xr-x 2 root root 4096 Mar 23 14:35 hooks
drwxr-xr-x 2 root root 4096 Mar 23 14:35 locks
-rw-r--r-- 1 root root  229 Mar 23 14:35 README.txt
目录用途说明:
hooks目录:放置hook脚本文件的目录
locks目录:用来放置subversion的db锁文件和db_logs锁文件的目录,用来追踪存取文件库的客户端
format文件:是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号
conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等)

配置svn服务svnserver.conf

vim /data/svn/project/svnserver.conf
[general]
anon-access = none
auth-access = write
password-db = /data/svn/project/conf/passwd
authz-db = /data/svn/project/conf/authz
realm = My Test Repository         #提示信息

添加用户和密码

vim /data/svn/project/passwd
[users]
a1 = 123abc
a2 = aaabbbccc
test1 = 11aabb
用户配置文件的修改立即生效,不必重启svn服务

配置用户授权文件

vim /data/svn/project/authz
[groups]

user = a1,a2
test = test1
[/]

@user = rw
@test = r
* =

格式说明

版本库目录格式: 

[<版本库>:/项目/目录] 

@<用户组名> = <权限> 

<用户名> = <权限>

/ 表示对根目录(即/data/svn/project目录)下的所有子目录范围设置权限;

[/abc] 表示对资料库中abc项目设置权限;

创建一个user组,组成员包括a1和a2

创建一个test组,成员只有test1;

user组对目录有读写权限;

单个用户test1有读权限;

*=表示除了上面设置的权限用户组以外,其他所有用户都设置空权限,空权限表示禁止访问本目录,这很重要一定要加上。

注意:对权限配置文件的修改立即生效,不必重启svn。 

启动svn服务

svnserve -d -r /data/svn/project/

注意:不要使用系统提供的 /etc/init.d/svnserve start 来启动,因为系统默认的启动脚本中没有使用 –r /data/svn/project参数指定一个资源。这种情况下启动的svn服务,客户端连接会提示“svn: No repository found in 'svn://x.x.x.x/project' ”这样的错误。

默认svn服务器端口是3690。

杀死svn服务:

ps -ef|grep svnserve
直接kill -9 Pid号即可

或者修改/etc/init.d/svnserve在start()函数部分的daemon增加svn路径,修改后的服务文件为:

 cat /etc/init.d/svnserve 
#!/bin/bash
#
# svnserve        Startup script for the Subversion svnserve daemon
#
# chkconfig: - 85 15
# description: The svnserve daemon allows access to Subversion repositories \
#              using the svn network protocol.
# processname: svnserve
# config: /etc/sysconfig/svnserve
# pidfile: /var/run/svnserve.pid
#
### BEGIN INIT INFO
# Provides: svnserve
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: start and stop the svnserve daemon
# Description: The svnserve daemon allows access to Subversion
#   repositories using the svn network protocol.
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/svnserve ]; then
        . /etc/sysconfig/svnserve
fi

exec=/usr/bin/svnserve
prog=svnserve
pidfile=${PIDFILE-/var/run/svnserve.pid}
lockfile=${LOCKFILE-/var/lock/subsys/svnserve}
args="--daemon --pid-file=${pidfile} $OPTIONS"
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog

start() {
    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Starting $prog: "
    daemon --pidfile=${pidfile} $exec $args -r /data/svn/project
    retval=$?
    echo
    if [ $retval -eq 0 ]; then
        touch $lockfile || retval=4
    fi
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    stop
    start
}

reload() {
    restart
}

force_reload() {
    restart
}

rh_status() {
    # run checks to determine if the service is running or use generic status
    status -p ${pidfile} $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?

常见问题处理:

提示svn: No repository found in 'svn://x.x.x.x/project'错误?
解决:启动svn服务的时候没有使用-r /svn/project参数,没有指明资源库的具体路径。使用# svnserve -d -r /svn/project/ 命令来启动就可以了,不要使用/etc/init.d/svnserver脚本。

执行命令# svn co svn://x.x.x.x.x/project时提示“svn: Authorization failed”错误?
解决:一般这种授权失败的错误原因都来自conf/authz文件的配置。

checkout的时候SVN看到anon-access = read只读模式 日志文件显示正常,不要求用户名密码,而到了具体目录的时候问题发生了,这时没有用户密码就不能获得文件就会出错;
anon-access = none 禁止所有匿名访问,也就是说如果不在authz-db中开放访问的用户,是不会允许读写版本日志的,故系统对日志的读写也纳入禁止访问范围,所以anon-access = none才会正常。

Nginx https代理tomcat redirect问题的解决

前端nginx,同时启用http和https服务,但是在https页面内不允许加载 http的请求、服务器端重定向时会返回http导致页面不加载也就是请求不到资源,修改nginx配置,关键配置如下:
在server段增加:

proxy_redirect http:// $scheme://;
port_in_redirect on;
proxy_set_header Host $host:$server_port;

reload nginx以后问题解决;

Oracle查看执行最慢与查询次数、高消耗资源最多的sql语句

在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致。如果执行频繁的SQL,往往容易遭遇一些并发性的问题:
查询执行最慢的sql

select *
 from (select sa.SQL_TEXT,
        sa.SQL_FULLTEXT,
        sa.EXECUTIONS "执行次数",
        round(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",
        round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) "平均执行时间",
        sa.COMMAND_TYPE,
        sa.PARSING_USER_ID "用户ID",
        u.username "用户名",
        sa.HASH_VALUE
     from v$sqlarea sa
     left join all_users u
      on sa.PARSING_USER_ID = u.user_id
     where sa.EXECUTIONS > 0
     order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)
 where rownum <= 50;

查询次数最多的 sql

select *
 from (select s.SQL_TEXT,
        s.EXECUTIONS "执行次数",
        s.PARSING_USER_ID "用户ID",
        rank() over(order by EXECUTIONS desc) EXEC_RANK
     from v$sql s
     left join all_users u
      on u.USER_ID = s.PARSING_USER_ID) t
 where exec_rank <= 100;

根据用户ID查询用户名:

select USERNAME from dba_users where USER_ID = '89'; 

读硬盘多或占用内存可能多的SQL

select sql_text, disk_reads, buffer_gets, parsing_schema_name, executions
from v$sqlarea
order by disk_reads desc;

说明:单纯从V$sqlarea中是无法查出每个SQL消耗的内存量的,但我们可以借助磁盘读次数间接反映可能的消耗内存量较大的SQL语句,然后再借助执行计划(如v$sql_plan视图)具体查看。
利用系统视图v$sqlarea,其中disk_reads是磁盘读次数,也是主要字段,剩余字段均为参考字段。其中,buffer_gets是内存读次数,parsing_schema_name是首次编译者模式名(一般与user名相同),executions是语句执行次数。
需要注意的是,v$sqlarea中sql_text可能不完整,若需要完整的则需要借助hash_value或sql_id结合v$sqltext来查看分析。
查看排序次数最多的SQL

select sql_text, sorts, parsing_schema_name
from v$sqlarea
order by sorts desc;

V$SQL中的列说明:

SQL_TEXT:SQL文本的前1000个字符 
SHARABLE_MEM:占用的共享内存大小(单位:byte) 
PERSISTENT_MEM:生命期内的固定内存大小(单位:byte) 
RUNTIME_MEM:执行期内的固定内存大小 
SORTS:完成的排序数 
LOADED_VERSIONS:显示上下文堆是否载入,1是0否 
OPEN_VERSIONS:显示子游标是否被锁,1是0否 
USERS_OPENING:执行语句的用户数 
FETCHES:SQL语句的fetch数。 
EXECUTIONS:自它被载入缓存库后的执行次数 
USERS_EXECUTING:执行语句的用户数 
LOADS:对象被载入过的次数 
FIRST_LOAD_TIME:初次载入时间 
INVALIDATIONS:无效的次数 
PARSE_CALLS:解析调用次数 
DISK_READS:读磁盘次数 
BUFFER_GETS:读缓存区次数 
ROWS_PROCESSED:解析SQL语句返回的总列数 
COMMAND_TYPE:命令类型代号 
OPTIMIZER_MODE:SQL语句的优化器模型 
OPTIMIZER_COST:优化器给出的本次查询成本 
PARSING_USER_ID:第一个解析的用户ID 
PARSING_SCHEMA_ID:第一个解析的计划ID 
KEPT_VERSIONS:指出是否当前子游标被使用DBMS_SHARED_POOL包标记为常驻内存 
ADDRESS:当前游标父句柄地址 
TYPE_CHK_HEAP:当前堆类型检查说明 
HASH_VALUE:缓存库中父语句的Hash值 
PLAN_HASH_VALUE:数值表示的执行计划。 
CHILD_NUMBER:子游标数量 
MODULE:在第一次解析这条语句是通过调用DBMS_APPLICATION_INFO.SET_MODULE设置的模块名称。 
ACTION:在第一次解析这条语句是通过调用DBMS_APPLICATION_INFO.SET_ACTION设置的动作名称。 
SERIALIZABLE_ABORTS:事务未能序列化次数 
OUTLINE_CATEGORY:如果outline在解释cursor期间被应用,那么本列将显示出outline各类,否则本列为空 
CPU_TIME:解析/执行/取得等CPU使用时间(单位,毫秒) 
ELAPSED_TIME:解析/执行/取得等消耗时间(单位,毫秒) 
OUTLINE_SID:outline session标识 
CHILD_ADDRESS:子游标地址 
SQLTYPE:指出当前语句使用的SQL语言版本 
REMOTE:指出是否游标是一个远程映象(Y/N) 
OBJECT_STATUS:对象状态(VALID or INVALID) 
IS_OBSOLETE:当子游标的数量太多的时候,指出游标是否被废弃(Y/N) 

v$sqlarea常用字段说明

 SQL_TEXT:SQL语句的前1000个字符;
    SQL_FULLTEXT:SQL语句的所有字符;
    SQL_ID:缓存在高速缓冲区(library cache)中的SQL父游标的唯一标识ID(注,类似于hash_value,不过hash_value是4bytes而sql_id是8bytes,sql_id更精确后期可能会替代hash_value);
    SHARABLE_MEM:SQL语句及其子游标占用的共享内存大小;
    PERSISTENT_MEM:打开SQL语句的生命周期内所占用的固定内存大小(包含子游标);
    RUNTIME_MEM:游标执行期间所占用的固定内存大小;
    SORTS:语句执行导致的排序次数;
    VERSION_COUNT:在缓存中以该语句为父语句的子游标总数;
    LOADED_VERSIONS:缓存中载入了这条语句上下文堆(KGL heap 6)的子游标数;
    OPEN_VERSIONS:父游标下打开的子游标个数;
    USERS_OPENING:打开子游标的用户个数;
    FETCHES:SQL语句的fetch数;
    EXECUTIONS:包含所有子游标在内该SQL语句共执行次数;
    USERS_EXECUTING:执行过该语句所有子游标的用户总数;
    LOADS:语句被载入的总次数;
    FIRST_LOAD_TIME:父游标被首次载入(编译)的时间;
    PARSE_CALLS:父游标下所有子游标解析调用次数;
    DISK_READS:该语句通过所有子游标导致的读磁盘次数;
    DIRECT_WRITES:该语句通过所有子游标导致的直接写入次数;
    BUFFER_GETS:该语句通过所有子游标导致的读缓存次数;
    APPLICATION_WAIT_TIME:应用等待时间;
    USER_IO_WAIT_TIME:用户I/O等待时间;
    PLSQL_EXEC_TIME:PLSQL执行时间;
    ROWS_PROCESSED:该SQL语句处理的总行数;
    OPTIMIZER_COST:此查询优化给出的成本数;
    PARSING_USER_ID:第一次解析该父语句的用户ID;
    PARSING_SCHEMA_ID:第一次解析该语句SCHEMA的ID;
    PARSING_SCHEMA_NAME:解析该语句的SCHEMA的NAME;
    KEPT_VERSIONS:指出是否当前子游标被使用DBMS_SHARED_POOL包标记为常驻内存;
    ADDRESS:当前游标父句柄(唯一指向该游标的一种地址编号);
    HASH_VALUE:该语句在library cache中hash值;
    PLAN_HASH_VALUE:执行计划的hash值,可依此确定两个执行计划是否相同(取代每行每字符进行比较的方式);
    CPU_TIME:该语句解析、执行和fetch(取值)所消耗的CPU时间;
    ELAPSED_TIME:该语句解析、执行和fetch(取值)所经过的时间;
    LAST_ACTIVE_TIME:查询计划最后一次执行的时间;
    LOCKED_TOTAL:所有子游标被锁的次数;
v$sqltext
    ADDRESS:当前游标父句柄(唯一指向该游标的一种地址编号);
    HASH_VALUE:该游标(子游标)在library cache中唯一hash值;
    SQL_ID:缓存游标中该SQL的一个唯一标识值;
    COMMAND_TYPE:SQL语句类型,如select、insert、update等;
    PIECE:排序SQL文本的碎片数;
    SQL_TEXT:包含一个完整SQL中的某一小块SQL文本字符(要完整的SQL语句需要把这些碎片组合起来);
v$session
    SADDR:session地址;
    SID:session标识值,常跟serial#联合唯一确定一个session(在杀进程时,有时SID会重用,造成误杀。而serial会增加但不会重复,sid 在同一个instance的当前session中是一个unique key,而sid ,serial#则是在整个instance生命期内的所有session中是unique key);
    SERIAL#:会话序列号,用于在一个会话结束而另一个会话重用这该会话的SID时,唯一确定一个会话;
    AUDSID:审计会话ID,可以通过audsid查询当前session的sid,select sid from v$session where audsid=userenv('sessionid');
    PADDR:进程地址,关联v$process的addr字段,通过这个可以查询到进程对应的session;
    USER#:同于dba_users中的user_id,Oracle内部进程user#为0;
    USERNAME:会话拥有者用户名,等于dba_users中的username,Oracle内部进程的username为空;
    COMMAND:正在执行的SQL语句类型,如1为create table、3为select等;
    OWNERID:如果该列值为2147483644则值无效,否则值用于会话迁移、并行等;
    TADDR:Address of transaction state object;
    LOCKWAIT:标识当前查询是否处于锁等待状态,为空则表示无等待;
    STATUS:标识session状态,Active正执行SQL语句,inactive等待操作,killed被标注为杀死;
    SERVER:服务器类型,DEDICATED专用、SHARED共享等;
    SCHEMA#:SCHEMA标识ID值,Oracle内部进程的schema#为0;
    SCHEMANAME:SCHEMA用户名,Oracle内部进程的为sys;
    OSUSER:客户端操作系统用户名;
    PROCESS:客户端操作系统进程ID;
    MACHINE:操作系统机器名;
    TERMINAL:操作系统终端名;
    PROGRAM:操作系统应用程序名,如EXE或sqlplus.exe;
    TYPE:会话类型,如BACKGROUND或USER;
    SQL_ADDRESS:和SQL_HASH_VALUE一起使用标识正在执行的SQL语句;
    SQL_HASH_VALUE:和SQL_ADDRESS一起使用标识正在执行的SQL语句;
    SQL_ID:正在执行的SQL语句的标识ID;
    SQL_CHILD_NUMBER:正在执行的SQL语句的子ID;
    FIXED_TABLE_SEQUENCE:当session完成一个user call后就会增加的一个数值,也就是说,如果session挂起,它就不会增加。因此可以根据这个字段来监控某个时间点以来的session性能情况。例如,一个小时前某个session的此字段数值为10000,而现在是20000,则表明一个小时内其user call较频繁,可以重点关注此session的performance statistics。
    ROW_WAIT_OBJ#:被锁定行所在table的object_id,和dba_object中的object_id关联可以得到被锁定的table name;
    ROW_WAIT_FILE#:被锁定行所在的datafile id,和v$datafile中的file#关联可以得到datafile name;
    ROW_WAIT_BLOCK#:被锁定的块ID;
    ROW_WAIT_ROW#:被锁定的当前行;
    LOGON_TIME:登录时间;

Docker下面安装MySQL5.7.21

安装MySQL5.7.21镜像

docker pull mysql:5.7.21

查看安装的镜像docker images

[root@cops163 ~]# docker images | grep mysql
docker.io/mysql         5.7.21              5195076672a7        6 days ago          371 MB

创建数据目录

mkdir /data/mysql_data

创建配置文件目录

mkdir /data/conf

创建并运行镜像

docker run -p 3306:3306 --name mysql001 --restart=always -v /data/conf:/etc/my.cnf.d -v /data/mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.21 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

参数说明如下:

-p 3306:3306  #将容器的3306端口映射到主机的3306端口
--name mysql001  #容器的名字为mysql001
--restart=always  #在宿主机重启后或者Docker服务重启后自动启动容器,
no #不重启(不带restart参数时,默认不重启)
on-failure  #退出状态非0时重启
always  #始终重启
-v /data/conf:/etc/my.cnf.d  #将/data/conf目录映射到/etc/my.cnf.d下面 
-v /data/mysql_data:/var/lib/mysql  #将/data/mysql目录映射到/var/lib/mysql下面
-e MYSQL_ROOT_PASSWORD=123456 #设置root初始密码为123456
 -d mysql:5.7.21  #后台运行容器,并返回容器ID
--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci   #设置编码为utf8mb4

进入Docker MySQL控制台

docker exec -it mysql001 mysql -uroot -p
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper

Connection id:          2
Current database:       langold_enrolment
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.21 MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 47 min 16 sec

Threads: 2  Questions: 1785612  Slow queries: 0  Opens: 246  Flush tables: 1  Open tables: 135  Queries per second avg: 629.623
--------------
mysql> 

查看docker容器的log

docker logs -f mysql001

导入SQL文件到MySQL中

docker exec -i mysql001 mysql -uroot -p123456 langold_enrolment < /tmp/langold_enrolment.sql

导出SQL文件

docker exec -it mysql001 mysqldump -uroot -p123456 aaa > /tmp/aaa.sql

更多参考Docker官方文档:
https://hub.docker.com/r/mysql/mysql-server/

Docker学习笔记一:docker基础

Docker 是什么?
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

docker-facebook.png
Docker 的用途
Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

Docker的优点
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
容器是进程级别的,相比虚拟机有很多优势。

(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
docker安装:

yum install docker -y

启动docker:

systemctl start docker

加入开启启动:

systemctl enable docker

建立 docker 组:

groupadd docker

将当前用户加入docker组

usermod -aG docker $USER

添加内核参数:

tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

重新加载

sysctl -p

重新启动服务

systemctl daemon-reload
systemctl restart docker

加入国内镜像

/etc/docker/daemon.json文件中加入
{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}

加入完以后,重启docker服务,使用docker info 命令查看是否生效

修改docker镜像和容器保存路径
在/etc/sysconfig/docker文件中加入下内容

OPTIONS=--graph="/data/docker"

或者

DOCKER_OPTS="-g /data/docker"

重启docker服务生效
运行docker run hello-world查看是否安装成功:

[root@cops163 docker]# docker run hello-world
Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ... 
latest: Pulling from docker.io/library/hello-world
ca4f61b1923c: Pull complete 
Digest: sha256:97ce6fa4b6cdc0790cda65fe7290b74cfebd9fa0c9b8c38e979330d547d22ce1
Status: Downloaded newer image for docker.io/hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

获取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull --help
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
获取官方ubuntu 16.04镜像

docker pull ubuntu:16.04

运行ubuntu:16.04

docker run -it --rm ubuntu:16.04

docker运行:
docker run 就是运行容器的命令
参数:
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
--rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。

列出镜像

docker image ls

镜像体积

docker system df

由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image)
虚悬镜像

docker image ls -f dangling=true

中间层镜像
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。

docker image ls -a

特殊显示
以表格等距显示,并且有标题行,和默认一样,自定义列:

docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

只包含镜像ID和仓库名

docker image ls --format "{{.ID}}: {{.Repository}}"

只显示镜像ID

docker image ls -q

显示已经安装镜像的详细内容

docker images --no-trunc 

显示所有退出状态为1的容器

docker ps -a --filter &quot;exited=1&quot;

显示指定容器的IP

docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${CID}
docker ps :列出当前所有正在运行的container
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container(包含历史,即运行过的container)
docker ps -q :列出最近一次运行的container ID
docker ps | grep wildfly | awk '{print $1}' 通过正则表达式查找容器的镜像ID

进入容器

docker attach ${CID} 

进入容器打开一个shell

docker exec -it ${CID} bash

停止指定容器

docker stop ${CID}

停止所有正在运行的容器

docker kill $(docker ps -a -q)

删除本地镜像
docker image rm 命令,其格式为:
docker image rm [选项] <镜像1> [<镜像2> ...]

用 ID、镜像名、摘要删除镜像
其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。

用 docker image ls 命令来配合
像其它可以承接多个实体的命令一样,可以使用 docker image ls -q 来配合使用 docker image rm,这样可以成批的删除希望删除的镜像。

删除所有仓库名为 redis 的镜像:

docker image rm $(docker image ls -q redis)

删除所有在 mongo:3.2 之前的镜像:

docker image rm $(docker image ls -q -f before=mongo:3.2)

充分利用你的想象力和 Linux 命令行的强大,你可以完成很多非常赞的功能。
删除所有虚悬镜像

docker rmi $(docker images -q -f dangling=true)

使用正则表达式删除容器

docker ps -a | grep wildfly | awk '{print $1}' | xargs docker rm -f

删除docker容器

docker rm xxxx 删除容器 -f 删除运行中的
docker rm $(docker ps -a -q) 删除所有终止的容器

查找镜像

docker search redis

安装redis

docker pull redis:4.0.8

运行redis容器

docker run -p 6379:6379 -d redis:4.0.8 redis-server --appendonly yes

oracle多实例的启动与关闭

oracle/oracle登录

1、启监听器

lsnrctl start

监听一般不需要动,如果机器重新启动的话需要将监听启动。

查看当前SID:

echo $ORACLE_SID

2、启动数据库实例:

设置需要操作的实例:

export ORACLE_SID=a(需要启动的实例)

进入sqlplus0:sqlplus/nolog

DBA登录:conn /as sysdba

启动:startup

退出sqlplus:quit

设置需要操作的实例:

export ORACLE_SID=b(需要启动的实例)

进入sqlplus:sqlplus /nolog

DBA登录:conn /as sysdba

启动:startup

退出sqlplus:quit

3、关闭数据库实例:

设置需要操作的实例:

export ORACLE_SID=a(需要启动的实例)

进入sqlplus:sqlplus /nolog

DBA登录:conn /as sysdba

关闭:shutdown immediate

退出sqlplus:quit

设置需要操作的实例:export ORACLE_SID=b(需要启动的实例)

进入sqlplus:sqlplus /nolog

DBA登录:conn /as sysdba

关闭:

shutdown immediate

退出sqlplus:quit

Nginx报The plain HTTP request was sent to HTTPS port 400错误解决方法

nginx在配置https以后,使用http访问系统,报400错误The plain HTTP request was sent to HTTPS port
原因主要是nginx.conf里面打开了ssl on参数

ssl on;

ssl on会将整个virtual server都开启成ssl,会造成http请求也转发到了https上造成400错误,所以http访问的时候回报400错误,参见官方文档http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl
要http和https共存可以用下面这个方法:

    server {
        listen       80;
        listen       443 ssl;
    #ssl on;
        server_name  localhost;
        ......
        ......

即可http和https共存,都能访问系统·

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance报错解决方法

服务器来电启动的oracle的时候报错ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.,详细信息如下:

[root@hch_test_pd_121_217 local]$su - oracle
[oracle@hch_test_pd_121_217 ~]$rlwrap sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Sat Mar 17 15:08:08 2018

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.

Total System Global Area 3.0198E+10 bytes
Fixed Size                  2214456 bytes
Variable Size            1.3959E+10 bytes
Database Buffers         1.6106E+10 bytes
Redo Buffers              130793472 bytes
Database mounted.
Database opened.

查看数据库弃用的系统参数:

SQL> select name from v$parameter where isdeprecated = 'TRUE';

NAME
--------------------------------------------------------------------------------
lock_name_space
instance_groups
resource_manager_cpu_allocation
active_instance_count
buffer_pool_keep
buffer_pool_recycle
log_archive_start
standby_archive_dest
log_archive_local_first
parallel_server
parallel_server_instances

NAME
--------------------------------------------------------------------------------
fast_start_io_target
serial_reuse
max_enabled_roles
remote_os_authent
global_context_pool_size
cursor_space_for_time
plsql_v2_compatibility
plsql_debug
background_dump_dest
user_dump_dest
commit_write

NAME
--------------------------------------------------------------------------------
sql_trace
parallel_automatic_tuning
parallel_io_cap_enabled

25 rows selected.

ora-32004错误不影响数据库的使用,报错信息为参数过期,可以看alter_orcl.log 日志文件那个参数过期

SQL> show parameter background_dump_dest;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest                 string      /oracle/app/oracle/diag/rdbms/
                                                 pdunq/powerdes/trace

新开ssh窗口,直接查看alert日志:

tail -f /oracle/app/oracle/diag/rdbms/pdunq/powerdes/trace/alert_powerdes.log

具体日志内容:

  dispatchers              = "(PROTOCOL=TCP) (SERVICE=powerdes)"
  job_queue_processes      = 1000
  _system_trig_enabled     = FALSE
  audit_file_dest          = "/oracle/app/oracle/admin/powerdes/adump"
  audit_trail              = "NONE"
  db_name                  = "powerdes"
  db_unique_name           = "pdunq"
  open_cursors             = 3000
  optimizer_mode           = "FIRST_ROWS"
  optimizer_index_cost_adj = 25
  optimizer_index_caching  = 90
  _optim_peek_user_binds   = FALSE
  pga_aggregate_target     = 5591424409
  diagnostic_dest          = "/oracle/app/oracle"
Deprecated system parameters with specified values:
  log_archive_start        
End of deprecated system parameter listing

重点看Deprecated system parameters with specified values,其中log_archive_start为相关的参数,
查看log_archive_start参数的值

SQL> show parameter log_archive_start;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_start                    boolean     FALSE

将log_archive_start参数重置为系统默认值

SQL> alter system reset log_archive_start;

System altered.

最后在重启数据库,

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
Total System Global Area 3.0198E+10 bytes
Fixed Size                  2214456 bytes
Variable Size            1.3959E+10 bytes
Database Buffers         1.6106E+10 bytes
Redo Buffers              130793472 bytes
Database mounted.
Database opened.
SQL> 

没有报ORA-32004错误问题解决.

Linux查看文件系统分区格式类型的几个方法

fstab 记录了计算机上硬盘分区的相关信息,启动 Linux 的时候,检查分区的 fsck 命令,和挂载分区的 mount 命令,都需要 fstab 中的信息,来正确的检查和挂载硬盘。
/etc/mtab 和 fstab 文件的结构和内容基本相同,但是不同的是,mtab 文件记录的是,当前已挂载的分区信息。
每当 mount 挂载分区、umount 卸载分区,都会动态更新 mtab,mtab 总是保持着当前系统中已挂载的分区信息,fdisk、df 这类程序,必须要读取 mtab 文件,才能获得当前系统中的分区挂载情况。
使用df -hT命令查看

[root@ops163 ~]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda2      xfs        20G  1.2G   19G   6% /
devtmpfs       devtmpfs  7.8G     0  7.8G   0% /dev
tmpfs          tmpfs     7.8G     0  7.8G   0% /dev/shm
tmpfs          tmpfs     7.8G  8.4M  7.8G   1% /run
tmpfs          tmpfs     7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/vda5      xfs       172G   33M  172G   1% /data
/dev/vda1      xfs       473M  168M  305M  36% /boot
tmpfs          tmpfs     1.6G     0  1.6G   0% /run/user/0



---阅读剩余部分---

MySQL中grant授权和撤销权限revoke的语法说明

MySQL的权限系统围绕着两个概念:
认证->确定用户是否允许连接数据库服务器
授权->确定用户是否拥有足够的权限执行查询请求等。
如果认证不成功的话,哪么授权肯定是无法进行的。
revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from”
GRANT和REVOKE管理的权限

ALL PRIVILEGES
影响除WITH GRANT OPTION之外的所有权限

ALTER
影响ALTER TABLE命令的使用

ALTER ROUTINE
影响创建存储例程的能力

CREATE
影响CREATE TABLE命令的使用

CREATE ROUTINE
影响更改和弃用存储例程的能力

CREATE TEMPORARY TABLES
影响CREATE TEMPORARY TABLE命令的使用

CREATE USER
影响创建、弃用;重命名和撤销用户权限的能力

CREATE VIEW
影响CREATE VIEW命令的使用

DELETE
影响DELETE命令的使用

DROP
影响DROP TABLE命令的使用

EXECUTE
影响用户运行存储过程的能力

EVENT
影响执行事件的能力(从MySQL5.1.6开始)

FILE
影响SELECT INTO OUTFILE和LOAD DATA INFILE的使用

GRANT OPTION
影响用户委派权限的能力

INDEX
影响CREATE INDEX和DROP INDEX命令的使用

INSERT
影响INSERT命令的使用

LOCK TABLES
影响LOCK TABLES命令的使用

PROCESS
影响SHOW PROCESSLIST命令的使用

REFERENCES
未来MySQL特性的占位符

RELOAD
影响FLUSH命令集的使用

REPLICATION CLIENT
影响用户查询从服务器和主服务器位置的能力

REPLICATION SLAVE
复制从服务器所需的权限

SELECT
影响SELECT命令的使用

SHOW DATABASES
影响SHOW DATABASES命令的使用

SHOW VIEW
影响SHOW CREATE VIEW命令的使用

SHUTDOWN
影响SHUTDOWN命令的使用

SUPER
影响管理员级命令的使用,如CHANGE、MASTER、KILL thread、mysqladmin debug、PURGE MASTER LOGS和SET GLOBAL

TRIGGER
影响执行触发器的能力(从MySQL5.1.6开始)

UPDATE
影响UPDATE命令的使用

USAGE
只连接,不授予权限

Oracle数据库修改用户临时表空间

查看所有用户的临时表空间及相应的数据文件

select d.username, t.file_name, d.temporary_tablespace from DBA_TEMP_FILES t,dba_users d where t.tablespace_name = d.temporary_tablespace

修改临时表空间tmp的大小

alter database tempfile '/home/oracle/oradata/trade/temp01.dbf' resize 10G;

将系统的默认临时表空间设为tmp

alter database default temporary tablespace tmp

修改用户aa的默认表空间为tmp

alter user aa temporary tablespace tmp;

删除用户aa以前的临时表空间ex_aa

drop tablespace ex_aa including contents and datafiles;

Oracle增加表空间大小的四种方法

给表空间增加数据文件

ALTER TABLESPACE app_data ADD DATAFILE
'/oracle/app/oracle/oradata/jxctest/BF_DATA.dbf' SIZE 10G;

新增数据文件,并且允许数据文件自动增长

ALTER TABLESPACE app_data ADD DATAFILE
'/oracle/app/oracle/oradata/jxctest/BF_DATA.dbf' SIZE 20G
AUTOEXTEND ON NEXT 5G MAXSIZE 30G;

允许已存在的数据文件自动增长

ALTER DATABASE DATAFILE '/oracle/app/oracle/oradata/jxctest/BF_DATA.dbf'
AUTOEXTEND ON NEXT 1G MAXSIZE 20G;

手工改变已存在数据文件的大小

ALTER DATABASE DATAFILE '/oracle/app/oracle/oradata/jxctest/BF_DATA.dbf'
RESIZE 20G;

注意事项:
如果是在执行导入操作的时候最好用新增表空间文件的方法解决:

ORA-39171: Job is experiencing a resumable wait.
ORA-01691: unable to extend lob segment ORACLE.SYS_LOB0000070698C00030$$ by 8192 in tablespace USERS1

增加完以后使用下面SQL查询表空间使用情况:

SELECT a.tablespace_name, 
a.bytes total, 
b.bytes used, 
c.bytes free, 
(b.bytes * 100) / a.bytes "% USED ", 
(c.bytes * 100) / a.bytes "% FREE " 
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c 
WHERE a.tablespace_name = b.tablespace_name 
AND a.tablespace_name = c.tablespace_name; 

最新

分类

归档

评论

其它