This commit is contained in:
colben 2022-05-17 22:38:01 +08:00
parent c9a8c22e42
commit f8bf6ecd52
14 changed files with 1352 additions and 1350 deletions

View File

@ -68,6 +68,7 @@ exit n | 终止 awk返回 n
``` ```
## 判断语句 ## 判断语句
- if
```awk ```awk
if(条件){ if(条件){
# 语句 # 语句
@ -104,23 +105,23 @@ exit n | 终止 awk返回 n
- continue 退出本次循环,继续下一次循环 - continue 退出本次循环,继续下一次循环
## 脚本 ## 脚本
```awk ```awk
#!/usr/bin/awk -f #!/usr/bin/awk -f
# 自定义的变量和函数 # 自定义的变量和函数
# ... # ...
# 从这里开始执行 # 从这里开始执行
BEGIN{ BEGIN{
# 语句 # 语句
} }
条件{ 条件{
# 语句 # 语句
} }
END{ END{
# 语句 # 语句
} }
``` ```
## 其他说明 ## 其他说明
- 变量在使用时直接赋值即可,无需提前声明或定义 - 变量在使用时直接赋值即可,无需提前声明或定义

View File

@ -7,19 +7,19 @@ categories: ["database"]
--- ---
## 安装依赖 ## 安装依赖
```bash ```bash
yum install binutils compat-libstdc++-33 compat-libstdc++-33.i686 \ yum install binutils compat-libstdc++-33 compat-libstdc++-33.i686 \
elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc.i686 \ elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc.i686 \
glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh libaio \ glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh libaio \
libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc++ \ libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc++ \
libstdc++.i686 libstdc++-devel make sysstat unixODBC unixODBC-devel libstdc++.i686 libstdc++-devel make sysstat unixODBC unixODBC-devel
``` ```
## 创建用户和用户组 ## 创建用户和用户组
```bash ```bash
groupadd dba oinstall groupadd dba oinstall
useradd -g oinstall -m oracle useradd -g oinstall -m oracle
``` ```
## 配置oracle用户环境变量 ## 配置oracle用户环境变量
- 打开 oracle 用户的的默认shell配置文件 ~/.bashrc在最后添加以下代码 - 打开 oracle 用户的的默认shell配置文件 ~/.bashrc在最后添加以下代码
@ -39,10 +39,10 @@ categories: ["database"]
``` ```
## 创建oracle 11g软件安装路径 ## 创建oracle 11g软件安装路径
```bash ```bash
mkdir /opt/oracle/app/product/11.2.0/db_home1 -p mkdir /opt/oracle/app/product/11.2.0/db_home1 -p
chown oracle.oinstall /opt/oracle -R chown oracle.oinstall /opt/oracle -R
``` ```
## 配置内核参数 ## 配置内核参数
- 编辑 /etc/sysctl.conf在文件尾追加下面的参数设置 - 编辑 /etc/sysctl.conf在文件尾追加下面的参数设置

View File

@ -12,9 +12,9 @@ categories: ["storage"]
- 关闭 selinux - 关闭 selinux
## 安装 vsftpd 服务 ## 安装 vsftpd 服务
```bash ```bash
yum install vsftpd yum install vsftpd
``` ```
## 常用客户端 ## 常用客户端
- ftp - ftp
@ -54,69 +54,69 @@ categories: ["storage"]
``` ```
## 匿名用户配置 ## 匿名用户配置
```ini ```ini
# 控制是否允许匿名用户登入 # 控制是否允许匿名用户登入
# 匿名用户使用的登陆名为 ftp 或 anonymous口令为空 # 匿名用户使用的登陆名为 ftp 或 anonymous口令为空
# 匿名用户不能离开匿名用户家目录/var/ftp且只能下载不能上传 # 匿名用户不能离开匿名用户家目录/var/ftp且只能下载不能上传
anonymous_enable=YES/NO(YES) anonymous_enable=YES/NO(YES)
# 匿名登入时,不会询问密码 # 匿名登入时,不会询问密码
no_anon_password=YES/NO(NO) no_anon_password=YES/NO(NO)
# 定义匿名登入的使用者名称默认值为ftp # 定义匿名登入的使用者名称默认值为ftp
ftp_username=ftp ftp_username=ftp
# 是否允许登陆用户有写权限,属于全局设置 # 是否允许登陆用户有写权限,属于全局设置
write_enable=YES/NO(YES) write_enable=YES/NO(YES)
# 使用匿名登入时,所登入的目录,默认值为/var/ftp # 使用匿名登入时,所登入的目录,默认值为/var/ftp
# 注意ftp目录不能是777的权限属性即匿名用户的家目录不能有777的权限 # 注意ftp目录不能是777的权限属性即匿名用户的家目录不能有777的权限
anon_root=/var/ftp anon_root=/var/ftp
# 是否允许匿名者有上传文件(非目录)的权限 # 是否允许匿名者有上传文件(非目录)的权限
# 只有在write_enable=YES时此项才有效 # 只有在write_enable=YES时此项才有效
# 匿名用户必须要有对上层目录的写入权 # 匿名用户必须要有对上层目录的写入权
anon_upload_enable=YES/NO(NO) anon_upload_enable=YES/NO(NO)
# 是否允许匿名者下载可阅读的档案 # 是否允许匿名者下载可阅读的档案
anon_world_readable_only=YES/NO(YES) anon_world_readable_only=YES/NO(YES)
# 是否允许匿名者有新增目录的权限 # 是否允许匿名者有新增目录的权限
# 只有在write_enable=YES时此项才有效 # 只有在write_enable=YES时此项才有效
# 匿名用户必须要有对上层目录的写入权 # 匿名用户必须要有对上层目录的写入权
anon_mkdir_write_enable=YES/NO(NO) anon_mkdir_write_enable=YES/NO(NO)
# 是否允许匿名入者拥有其他权限,譬如删除或者重命名 # 是否允许匿名入者拥有其他权限,譬如删除或者重命名
# 如果anon_upload_enable=NO则匿名用户不能上传文件但可以删除或者重命名已经存在的文件 # 如果anon_upload_enable=NO则匿名用户不能上传文件但可以删除或者重命名已经存在的文件
# 如果anon_mkdir_write_enable=NO则匿名用户不能上传或者新建文件夹但可以删除或者重命名已经存在的目录 # 如果anon_mkdir_write_enable=NO则匿名用户不能上传或者新建文件夹但可以删除或者重命名已经存在的目录
anon_other_write_enable=YES/NO(NO) anon_other_write_enable=YES/NO(NO)
# 是否改变匿名用户上传文件(非目录)的属主 # 是否改变匿名用户上传文件(非目录)的属主
chown_uploads=YES/NO(NO) chown_uploads=YES/NO(NO)
# 设置匿名用户上传文件(非目录)的属主名 # 设置匿名用户上传文件(非目录)的属主名
# 建议不要设置为root # 建议不要设置为root
chown_username=username chown_username=username
# 设置匿名登入者新增或上传档案时的 umask 值,默认值为 077 # 设置匿名登入者新增或上传档案时的 umask 值,默认值为 077
anon_umask=077 anon_umask=077
``` ```
## 配置 ## 配置
### 常用配置 ### 常用配置
```ini ```ini
#允许匿名用户登陆 #允许匿名用户登陆
anonymous_enable=YES anonymous_enable=YES
#允许本地用户登陆 #允许本地用户登陆
local_enable=YES local_enable=YES
#允许登陆用户写可访问的目录或文件 #允许登陆用户写可访问的目录或文件
write_enable=YES write_enable=YES
#指定用户登陆后直接进入系统的/mnt目录 #指定用户登陆后直接进入系统的/mnt目录
local_root=/mnt local_root=/mnt
chroot_list_enable=YES chroot_list_enable=YES
#限定登陆用户可访问的目录只有自己的家目录或指定的local_root目录 #限定登陆用户可访问的目录只有自己的家目录或指定的local_root目录
chroot_list_file=/etc/vsftpd/chroot_list chroot_list_file=/etc/vsftpd/chroot_list
``` ```
### 允许 vsftpd 匿名用户上传和下载 ### 允许 vsftpd 匿名用户上传和下载
- 创建匿名用户登陆目录 - 创建匿名用户登陆目录

View File

@ -7,103 +7,103 @@ categories: ["os"]
--- ---
## 常用设置 ## 常用设置
```bash ```bash
# 关闭左上角热响应 # 关闭左上角热响应
gsettings set org.gnome.desktop.interface enable-hot-corners false gsettings set org.gnome.desktop.interface enable-hot-corners false
# 缩放系统字体 # 缩放系统字体
gsettings set org.gnome.desktop.interface text-scaling-factor 1.5 gsettings set org.gnome.desktop.interface text-scaling-factor 1.5
# monospace 字体 # monospace 字体
gsettings set org.gnome.desktop.interface monospace-font-name 'YaHei Consolas Hybrid 15' gsettings set org.gnome.desktop.interface monospace-font-name 'YaHei Consolas Hybrid 15'
# gtk 主题 # gtk 主题
gsettings set org.gnome.desktop.interface gtk-theme 'Vertex-Dark' gsettings set org.gnome.desktop.interface gtk-theme 'Vertex-Dark'
# gnome-shell 主题 # gnome-shell 主题
gsettings set org.gnome.shell.extensions.user-theme name 'Vertex' gsettings set org.gnome.shell.extensions.user-theme name 'Vertex'
# 图标主题 # 图标主题
gsettings set org.gnome.desktop.interface icon-theme 'Faenza' gsettings set org.gnome.desktop.interface icon-theme 'Faenza'
# 调整 gnome3 桌面(包括 gdm )放大级别 # 调整 gnome3 桌面(包括 gdm )放大级别
# 0 系统自动缩放 # 0 系统自动缩放
# n > 0 放大 n 倍 # n > 0 放大 n 倍
gsettings set org.gnome.desktop.interface scaling-factor 1 gsettings set org.gnome.desktop.interface scaling-factor 1
# 启用用户扩展 # 启用用户扩展
gsettings set org.gnome.shell disable-user-extensions false gsettings set org.gnome.shell disable-user-extensions false
gsettings set org.gnome.shell enabled-extensions "['user-theme@gnome-shell-extensions.gcampax.github.com', 'workspace-indicator@gnome-shell-extensions.gcampax.github.com', 'dash-to-panel@jderose9.github.com']" gsettings set org.gnome.shell enabled-extensions "['user-theme@gnome-shell-extensions.gcampax.github.com', 'workspace-indicator@gnome-shell-extensions.gcampax.github.com', 'dash-to-panel@jderose9.github.com']"
# 工作区 # 工作区
gsettings set org.gnome.mutter dynamic-workspaces false gsettings set org.gnome.mutter dynamic-workspaces false
gsettings set org.gnome.desktop.wm.preferences num-workspaces 4 gsettings set org.gnome.desktop.wm.preferences num-workspaces 4
gsettings set org.gnome.desktop.wm.preferences workspace-names "['乾坤', '巽震', '坎离', '艮兑']" gsettings set org.gnome.desktop.wm.preferences workspace-names "['乾坤', '巽震', '坎离', '艮兑']"
# 窗口按钮 # 窗口按钮
gsettings set org.gnome.desktop.wm.preferences button-layout 'appmenu:minimize,maximize,close' gsettings set org.gnome.desktop.wm.preferences button-layout 'appmenu:minimize,maximize,close'
``` ```
## 在 "活动" 中创建 "文件夹" ## 在 "活动" 中创建 "文件夹"
```bash ```bash
# 创建文件夹 # 创建文件夹
gsettings set org.gnome.desktop.app-folders folder-children "['Office','VirtualBox']" gsettings set org.gnome.desktop.app-folders folder-children "['Office','VirtualBox']"
# 指定文件夹名字 # 指定文件夹名字
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/Office/ name "Office" gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/Office/ name "Office"
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/VirtualBox/ name "VirtualBox" gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/VirtualBox/ name "VirtualBox"
# 指定文件夹包含的应用类别 # 指定文件夹包含的应用类别
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/Office/ categories "['Office']" gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/Office/ categories "['Office']"
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/VirtualBox/ categories "['Emulator']" gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/VirtualBox/ categories "['Emulator']"
``` ```
## 快捷键 ## 快捷键
```bash ```bash
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 "[]" gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-last "[]" gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-last "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-up "['<Super>Up']" gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-up "['<Super>Up']"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down "['<Super>Down']" gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down "['<Super>Down']"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['<Super>Left']" gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['<Super>Left']"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['<Super>Right']" gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['<Super>Right']"
gsettings set org.gnome.desktop.wm.keybindings switch-applications "[]" gsettings set org.gnome.desktop.wm.keybindings switch-applications "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward "[]" gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-windows "['<Alt>Tab']" gsettings set org.gnome.desktop.wm.keybindings switch-windows "['<Alt>Tab']"
gsettings set org.gnome.desktop.wm.keybindings switch-windows-backward "['<Shift><Alt>Tab']" gsettings set org.gnome.desktop.wm.keybindings switch-windows-backward "['<Shift><Alt>Tab']"
gsettings set org.gnome.shell.window-switcher current-workspace-only true gsettings set org.gnome.shell.window-switcher current-workspace-only true
gsettings set org.gnome.shell.window-switcher app-icon-mode both gsettings set org.gnome.shell.window-switcher app-icon-mode both
gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-down "['<Alt><Super>Down']" gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-down "['<Alt><Super>Down']"
gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-up "['<Alt><Super>Up']" gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-up "['<Alt><Super>Up']"
gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-last "[]" gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-last "[]"
gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-up "[]" gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-up "[]"
gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-right "[]" gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-right "[]"
gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-left "[]" gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-left "[]"
gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-down "[]" gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-down "[]"
gsettings set org.gnome.desktop.wm.keybindings show-desktop "['<Super>d']" gsettings set org.gnome.desktop.wm.keybindings show-desktop "['<Super>d']"
gsettings set org.gnome.desktop.wm.keybindings toggle-maximized "['<Primary><Super>Up']" gsettings set org.gnome.desktop.wm.keybindings toggle-maximized "['<Primary><Super>Up']"
gsettings set org.gnome.desktop.wm.keybindings minimize "['<Primary><Super>Down']" gsettings set org.gnome.desktop.wm.keybindings minimize "['<Primary><Super>Down']"
gsettings set org.gnome.desktop.wm.keybindings maximize "[]" gsettings set org.gnome.desktop.wm.keybindings maximize "[]"
``` ```
## 在 CentOS6 下安装 gnome 桌面 ## 在 CentOS6 下安装 gnome 桌面
```bash ```bash
yum groupinstall 'X Window System' yum groupinstall 'X Window System'
yum groupinstall Desktop yum groupinstall Desktop
sed -i '/^id/id:5:initdefault:' /etc/inittab sed -i '/^id/id:5:initdefault:' /etc/inittab
``` ```
## 在 CentOS7 下安装 gnome3 桌面 ## 在 CentOS7 下安装 gnome3 桌面
```bash ```bash
yum groupinstall 'X Window System' yum groupinstall 'X Window System'
yum groupinstall 'Gnome Desktop' yum groupinstall 'Gnome Desktop'
systemctl set-default graphical.target systemctl set-default graphical.target
systemctl enable gdm systemctl enable gdm
# 创建一个可登陆的普通用户 # 创建一个可登陆的普通用户
``` ```
## 在 gdm 中隐藏用户名 ## 在 gdm 中隐藏用户名
- 修改文件/etc/gdm/gdm.schemas找到这一段 - 修改文件/etc/gdm/gdm.schemas找到这一段

View File

@ -232,21 +232,22 @@ categories: ["dev/ops"]
- 好了,还是让我们来看一看如何书写规则。 - 好了,还是让我们来看一看如何书写规则。
### 规则举例 ### 规则举例
```makefile ```makefile
foo.o: foo.c defs.h # foo模块 foo.o: foo.c defs.h # foo模块
cc -c -g foo.c cc -c -g foo.c
``` ```
- 看到这个例子各位应该不是很陌生了前面也已说过foo.o是我们的目标foo.c和defs.h是目标所依赖的源文件而只有一个命令"cc -c -g foo.c"以Tab键开头。这个规则告诉我们两件事 - 看到这个例子各位应该不是很陌生了前面也已说过foo.o是我们的目标foo.c和defs.h是目标所依赖的源文件而只有一个命令"cc -c -g foo.c"以Tab键开头。这个规则告诉我们两件事
- 文件的依赖关系foo.o依赖于foo.c和defs.h的文件如果foo.c和defs.h的文件日期要比foo.o文件日期要新或是foo.o不存在那么依赖关系发生。 - 文件的依赖关系foo.o依赖于foo.c和defs.h的文件如果foo.c和defs.h的文件日期要比foo.o文件日期要新或是foo.o不存在那么依赖关系发生。
- 如果生成或更新foo.o文件。也就是那个cc命令其说明了如何生成foo.o这个文件。当然foo.c文件include了defs.h文件 - 如果生成或更新foo.o文件。也就是那个cc命令其说明了如何生成foo.o这个文件。当然foo.c文件include了defs.h文件
### 规则的语法 ### 规则的语法
- 常规
```makefile ```makefile
targets : prerequisites targets : prerequisites
command command
... ...
``` ```
- 或是这样: - 或是这样:
```makefile ```makefile
targets : prerequisites ; command targets : prerequisites ; command
command command

View File

@ -69,9 +69,9 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
``` ```
## 启动server ## 启动server
```bash ```bash
systemctl start mariadb systemctl start mariadb
``` ```
## 安全设置 ## 安全设置
- 设置root账户密码推荐 - 设置root账户密码推荐
@ -115,9 +115,9 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
``` ```
## 停止 server ## 停止 server
```bash ```bash
systemctl stop mariadb systemctl stop mariadb
``` ```
## 启动集群 ## 启动集群
- 启动 galera cluster - 启动 galera cluster

View File

@ -13,116 +13,116 @@ categories: ["database"]
- 忽略系统数据库: information_schema, mysql, performance_schema - 忽略系统数据库: information_schema, mysql, performance_schema
## 在两个主服务器上创建用于备份的用户 replicator ## 在两个主服务器上创建用于备份的用户 replicator
```sql ```sql
grant replication slave on *.* to 'replicator'@'%' identified by 'password'; grant replication slave on *.* to 'replicator'@'%' identified by 'password';
flush privileges; flush privileges;
``` ```
## 在两个主服务器上修改 my.cnf ## 在两个主服务器上修改 my.cnf
``` ```
# 唯一 ID # 唯一 ID
# 192.168.1.141 配置 # 192.168.1.141 配置
server-id = 141 server-id = 141
# 192.168.1.142 配置 # 192.168.1.142 配置
server-id = 142 server-id = 142
read-only = 0 read-only = 0
# binlog # binlog
# MariaDB 默认已开启 GTID # MariaDB 默认已开启 GTID
log-bin = /var/lib/mysql-bin/master log-bin = /var/lib/mysql-bin/master
binlog-format = row binlog-format = row
sync_binlog = 1 sync_binlog = 1
expire-logs-days = 3 expire-logs-days = 3
gtid-strict-mode = ON gtid-strict-mode = ON
# relay log # relay log
replicate-wild-ignore-table = information_schema.% replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = init_sql.% replicate-wild-ignore-table = init_sql.%
replicate-wild-ignore-table = mysql.% replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = performance_schema.% replicate-wild-ignore-table = performance_schema.%
relay-log = /var/lib/mysql-bin/slave relay-log = /var/lib/mysql-bin/slave
relay-log-recovery = TRUE relay-log-recovery = TRUE
# 复制线程数不超过 cpu 核数 # 复制线程数不超过 cpu 核数
slave-parallel-threads = 4 slave-parallel-threads = 4
# 双主或多主互备时,可能会用到以下配置 # 双主或多主互备时,可能会用到以下配置
# 自增主键初始值,与其他互备服务器一致 # 自增主键初始值,与其他互备服务器一致
#auto-increment-offset = #auto-increment-offset =
# 自增主键等差值,与其他互备服务器均不一致 # 自增主键等差值,与其他互备服务器均不一致
#auto-increment-increment = #auto-increment-increment =
# 该环境中,双主配合 keepalived 实现高可用,无需配置自增 # 该环境中,双主配合 keepalived 实现高可用,无需配置自增
``` ```
## 开启互主同步 ## 开启互主同步
```sql ```sql
-- 在 192.168.1.141 上启动 mariadb配置同步 192.168.1.142: -- 在 192.168.1.141 上启动 mariadb配置同步 192.168.1.142:
change master to master_host = '192.168.1.142', change master to master_host = '192.168.1.142',
master_port = 3306, master_port = 3306,
master_user = 'replicator', master_user = 'replicator',
master_password = 'password', master_password = 'password',
master_use_gtid = slave_pos; master_use_gtid = slave_pos;
-- 在 192.168.1.142 上启动 mariadb配置同步 192.168.1.141: -- 在 192.168.1.142 上启动 mariadb配置同步 192.168.1.141:
change master to master_host = '192.168.1.141', change master to master_host = '192.168.1.141',
master_port = 3306, master_port = 3306,
master_user = 'replicator', master_user = 'replicator',
master_password = 'password', master_password = 'password',
master_use_gtid = slave_pos; master_use_gtid = slave_pos;
``` ```
## 在两个主服务器上启动 slave ,查看 slave 状态 ## 在两个主服务器上启动 slave ,查看 slave 状态
```sql ```sql
start slave; start slave;
-- 查看 slave 状态 -- 查看 slave 状态
show slave status\G show slave status\G
-- 如果看到 -- 如果看到
-- Slave_IO_Running: Yes -- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes -- Slave_SQL_Running: Yes
-- 则表示 slave 开启成功! -- 则表示 slave 开启成功!
``` ```
## 在从服务器上编辑 my.cnf ## 在从服务器上编辑 my.cnf
``` ```
# 唯一 ID # 唯一 ID
server-id = 143 server-id = 143
# 从服务器只做查询,无增删改 # 从服务器只做查询,无增删改
read-only = 1 read-only = 1
# 忽略的数据表 # 忽略的数据表
#replicate-ignore-table = db1.t1 #replicate-ignore-table = db1.t1
replicate-wild-ignore-table = information_schema.% replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = init_sql.% replicate-wild-ignore-table = init_sql.%
replicate-wild-ignore-table = mysql.% replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = performance_schema.% replicate-wild-ignore-table = performance_schema.%
relay-log = /var/log/mysql-bin/slave relay-log = /var/log/mysql-bin/slave
slave-parallel-threads = 4 slave-parallel-threads = 4
``` ```
## 开启同步 ## 开启同步
```sql ```sql
change master 'db141' to master_host = '192.168.1.141', change master 'db141' to master_host = '192.168.1.141',
master_port = 3306, master_port = 3306,
master_user = 'replicator', master_user = 'replicator',
master_password = 'password', master_password = 'password',
master_use_gtid = slave_pos; master_use_gtid = slave_pos;
change master 'db142' to master_host = '192.168.1.142', change master 'db142' to master_host = '192.168.1.142',
master_port = 3306, master_port = 3306,
master_user = 'replicator', master_user = 'replicator',
master_password = 'password', master_password = 'password',
master_use_gtid = slave_pos; master_use_gtid = slave_pos;
``` ```
## 在从服务器上启动 slave ,查看 slave 状态 ## 在从服务器上启动 slave ,查看 slave 状态
```sql ```sql
start all slaves; start all slaves;
-- 在从服务器上查看 slave 状态 -- 在从服务器上查看 slave 状态
show all slaves status\G show all slaves status\G
-- 如果看到 -- 如果看到
-- Slave_IO_Running: Yes -- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes -- Slave_SQL_Running: Yes
-- 则表示 slave 开启成功! -- 则表示 slave 开启成功!
``` ```
## 参考 ## 参考
- [MariaDB 复制](https://mariadb.com/kb/en/standard-replication/) - [MariaDB 复制](https://mariadb.com/kb/en/standard-replication/)

View File

@ -15,79 +15,79 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MySQL
双核 | 2GB | mysql_3 | 10.0.0.233 | 10.10.10.3 | 7.5 | 5.7 双核 | 2GB | mysql_3 | 10.0.0.233 | 10.10.10.3 | 7.5 | 5.7
## 创建 galera yum 源文件 ## 创建 galera yum 源文件
```bash ```bash
cat > /etc/yum.repos.d/galera.repo <<-END cat > /etc/yum.repos.d/galera.repo <<-END
[galera] [galera]
name = Galera name = Galera
baseurl = http://releases.galeracluster.com/galera-3/centos/7/x86_64/ baseurl = http://releases.galeracluster.com/galera-3/centos/7/x86_64/
gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = 1 gpgcheck = 1
[mysql-wsrep] [mysql-wsrep]
name = MySQL-wsrep name = MySQL-wsrep
baseurl = http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/ baseurl = http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/
gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = 1 gpgcheck = 1
END END
``` ```
## 安装 ## 安装
```bash ```bash
yum install galera-3 mysql-wsrep-5.7 rsync yum install galera-3 mysql-wsrep-5.7 rsync
``` ```
## 修改 /etc/my.cnf ## 修改 /etc/my.cnf
``` ```
[mysqld] [mysqld]
datadir=/var/lib/mysql datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock socket=/var/lib/mysql/mysql.sock
user=mysql user=mysql
binlog-format=ROW binlog-format=ROW
bind-address=0.0.0.0 bind-address=0.0.0.0
default-storage-engine=innodb default-storage-engine=innodb
innodb-autoinc-lock-mode=2 innodb-autoinc-lock-mode=2
innodb-flush-log-at-trx-commit=0 innodb-flush-log-at-trx-commit=0
innodb-buffer-pool-size=1024M #物理内存一半 innodb-buffer-pool-size=1024M #物理内存一半
wsrep-provider=/usr/lib64/galera-3/libgalera_smm.so wsrep-provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep-provider-options="gcache.dir=/var/lib/gcache;gcache.size=1G;gcache.recover=yes;pc.recovery=TRUE" wsrep-provider-options="gcache.dir=/var/lib/gcache;gcache.size=1G;gcache.recover=yes;pc.recovery=TRUE"
wsrep-cluster-name="mysql_galera_cluster" #集群名字 wsrep-cluster-name="mysql_galera_cluster" #集群名字
wsrep-cluster-address="gcomm://10.10.10.1,10.10.10.2,10.10.10.3" wsrep-cluster-address="gcomm://10.10.10.1,10.10.10.2,10.10.10.3"
wsrep-sst-method=rsync wsrep-sst-method=rsync
wsrep-node-name=mysql_1 #当前节点名字 wsrep-node-name=mysql_1 #当前节点名字
wsrep-node-address="10.10.10.1" #当前节点 cluster ip wsrep-node-address="10.10.10.1" #当前节点 cluster ip
#wsrep-auto-increment-control=OFF #只通过一个节点做增删改时使用 #wsrep-auto-increment-control=OFF #只通过一个节点做增删改时使用
[mysql_safe] [mysql_safe]
log-error=/var/log/mysqld.log log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid pid-file=/var/run/mysqld/mysqld.pid
!includedir /etc/my.cnf.d/ !includedir /etc/my.cnf.d/
``` ```
## 随机选择一个节点,使用专用脚本 mysqld_bootstrap 初始化集群 ## 随机选择一个节点,使用专用脚本 mysqld_bootstrap 初始化集群
```bash ```bash
/usr/bin/mysqld_bootstrap /usr/bin/mysqld_bootstrap
# 该命令会启动本机的 mysqld 服务 # 该命令会启动本机的 mysqld 服务
systemctl status mysqld systemctl status mysqld
``` ```
## 查找密码,修改初始密码 ## 查找密码,修改初始密码
```bash ```bash
grep -i password /var/log/messages grep -i password /var/log/messages
# 记录输出的密码 # 记录输出的密码
mysqladmin -uroot -p password 'P@sswo2d' mysqladmin -uroot -p password 'P@sswo2d'
# 根据提示输入上一步输出的密码 # 根据提示输入上一步输出的密码
``` ```
## 在其他节点上启动 mysqld 服务 ## 在其他节点上启动 mysqld 服务
```bash ```bash
systemctl start mysqld systemctl start mysqld
``` ```
## 查看集群节点数量 ## 查看集群节点数量
```sql ```sql
show status like 'wsrep_cluster_size'; show status like 'wsrep_cluster_size';
``` ```
## ssl 加密同步数据(不推荐,存在性能损失) ## ssl 加密同步数据(不推荐,存在性能损失)
- 生成证书 - 生成证书

View File

@ -17,66 +17,66 @@ mysql_33 | 192.168.1.33 | centos7.7 | 8.0.19
- 懒得写了 ... - 懒得写了 ...
## 修改 my.cnf ## 修改 my.cnf
``` ```
# mysql_11(选择一个) # mysql_11(选择一个)
server-id = 11 server-id = 11
# mysql_22(选择一个) # mysql_22(选择一个)
server-id = 22 server-id = 22
# mysql_33(选择一个) # mysql_33(选择一个)
server-id = 33 server-id = 33
# 开启 binlog # 开启 binlog
log-bin = /var/log/mysql-bin/master log-bin = /var/log/mysql-bin/master
binlog-format = ROW binlog-format = ROW
# 关闭 binlog 校验 # 关闭 binlog 校验
binlog-checksum = NONE binlog-checksum = NONE
# 保留 2 天的 binlog # 保留 2 天的 binlog
binlog-expire-logs-seconds = 172800 binlog-expire-logs-seconds = 172800
# 开启 gtid # 开启 gtid
gtid-mode = ON gtid-mode = ON
enforce-gtid-consistency = TRUE enforce-gtid-consistency = TRUE
# 指定 relay-log 存储位置 # 指定 relay-log 存储位置
relay-log = /var/lib/mysql-bin/slave relay-log = /var/lib/mysql-bin/slave
# relay-log 更新计入 binlog # relay-log 更新计入 binlog
log-slave-updates = TRUE log-slave-updates = TRUE
# 多线程执行从库日志(可选) # 多线程执行从库日志(可选)
slave-parallel-workers = 2 slave-parallel-workers = 2
slave-parallel-type = LOGICAL_CLOCK slave-parallel-type = LOGICAL_CLOCK
slave-preserve-commit-order = ON slave-preserve-commit-order = ON
# 存储引擎只能用 InnoDB # 存储引擎只能用 InnoDB
disabled-storage-engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" disabled-storage-engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 加载插件,克隆插件用于快速 state transfer # 加载插件,克隆插件用于快速 state transfer
plugin-load-add = "group_replication.so;mysql_clone.so" plugin-load-add = "group_replication.so;mysql_clone.so"
# 集群 uuid # 集群 uuid
group-replication-group-name = "aaaa1111-bbbb-2222-cccc-3333dddd4444" group-replication-group-name = "aaaa1111-bbbb-2222-cccc-3333dddd4444"
# mysql_11(选择一个) # mysql_11(选择一个)
group-replication-local-address = "192.168.1.11:33061" group-replication-local-address = "192.168.1.11:33061"
# mysql_22(选择一个) # mysql_22(选择一个)
group-replication-local-address = "192.168.1.22:33061" group-replication-local-address = "192.168.1.22:33061"
# mysql_33(选择一个) # mysql_33(选择一个)
group-replication-local-address = "192.168.1.33:33061" group-replication-local-address = "192.168.1.33:33061"
# 种子节点 # 种子节点
group-replication-group-seeds = "192.168.1.11:33061,192.168.1.22:33061,192.168.1.33:33061" group-replication-group-seeds = "192.168.1.11:33061,192.168.1.22:33061,192.168.1.33:33061"
# 新主库在执行完自己的从库日志后,再处理用户的写请求 # 新主库在执行完自己的从库日志后,再处理用户的写请求
group-replication-consistency = BEFORE_ON_PRIMARY_FAILOVER group-replication-consistency = BEFORE_ON_PRIMARY_FAILOVER
# 启动时,不自动创建/初始化新集群 # 启动时,不自动创建/初始化新集群
group-replication-bootstrap-group = OFF group-replication-bootstrap-group = OFF
# 新节点启动时,先不启动组复制,待手动配置完成并确认正常后,再把 OFF 改成 ON # 新节点启动时,先不启动组复制,待手动配置完成并确认正常后,再把 OFF 改成 ON
group-replication-start-on-boot = OFF group-replication-start-on-boot = OFF
# 怀疑某节点不可用2秒内如果该嫌疑节点依旧无响应则开除它(可选) # 怀疑某节点不可用2秒内如果该嫌疑节点依旧无响应则开除它(可选)
group-replication-member-expel-timeout = 2 group-replication-member-expel-timeout = 2
# 2秒内依旧连接不上主网(majority),则退出组复制,进入 ERROR 状态(可选) # 2秒内依旧连接不上主网(majority),则退出组复制,进入 ERROR 状态(可选)
group-replication-unreachable-majority-timeout = 2 group-replication-unreachable-majority-timeout = 2
# 退出组复制后,不再尝试重新加入组复制,直接执行指定的退出动作(默认) # 退出组复制后,不再尝试重新加入组复制,直接执行指定的退出动作(默认)
group-replication-autorejoin-tries = 0 group-replication-autorejoin-tries = 0
# 指定退出动作: 数据库设置超级只读并关闭客户端连接(推荐) # 指定退出动作: 数据库设置超级只读并关闭客户端连接(推荐)
group-replication-exit-state-action = OFFLINE_MODE group-replication-exit-state-action = OFFLINE_MODE
``` ```
## 初始化集群 ## 初始化集群
- 重新启动节点 mysql_11 - 重新启动节点 mysql_11

View File

@ -12,186 +12,186 @@ categories: ["database"]
- 要复制的数据库有 data_db、conf_db - 要复制的数据库有 data_db、conf_db
## 在主服务器上创建用于备份的用户 replicator ## 在主服务器上创建用于备份的用户 replicator
```sql ```sql
grant replication slave on *.* to 'replicator'@'192.168.1.6' identified by 'password'; grant replication slave on *.* to 'replicator'@'192.168.1.6' identified by 'password';
flush privileges; flush privileges;
``` ```
## 在主服务器上修改 my.cnf ## 在主服务器上修改 my.cnf
``` ```
# 建议与本机ip地址最后一位一致,与其他互备服务器均不一致 # 建议与本机ip地址最后一位一致,与其他互备服务器均不一致
server-id = 10 server-id = 10
read-only = 0 read-only = 0
# 开启 binlog # 开启 binlog
log-bin = /var/log/mysql-bin/master log-bin = /var/log/mysql-bin/master
binlog-format = row binlog-format = row
# 关注要复制的数据库,存在跨库问题 # 关注要复制的数据库,存在跨库问题
binlog-do-db = data-db binlog-do-db = data-db
binlog-do-db = conf-db binlog-do-db = conf-db
# 忽略的数据库,存在跨库问题 # 忽略的数据库,存在跨库问题
#binlog-ignore-db = #binlog-ignore-db =
#binlog 有效时间 #binlog 有效时间
expire-logs-days = expire-logs-days =
# GTID 复制模式 # GTID 复制模式
#gtid-mode = ON #gtid-mode = ON
#enforce-gtid-consistency=true #enforce-gtid-consistency=true
# 双主或多主互备时,会用到以下配置 # 双主或多主互备时,会用到以下配置
# 自增主键初始值,与其他互备服务器一致 # 自增主键初始值,与其他互备服务器一致
#auto-increment-offset = #auto-increment-offset =
# 自增主键等差值,与其他互备服务器均不一致 # 自增主键等差值,与其他互备服务器均不一致
#auto-increment-increment = #auto-increment-increment =
``` ```
## 在主服务器上重启 mysql获取 master 状态 ## 在主服务器上重启 mysql获取 master 状态
```sql ```sql
-- 如果 mysql 是全新安装,则无须导出数据库初态,直接查看 binlog pos 即可 -- 如果 mysql 是全新安装,则无须导出数据库初态,直接查看 binlog pos 即可
-- 锁定要导出的数据库表 -- 锁定要导出的数据库表
flush tables with read lock; flush tables with read lock;
``` ```
## 导出数据库初态 ## 导出数据库初态
```bash ```bash
# 在主服务器的另一个终端中运行 # 在主服务器的另一个终端中运行
mysqldump -uroot -p data_db > /tmp/data_db.sql mysqldump -uroot -p data_db > /tmp/data_db.sql
mysqldump -uroot -p conf_db > /tmp/conf_db.sql mysqldump -uroot -p conf_db > /tmp/conf_db.sql
# 复制到从服务器上 # 复制到从服务器上
scp /tmp/data_db.sql /tmp/conf_db.sql 192.168.1.6:/tmp/ scp /tmp/data_db.sql /tmp/conf_db.sql 192.168.1.6:/tmp/
``` ```
## 查看 binary 日志位置 ## 查看 binary 日志位置
```sql ```sql
show master status\G show master status\G
-- 记住输出里的如下类似两行不记录也可以这两个信息已经写入了导出的sql文件中 -- 记住输出里的如下类似两行不记录也可以这两个信息已经写入了导出的sql文件中
-- File: mysql-bin.000001 -- File: mysql-bin.000001
-- Position: 137103822 -- Position: 137103822
-- 解锁数据库表 -- 解锁数据库表
unlock tables; unlock tables;
``` ```
## 在从服务器上编辑 my.cnf ## 在从服务器上编辑 my.cnf
``` ```
# 建议与本机ip地址最后一位一致,与其他互备服务器均不一致 # 建议与本机ip地址最后一位一致,与其他互备服务器均不一致
server-id = 6 server-id = 6
read-only = 1 read-only = 1
# 如果该 slave 中也运行了 master或者使用了 gtid 模式复制,则开启 binlog # 如果该 slave 中也运行了 master或者使用了 gtid 模式复制,则开启 binlog
#log-bin = mysql-bin #log-bin = mysql-bin
#binlog-format = row #binlog-format = row
# 把 slave 操作也计入 binlog用于链式同步 # 把 slave 操作也计入 binlog用于链式同步
#log-slave-updates = ON #log-slave-updates = ON
# 指定要复制的数据库,存在跨库问题 # 指定要复制的数据库,存在跨库问题
#replicate-do-db = data_db #replicate-do-db = data_db
#replicate-do-db = conf_db #replicate-do-db = conf_db
# 指定要复制的数据表,无跨库问题 # 指定要复制的数据表,无跨库问题
replicate-do-table = db1.t1 replicate-do-table = db1.t1
replicate-wild-do-table = db1.% replicate-wild-do-table = db1.%
# 忽略的数据库,存在跨库问题 # 忽略的数据库,存在跨库问题
#replicate-ignore-db = #replicate-ignore-db =
# 忽略的数据表,无跨库问题 # 忽略的数据表,无跨库问题
#replicate-ignore-table = db1.t1 #replicate-ignore-table = db1.t1
#replicate-wild-ignore-table = db1.% #replicate-wild-ignore-table = db1.%
# 中继日志 # 中继日志
relay-log = /var/lib/mysql-bin/slave relay-log = /var/lib/mysql-bin/slave
# 多线程复制 # 多线程复制
slave-parallel-type = logical-clock slave-parallel-type = logical-clock
slave-parallel-workers = 4 slave-parallel-workers = 4
# GTID 模式 # GTID 模式
#gtid-mode = ON #gtid-mode = ON
#enforce-gtid-consistency=true #enforce-gtid-consistency=true
# 双主或多主互备时,会用到以下配置 # 双主或多主互备时,会用到以下配置
# 自增主键初始值,与其他互备服务器一致 # 自增主键初始值,与其他互备服务器一致
#auto-increment-offset = #auto-increment-offset =
# 自增主键等差值,与其他互备服务器均不一致 # 自增主键等差值,与其他互备服务器均不一致
#auto-increment-increment = #auto-increment-increment =
``` ```
## 在从服务器上重启 mysql导入初态 ## 在从服务器上重启 mysql导入初态
```sql ```sql
-- 创建要导入的数据库 -- 创建要导入的数据库
create database data_db default charset utf8mb4; create database data_db default charset utf8mb4;
create database conf_db default charset utf8mb4; create database conf_db default charset utf8mb4;
``` ```
## 导入数据库 ## 导入数据库
```bash ```bash
msyql -uroot -p data_db < /tmp/data_db.sql msyql -uroot -p data_db < /tmp/data_db.sql
mysql -uroot -p conf_db < /tmp/conf_db.sql mysql -uroot -p conf_db < /tmp/conf_db.sql
``` ```
## 开启同步 ## 开启同步
```sql ```sql
-- 基于 binlog 文件位置复制 -- 基于 binlog 文件位置复制
change master to master_host = '192.168.1.10', change master to master_host = '192.168.1.10',
master_port = 3306, master_port = 3306,
master_user = 'replicator', master_user = 'replicator',
master_password = 'password', master_password = 'password',
master_log_file = 'mysql-bin.000001', master_log_file = 'mysql-bin.000001',
master_log_pos = 137103822; master_log_pos = 137103822;
flush privileges; flush privileges;
-- 基于 gtid 复制 -- 基于 gtid 复制
change master to master_host = '192.168.1.10', change master to master_host = '192.168.1.10',
master_port = 3306, master_port = 3306,
master_user = 'replicator', master_user = 'replicator',
master_password = 'password', master_password = 'password',
master_auto_position = 1; master_auto_position = 1;
``` ```
## 启动 slave查看 slave 状态 ## 启动 slave查看 slave 状态
```sql ```sql
start slave; start slave;
-- 在从服务器上查看 slave 状态 -- 在从服务器上查看 slave 状态
show slave status\G show slave status\G
-- 如果看到 -- 如果看到
-- Slave_IO_Running: Yes -- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes -- Slave_SQL_Running: Yes
-- 则表示 slave 开启成功! -- 则表示 slave 开启成功!
``` ```
## MySQL8 gtid 互为主从配置 ## MySQL8 gtid 互为主从配置
``` ```
[mysqld] [mysqld]
# ---- 固定配置 ---- # ---- 固定配置 ----
datadir = /var/lib/mysql datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock socket = /var/lib/mysql/mysql.sock
pid-file = /var/lib/mysql/mysql.pid pid-file = /var/lib/mysql/mysql.pid
log-timestamps = SYSTEM log-timestamps = SYSTEM
log-error = /var/log/mysql/error.log log-error = /var/log/mysql/error.log
slow-query-log = TRUE slow-query-log = TRUE
slow-query-log-file = /var/log/mysql/slow.log slow-query-log-file = /var/log/mysql/slow.log
default-authentication-plugin = mysql_native_password default-authentication-plugin = mysql_native_password
# ---- 动态配置 ---- # ---- 动态配置 ----
mysqlx = OFF mysqlx = OFF
character-set-server = utf8mb4 character-set-server = utf8mb4
default-storage-engine = innodb default-storage-engine = innodb
lower-case-table-names = 1 lower-case-table-names = 1
#skip-name-resolve = 1 #skip-name-resolve = 1
#max-user-connections = 600 #max-user-connections = 600
#innodb-buffer-pool-size = 8G #innodb-buffer-pool-size = 8G
#innodb-buffer-pool-instances = 8 #innodb-buffer-pool-instances = 8
# master # master
# 确认不同节点该 id 唯一 # 确认不同节点该 id 唯一
server-id = 1 server-id = 1
log-bin = /var/lib/mysql-bin/master log-bin = /var/lib/mysql-bin/master
binlog-format = ROW binlog-format = ROW
#binlog-do-db = db1 #binlog-do-db = db1
binlog-expire-logs-seconds = 172800 binlog-expire-logs-seconds = 172800
gtid-mode = ON gtid-mode = ON
enforce-gtid-consistency = TRUE enforce-gtid-consistency = TRUE
# slave # slave
replicate-wild-ignore-table = information_schema.% replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = mysql.% replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = performance_schema.% replicate-wild-ignore-table = performance_schema.%
replicate-wild-ignore-table = sys.% replicate-wild-ignore-table = sys.%
replica-parallel-workers = 2 replica-parallel-workers = 2
log-replica-updates = FALSE log-replica-updates = FALSE
relay-log = /var/lib/mysql-bin/slave relay-log = /var/lib/mysql-bin/slave
relay-log-recovery = TRUE relay-log-recovery = TRUE
#read-only = ON #read-only = ON
``` ```
## MySQL8 gtid 多源复制从库配置 ## MySQL8 gtid 多源复制从库配置
- 修改 my.cnf - 修改 my.cnf

View File

@ -7,68 +7,68 @@ categories: ["database"]
--- ---
## MySQL 5.7 配置文件 my.cnf ## MySQL 5.7 配置文件 my.cnf
``` ```
[mysqld] [mysqld]
datadir = /db/mysql datadir = /db/mysql
socket = /var/lib/mysql/mysql.sock socket = /var/lib/mysql/mysql.sock
symbolic-links = 0 symbolic-links = 0
log-timestamps = SYSTEM log-timestamps = SYSTEM
slow-query-log = 1 slow-query-log = 1
slow-query-log-file = /var/log/mysqld/slow.log slow-query-log-file = /var/log/mysqld/slow.log
long-query-time = 8 long-query-time = 8
#log-queries-not-using-indexes = 1 #log-queries-not-using-indexes = 1
log-error = /var/log/mysqld/error.log log-error = /var/log/mysqld/error.log
pid-file = /var/run/mysqld/mysqld.pid pid-file = /var/run/mysqld/mysqld.pid
max-connections = 1000 max-connections = 1000
max-connect-errors = 1000 max-connect-errors = 1000
max-user-connections = 600 max-user-connections = 600
interactive-timeout = 3600 interactive-timeout = 3600
wait-timeout = 3600 wait-timeout = 3600
skip-name-resolve = 1 skip-name-resolve = 1
lower-case-table-names = 1 lower-case-table-names = 1
default-time-zone = '+08:00' default-time-zone = '+08:00'
character-set-server = utf8mb4 character-set-server = utf8mb4
sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
bind-address = 0.0.0.0 bind-address = 0.0.0.0
table-open-cache = 2048 table-open-cache = 2048
default-storage-engine = innodb default-storage-engine = innodb
innodb-autoinc-lock-mode = 2 innodb-autoinc-lock-mode = 2
innodb-flush-log-at-trx-commit = 0 innodb-flush-log-at-trx-commit = 0
# 建议物理内存一半 # 建议物理内存一半
innodb-buffer-pool-size = 8G innodb-buffer-pool-size = 8G
innodb-buffer-pool-instances = 8 innodb-buffer-pool-instances = 8
max-allowed-packet = 512M max-allowed-packet = 512M
query-cache-size = 0 query-cache-size = 0
query-cache-type = 0 query-cache-type = 0
# 建议点分 ip 的最后一个数字 # 建议点分 ip 的最后一个数字
server-id = 123 server-id = 123
# bin log # bin log
#binlog-format = ROW #binlog-format = ROW
#log-bin = /var/lib/mysql/mysql-bin #log-bin = /var/lib/mysql/mysql-bin
#expire-logs-days = 3 #expire-logs-days = 3
# relay log # relay log
#read-only = 1 #read-only = 1
#replicate-wild-do-table = db1.% #replicate-wild-do-table = db1.%
#relay-log = /var/lib/mysql/mysql-relay-bin #relay-log = /var/lib/mysql/mysql-relay-bin
#slave-parallel-type = logical-clock #slave-parallel-type = logical-clock
``` ```
## 复制表结构 ## 复制表结构
```sql ```sql
create table db1.t1 like db2.t2; create table db1.t1 like db2.t2;
create table db1.t1 select db2.t2 where 1=2; create table db1.t1 select db2.t2 where 1=2;
``` ```
## 复制表结构及其数据 ## 复制表结构及其数据
```sql ```sql
create table db1.t1 select db2.t2 [where ...] create table db1.t1 select db2.t2 [where ...]
``` ```
## 复制表数据 ## 复制表数据
``` ```
insert into db2.t2(column1, column2 ...) insert into db2.t2(column1, column2 ...)
select column1, column2 ... from db1.t1 [where ...] select column1, column2 ... from db1.t1 [where ...]
``` ```
## 通过复制表文件来复制表数据 ## 通过复制表文件来复制表数据
- 在db2中创建同结构表 - 在db2中创建同结构表
@ -98,45 +98,45 @@ categories: ["database"]
``` ```
## 设置一个表的空列自增 ## 设置一个表的空列自增
```sql ```sql
-- 删除可能存在的主键 -- 删除可能存在的主键
alter table 表名 drop primary key; alter table 表名 drop primary key;
alter table 表名 modify 列名 auto_increment primary key; alter table 表名 modify 列名 auto_increment primary key;
``` ```
## 查看数据库中每个表的全部列名 ## 查看数据库中每个表的全部列名
```sql ```sql
select table_name, column_name from select table_name, column_name from
information_schema.columns information_schema.columns
where table_schema = '数据库名'; where table_schema = '数据库名';
``` ```
## 查看数据库中每个表的行数 ## 查看数据库中每个表的行数
```sql ```sql
select table_name, table_rows select table_name, table_rows
from information_schema.tables from information_schema.tables
where table_schema = '数据库名'; where table_schema = '数据库名';
``` ```
## 查看数据库中每个表的索引 ## 查看数据库中每个表的索引
```sql ```sql
select table_name, column_name, index_name select table_name, column_name, index_name
from INFORMATION_SCHEMA.STATISTICS from INFORMATION_SCHEMA.STATISTICS
where table_schema = '数据库名'; where table_schema = '数据库名';
``` ```
## 表的部分列数据到另一个表 ## 表的部分列数据到另一个表
```sql ```sql
update db2.t2(column1, column2 ...) = ( update db2.t2(column1, column2 ...) = (
select column1, column2 from db1.t1 select column1, column2 from db1.t1
where db1.t1.id = db2.t2.id); where db1.t1.id = db2.t2.id);
``` ```
## 把语句执行结果写到文件 ## 把语句执行结果写到文件
```bash ```bash
mysql -uroot -p -hsever_ip -Ddb_name mysql -uroot -p -hsever_ip -Ddb_name
-Ne "select ... from table_name;" > file_name -Ne "select ... from table_name;" > file_name
``` ```
## 表分区 ## 表分区
- 查看表的分区情况 - 查看表的分区情况
@ -210,47 +210,47 @@ categories: ["database"]
``` ```
## MySQL 5.7 从库多线程同步 ## MySQL 5.7 从库多线程同步
```sql ```sql
stop slave; stop slave;
set global slave_parallel_type='logical_clock'; set global slave_parallel_type='logical_clock';
set global slave_parallel_workers=4; set global slave_parallel_workers=4;
start slave; start slave;
show processlist; show processlist;
``` ```
## MySQL 5.7 提示密码复杂度不够 ## MySQL 5.7 提示密码复杂度不够
```sql ```sql
set global validate_password_policy=0; set global validate_password_policy=0;
``` ```
## MySQL 5.7 从库复制失败跳过指定数量的事务 ## MySQL 5.7 从库复制失败跳过指定数量的事务
```sql ```sql
stop slave; stop slave;
-- 跳过一个事务 -- 跳过一个事务
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
start slave; start slave;
-- 修改 my.cnf -- 修改 my.cnf
slave-skip-errors=1062,1053,1146,1032 #跳过指定error no类型的错误 slave-skip-errors=1062,1053,1146,1032 #跳过指定error no类型的错误
slave-skip-errors=all #跳过所有错误 slave-skip-errors=all #跳过所有错误
``` ```
## MySQL 5.7 查看全部任务 ## MySQL 5.7 查看全部任务
```sql ```sql
-- 分号换成 \G 显示完整 sql -- 分号换成 \G 显示完整 sql
show processlist; show processlist;
show full processlist; show full processlist;
SELECT command FROM information_schema.processlist; SELECT command FROM information_schema.processlist;
``` ```
## MySQL 5.7 ssl 连接 ## MySQL 5.7 ssl 连接
``` ```
--ssl-mode=REQUIRED --ssl-mode=REQUIRED
``` ```
## MariaDB 10.1 修改密码 ## MariaDB 10.1 修改密码
```sql ```sql
UPDATE user SET password=password('newpassword') WHERE user='root'; UPDATE user SET password=password('newpassword') WHERE user='root';
``` ```
## MySQL 5.7 编码 ## MySQL 5.7 编码
- 查看 - 查看
@ -272,9 +272,9 @@ categories: ["database"]
``` ```
## MySQL 5.7 升级数据库管理表结构 ## MySQL 5.7 升级数据库管理表结构
```bash ```bash
mysql_upgrade -u root -p mysql_upgrade -u root -p
``` ```
## MySQL 5.7 误删 root 后恢复 root 账户 ## MySQL 5.7 误删 root 后恢复 root 账户
- 停止 mysql 服务 - 停止 mysql 服务
@ -385,10 +385,10 @@ categories: ["database"]
- Using Flesort 依靠索引顺序达不到排序效果,需额外排序 - Using Flesort 依靠索引顺序达不到排序效果,需额外排序
## 统计 insert、delete、update 和 select 次数 ## 统计 insert、delete、update 和 select 次数
```sql ```sql
show global status where Variable_name in show global status where Variable_name in
('com_insert', 'com_delete', 'com_update', 'com_select'); ('com_insert', 'com_delete', 'com_update', 'com_select');
``` ```
## csv 文件 ## csv 文件
- 导出 - 导出

View File

@ -8,299 +8,299 @@ categories: ["network"]
--- ---
## 服务端配置文件 server.conf ## 服务端配置文件 server.conf
``` ```
################################################# #################################################
# 针对多客户端的OpenVPN 2.0 的服务器端配置文件示例 # 针对多客户端的OpenVPN 2.0 的服务器端配置文件示例
# #
# 本文件用于多客户端<->单服务器端的OpenVPN服务器端配置 # 本文件用于多客户端<->单服务器端的OpenVPN服务器端配置
# #
# OpenVPN也支持单机<->单机的配置(更多信息请查看网站上的示例页面) # OpenVPN也支持单机<->单机的配置(更多信息请查看网站上的示例页面)
# #
# 该配置支持Windows或者Linux/BSD系统。此外在Windows上记得将路径加上双引号 # 该配置支持Windows或者Linux/BSD系统。此外在Windows上记得将路径加上双引号
# 并且使用两个反斜杠,例如:"C:\\Program Files\\OpenVPN\\config\\foo.key" # 并且使用两个反斜杠,例如:"C:\\Program Files\\OpenVPN\\config\\foo.key"
# #
# '#' or ';'开头的均为注释内容 # '#' or ';'开头的均为注释内容
################################################# #################################################
#OpenVPN应该监听本机的哪些IP地址 #OpenVPN应该监听本机的哪些IP地址
#该命令是可选的如果不设置则默认监听本机的所有IP地址。 #该命令是可选的如果不设置则默认监听本机的所有IP地址。
;local a.b.c.d ;local a.b.c.d
# OpenVPN应该监听哪个TCP/UDP端口 # OpenVPN应该监听哪个TCP/UDP端口
# 如果你想在同一台计算机上运行多个OpenVPN实例你可以使用不同的端口号来区分它们。 # 如果你想在同一台计算机上运行多个OpenVPN实例你可以使用不同的端口号来区分它们。
# 此外,你需要在防火墙上开放这些端口。 # 此外,你需要在防火墙上开放这些端口。
port 1194 port 1194
#OpenVPN使用TCP还是UDP协议? #OpenVPN使用TCP还是UDP协议?
;proto tcp ;proto tcp
proto udp proto udp
# 指定OpenVPN创建的通信隧道类型。 # 指定OpenVPN创建的通信隧道类型。
# "dev tun"将会创建一个路由IP隧道 # "dev tun"将会创建一个路由IP隧道
# "dev tap"将会创建一个以太网隧道。 # "dev tap"将会创建一个以太网隧道。
# #
# 如果你是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0" # 如果你是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0"
# #
# 如果你想控制VPN的访问策略你必须为TUN/TAP接口创建防火墙规则。 # 如果你想控制VPN的访问策略你必须为TUN/TAP接口创建防火墙规则。
# #
# 在非Windows系统中你可以给出明确的单位编号(unit number),例如"tun0"。 # 在非Windows系统中你可以给出明确的单位编号(unit number),例如"tun0"。
# 在Windows中你也可以使用"dev-node"。 # 在Windows中你也可以使用"dev-node"。
# 在多数系统中除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙否则VPN将不起作用。 # 在多数系统中除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙否则VPN将不起作用。
;dev tap ;dev tap
dev tun dev tun
# 如果你想配置多个隧道你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。 # 如果你想配置多个隧道你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。
# 在XP SP2或更高版本的系统中你可能需要有选择地禁用掉针对TAP适配器的防火墙 # 在XP SP2或更高版本的系统中你可能需要有选择地禁用掉针对TAP适配器的防火墙
# 通常情况下非Windows系统则不需要该指令。 # 通常情况下非Windows系统则不需要该指令。
;dev-node MyTap ;dev-node MyTap
# 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key)。 # 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key)。
# 每个客户端和服务器端都需要它们各自的证书和私钥文件。 # 每个客户端和服务器端都需要它们各自的证书和私钥文件。
# 服务器端和所有的客户端都将使用相同的CA证书文件。 # 服务器端和所有的客户端都将使用相同的CA证书文件。
# #
# 通过easy-rsa目录下的一系列脚本可以生成所需的证书和私钥。 # 通过easy-rsa目录下的一系列脚本可以生成所需的证书和私钥。
# 记住服务器端和每个客户端的证书必须使用唯一的Common Name。 # 记住服务器端和每个客户端的证书必须使用唯一的Common Name。
# #
# 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。 # 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。
# OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的"pkcs12"指令) # OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的"pkcs12"指令)
ca ca.crt ca ca.crt
cert server.crt cert server.crt
key server.key # 该文件应该保密 key server.key # 该文件应该保密
# 指定迪菲·赫尔曼参数。 # 指定迪菲·赫尔曼参数。
# 你可以使用如下名称命令生成你的参数: # 你可以使用如下名称命令生成你的参数:
# openssl dhparam -out dh1024.pem 1024 # openssl dhparam -out dh1024.pem 1024
# 如果你使用的是2048位密钥使用2048替换其中的1024。 # 如果你使用的是2048位密钥使用2048替换其中的1024。
dh dh1024.pem dh dh1024.pem
# 设置服务器端模式并提供一个VPN子网以便于从中为客户端分配IP地址。 # 设置服务器端模式并提供一个VPN子网以便于从中为客户端分配IP地址。
# 在此处的示例中服务器端自身将占用10.8.0.1,其他的将提供客户端使用。 # 在此处的示例中服务器端自身将占用10.8.0.1,其他的将提供客户端使用。
# 如果你使用的是以太网桥接模式,请注释掉该行。更多信息请查看官方手册页面。 # 如果你使用的是以太网桥接模式,请注释掉该行。更多信息请查看官方手册页面。
server 10.8.0.0 255.255.255.0 server 10.8.0.0 255.255.255.0
# 指定用于记录客户端和虚拟IP地址的关联关系的文件。 # 指定用于记录客户端和虚拟IP地址的关联关系的文件。
# 当重启OpenVPN时再次连接的客户端将分配到与上一次分配相同的虚拟IP地址 # 当重启OpenVPN时再次连接的客户端将分配到与上一次分配相同的虚拟IP地址
ifconfig-pool-persist ipp.txt ifconfig-pool-persist ipp.txt
# 该指令仅针对以太网桥接模式。 # 该指令仅针对以太网桥接模式。
# 首先你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。 # 首先你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。
# 然后你需要手动设置桥接接口的IP地址、子网掩码 # 然后你需要手动设置桥接接口的IP地址、子网掩码
# 在这里我们假设为10.8.0.4和255.255.255.0。 # 在这里我们假设为10.8.0.4和255.255.255.0。
# 最后我们必须指定子网的一个IP范围(例如从10.8.0.50开始到10.8.0.100结束),以便于分配给连接的客户端。 # 最后我们必须指定子网的一个IP范围(例如从10.8.0.50开始到10.8.0.100结束),以便于分配给连接的客户端。
# 如果你不是以太网桥接模式,直接注释掉这行指令即可。 # 如果你不是以太网桥接模式,直接注释掉这行指令即可。
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 ;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
# 该指令仅针对使用DHCP代理的以太网桥接模式 # 该指令仅针对使用DHCP代理的以太网桥接模式
# 此时客户端将请求服务器端的DHCP服务器从而获得分配给它的IP地址和DNS服务器地址。 # 此时客户端将请求服务器端的DHCP服务器从而获得分配给它的IP地址和DNS服务器地址。
# #
# 在此之前你也需要先将以太网网卡接口和TAP接口进行桥接。 # 在此之前你也需要先将以太网网卡接口和TAP接口进行桥接。
# 注意该指令仅用于OpenVPN客户端并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。 # 注意该指令仅用于OpenVPN客户端并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。
;server-bridge ;server-bridge
# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。 # 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。
# (简而言之就是允许客户端访问VPN服务器自身所在的其他局域网) # (简而言之就是允许客户端访问VPN服务器自身所在的其他局域网)
# 记住这些私有子网也要将OpenVPN客户端的地址池(10.8.0.0/255.255.255.0)反馈回OpenVPN服务器。 # 记住这些私有子网也要将OpenVPN客户端的地址池(10.8.0.0/255.255.255.0)反馈回OpenVPN服务器。
;push "route 192.168.10.0 255.255.255.0" ;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0" ;push "route 192.168.20.0 255.255.255.0"
# 为指定的客户端分配指定的IP地址或者客户端背后也有一个私有子网想要访问VPN # 为指定的客户端分配指定的IP地址或者客户端背后也有一个私有子网想要访问VPN
# 那么你可以针对该客户端的配置文件使用ccd子目录。 # 那么你可以针对该客户端的配置文件使用ccd子目录。
# (简而言之就是允许客户端所在的局域网成员也能够访问VPN) # (简而言之就是允许客户端所在的局域网成员也能够访问VPN)
# 举个例子假设有个Common Name为"Thelonious"的客户端背后也有一个小型子网想要连接到VPN该子网为192.168.40.128/255.255.255.248。 # 举个例子假设有个Common Name为"Thelonious"的客户端背后也有一个小型子网想要连接到VPN该子网为192.168.40.128/255.255.255.248。
# 首先,你需要去掉下面两行指令的注释: # 首先,你需要去掉下面两行指令的注释:
;client-config-dir ccd ;client-config-dir ccd
;route 192.168.40.128 255.255.255.248 ;route 192.168.40.128 255.255.255.248
# 然后创建一个文件ccd/Thelonious该文件的内容为 # 然后创建一个文件ccd/Thelonious该文件的内容为
# iroute 192.168.40.128 255.255.255.248 # iroute 192.168.40.128 255.255.255.248
#这样客户端所在的局域网就可以访问VPN了 #这样客户端所在的局域网就可以访问VPN了
# 注意,这个指令只能在你是基于路由、而不是基于桥接的模式下才能生效。 # 注意,这个指令只能在你是基于路由、而不是基于桥接的模式下才能生效。
# 比如,你使用了"dev tun"和"server"指令。 # 比如,你使用了"dev tun"和"server"指令。
# 再举个例子假设你想给Thelonious分配一个固定的IP地址10.9.0.1。 # 再举个例子假设你想给Thelonious分配一个固定的IP地址10.9.0.1。
# 首先,你需要去掉下面两行指令的注释: # 首先,你需要去掉下面两行指令的注释:
;client-config-dir ccd ;client-config-dir ccd
;route 10.9.0.0 255.255.255.252 ;route 10.9.0.0 255.255.255.252
# 然后在文件ccd/Thelonious中添加如下指令 # 然后在文件ccd/Thelonious中添加如下指令
# ifconfig-push 10.9.0.1 10.9.0.2 # ifconfig-push 10.9.0.1 10.9.0.2
# 如果你想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法: # 如果你想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法:
# (1)运行多个OpenVPN守护进程每个进程对应一个群组并为每个进程(群组)启用适当的防火墙规则。 # (1)运行多个OpenVPN守护进程每个进程对应一个群组并为每个进程(群组)启用适当的防火墙规则。
# (2) (进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则。 # (2) (进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则。
# 关于learn-address脚本的更多信息请参考官方手册页面。 # 关于learn-address脚本的更多信息请参考官方手册页面。
;learn-address ./script ;learn-address ./script
# 如果启用该指令所有客户端的默认网关都将重定向到VPN这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。 # 如果启用该指令所有客户端的默认网关都将重定向到VPN这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。
# (为确保能正常工作OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接) # (为确保能正常工作OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接)
;push "redirect-gateway def1 bypass-dhcp" ;push "redirect-gateway def1 bypass-dhcp"
# 某些具体的Windows网络设置可以被推送到客户端例如DNS或WINS服务器地址。 # 某些具体的Windows网络设置可以被推送到客户端例如DNS或WINS服务器地址。
# 下列地址来自opendns.com提供的Public DNS 服务器。 # 下列地址来自opendns.com提供的Public DNS 服务器。
;push "dhcp-option DNS 208.67.222.222" ;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220" ;push "dhcp-option DNS 208.67.220.220"
# 去掉该指令的注释将允许不同的客户端之间相互"可见"(允许客户端之间互相访问)。 # 去掉该指令的注释将允许不同的客户端之间相互"可见"(允许客户端之间互相访问)。
# 默认情况下,客户端只能"看见"服务器。为了确保客户端只能看见服务器你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。 # 默认情况下,客户端只能"看见"服务器。为了确保客户端只能看见服务器你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。
;client-to-client ;client-to-client
# 如果多个客户端可能使用相同的证书/私钥文件或Common Name进行连接那么你可以取消该指令的注释。 # 如果多个客户端可能使用相同的证书/私钥文件或Common Name进行连接那么你可以取消该指令的注释。
# 建议该指令仅用于测试目的。对于生产使用环境而言,每个客户端都应该拥有自己的证书和私钥。 # 建议该指令仅用于测试目的。对于生产使用环境而言,每个客户端都应该拥有自己的证书和私钥。
# 如果你没有为每个客户端分别生成Common Name唯一的证书/私钥,你可以取消该行的注释(但不推荐这样做)。 # 如果你没有为每个客户端分别生成Common Name唯一的证书/私钥,你可以取消该行的注释(但不推荐这样做)。
;duplicate-cn ;duplicate-cn
# keepalive指令将导致类似于ping命令的消息被来回发送以便于服务器端和客户端知道对方何时被关闭。 # keepalive指令将导致类似于ping命令的消息被来回发送以便于服务器端和客户端知道对方何时被关闭。
# 每10秒钟ping一次如果120秒内都没有收到对方的回复则表示远程连接已经关闭。 # 每10秒钟ping一次如果120秒内都没有收到对方的回复则表示远程连接已经关闭。
keepalive 10 120 keepalive 10 120
# 出于SSL/TLS之外更多的安全考虑创建一个"HMAC 防火墙"可以帮助抵御DoS攻击和UDP端口淹没攻击。 # 出于SSL/TLS之外更多的安全考虑创建一个"HMAC 防火墙"可以帮助抵御DoS攻击和UDP端口淹没攻击。
# 你可以使用以下命令来生成: # 你可以使用以下命令来生成:
# openvpn --genkey --secret ta.key # openvpn --genkey --secret ta.key
# #
# 服务器和每个客户端都需要拥有该密钥的一个拷贝。 # 服务器和每个客户端都需要拥有该密钥的一个拷贝。
# 第二个参数在服务器端应该为'0',在客户端应该为'1'。 # 第二个参数在服务器端应该为'0',在客户端应该为'1'。
;tls-auth ta.key 0 # 该文件应该保密 ;tls-auth ta.key 0 # 该文件应该保密
# 选择一个密码加密算法。 # 选择一个密码加密算法。
# 该配置项也必须复制到每个客户端配置文件中。 # 该配置项也必须复制到每个客户端配置文件中。
;cipher BF-CBC # Blowfish (默认) ;cipher BF-CBC # Blowfish (默认)
;cipher AES-128-CBC # AES ;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES ;cipher DES-EDE3-CBC # Triple-DES
# 在VPN连接上启用压缩。 # 在VPN连接上启用压缩。
# 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。 # 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。
comp-lzo comp-lzo
# 允许并发连接的客户端的最大数量 # 允许并发连接的客户端的最大数量
;max-clients 100 ;max-clients 100
# 在完成初始化工作之后降低OpenVPN守护进程的权限是个不错的主意。 # 在完成初始化工作之后降低OpenVPN守护进程的权限是个不错的主意。
# 该指令仅限于非Windows系统中使用。 # 该指令仅限于非Windows系统中使用。
;user nobody ;user nobody
;group nobody ;group nobody
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。 # 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。
persist-key persist-key
persist-tun persist-tun
# 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。 # 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。
status openvpn-status.log status openvpn-status.log
# 默认情况下日志消息将写入syslog(在Windows系统中如果以服务方式运行日志消息将写入OpenVPN安装目录的log文件夹中)。 # 默认情况下日志消息将写入syslog(在Windows系统中如果以服务方式运行日志消息将写入OpenVPN安装目录的log文件夹中)。
# 你可以使用log或者log-append来改变这种默认情况。 # 你可以使用log或者log-append来改变这种默认情况。
# "log"方式在每次启动时都会清空之前的日志文件。 # "log"方式在每次启动时都会清空之前的日志文件。
# "log-append"这是在之前的日志内容后进行追加。 # "log-append"这是在之前的日志内容后进行追加。
# 你可以使用两种方式之一(但不要同时使用)。 # 你可以使用两种方式之一(但不要同时使用)。
;log openvpn.log ;log openvpn.log
;log-append openvpn.log ;log-append openvpn.log
# 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。 # 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。
# #
# 0 表示静默运行,只记录致命错误。 # 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。 # 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。 # 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息。 # 9 表示极度冗余,输出非常详细的日志信息。
verb 3 verb 3
# 重复信息的沉默度。 # 重复信息的沉默度。
# 相同类别的信息只有前20条会输出到日志文件中。 # 相同类别的信息只有前20条会输出到日志文件中。
;mute 20 ;mute 20
``` ```
## 客户端配置文件 ## 客户端配置文件
``` ```
############################################## ##############################################
# 针对多个客户端的OpenVPN 2.0 的客户端配置文件示例 # 针对多个客户端的OpenVPN 2.0 的客户端配置文件示例
# #
# 该配置文件可以被多个客户端使用,当然每个客户端都应该有自己的证书和密钥文件 # 该配置文件可以被多个客户端使用,当然每个客户端都应该有自己的证书和密钥文件
# #
# 在Windows上此配置文件的后缀应该是".ovpn"在Linux/BSD系统中则是".conf" # 在Windows上此配置文件的后缀应该是".ovpn"在Linux/BSD系统中则是".conf"
############################################## ##############################################
# 指定这是一个客户端,我们将从服务器获取某些配置文件指令 # 指定这是一个客户端,我们将从服务器获取某些配置文件指令
client client
# 在大多数系统中除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙否则VPN将不起作用。 # 在大多数系统中除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙否则VPN将不起作用。
;dev tap ;dev tap
dev tun dev tun
# 在Windows系统中如果你想配置多个隧道则需要该指令。 # 在Windows系统中如果你想配置多个隧道则需要该指令。
# 你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。 # 你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。
# 在XP SP2或更高版本的系统中你可能需要禁用掉针对TAP适配器的防火墙。 # 在XP SP2或更高版本的系统中你可能需要禁用掉针对TAP适配器的防火墙。
;dev-node MyTap ;dev-node MyTap
# 指定连接的服务器是采用TCP还是UDP协议。 # 指定连接的服务器是采用TCP还是UDP协议。
# 这里需要使用与服务器端相同的设置。 # 这里需要使用与服务器端相同的设置。
;proto tcp ;proto tcp
proto udp proto udp
# 指定服务器的主机名(或IP)以及端口号。 # 指定服务器的主机名(或IP)以及端口号。
# 如果有多个VPN服务器为了实现负载均衡你可以设置多个remote指令。 # 如果有多个VPN服务器为了实现负载均衡你可以设置多个remote指令。
remote my-server-1 1194 remote my-server-1 1194
;remote my-server-2 1194 ;remote my-server-2 1194
# 如果指定了多个remote指令启用该指令将随机连接其中的一台服务器 # 如果指定了多个remote指令启用该指令将随机连接其中的一台服务器
# 否则,客户端将按照指定的先后顺序依次尝试连接服务器。 # 否则,客户端将按照指定的先后顺序依次尝试连接服务器。
;remote-random ;remote-random
# 启用该指令,与服务器连接中断后将自动重新连接,这在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。 # 启用该指令,与服务器连接中断后将自动重新连接,这在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。
resolv-retry infinite resolv-retry infinite
# 大多数客户端不需要绑定本机特定的端口号 # 大多数客户端不需要绑定本机特定的端口号
nobind nobind
# 在初始化完毕后降低OpenVPN的权限(该指令仅限于非Windows系统中使用) # 在初始化完毕后降低OpenVPN的权限(该指令仅限于非Windows系统中使用)
;user nobody ;user nobody
;group nobody ;group nobody
# 持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。 # 持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
persist-key persist-key
persist-tun persist-tun
# 如果你是通过HTTP代理方式来连接到实际的VPN服务器请在此处指定代理服务器的主机名(或IP)和端口号。 # 如果你是通过HTTP代理方式来连接到实际的VPN服务器请在此处指定代理服务器的主机名(或IP)和端口号。
# 如果你的代理服务器需要身份认证,请参考官方手册页面。 # 如果你的代理服务器需要身份认证,请参考官方手册页面。
;http-proxy-retry # 连接失败时自动重试 ;http-proxy-retry # 连接失败时自动重试
;http-proxy [proxy server] [proxy port #] ;http-proxy [proxy server] [proxy port #]
# 无线网络通常会产生大量的重复数据包。设置此标识将忽略掉重复数据包的警告信息。 # 无线网络通常会产生大量的重复数据包。设置此标识将忽略掉重复数据包的警告信息。
;mute-replay-warnings ;mute-replay-warnings
# SSL/TLS 参数配置。 # SSL/TLS 参数配置。
# 更多描述信息请参考服务器端配置文件。 # 更多描述信息请参考服务器端配置文件。
# 最好为每个客户端单独分配.crt/.key文件对。 # 最好为每个客户端单独分配.crt/.key文件对。
# 单个CA证书可以供所有客户端使用。 # 单个CA证书可以供所有客户端使用。
ca ca.crt ca ca.crt
cert client.crt cert client.crt
key client.key key client.key
# 指定通过检查证书的nsCertType字段是否为"server"来验证服务器端证书。 # 指定通过检查证书的nsCertType字段是否为"server"来验证服务器端证书。
# 这是预防潜在攻击的一种重要措施。 # 这是预防潜在攻击的一种重要措施。
# #
# 为了使用该功能你需要在生成服务器端证书时将其中的nsCertType字段设为"server" # 为了使用该功能你需要在生成服务器端证书时将其中的nsCertType字段设为"server"
# easy-rsa文件夹中的build-key-server脚本文件可以达到该目的。 # easy-rsa文件夹中的build-key-server脚本文件可以达到该目的。
ns-cert-type server ns-cert-type server
# 如果服务器端使用了tls-auth密钥那么每个客户端也都应该有该密钥。 # 如果服务器端使用了tls-auth密钥那么每个客户端也都应该有该密钥。
;tls-auth ta.key 1 ;tls-auth ta.key 1
# 指定密码的加密算法。 # 指定密码的加密算法。
# 如果服务器端启用了cipher指令选项那么你必须也在这里指定它。 # 如果服务器端启用了cipher指令选项那么你必须也在这里指定它。
;cipher x ;cipher x
# 在VPN连接中启用压缩。 # 在VPN连接中启用压缩。
# 该指令的启用/禁用应该与服务器端保持一致。 # 该指令的启用/禁用应该与服务器端保持一致。
comp-lzo comp-lzo
# 设置日志文件冗余级别(0~9)。 # 设置日志文件冗余级别(0~9)。
# 0 表示静默运行,只记录致命错误。 # 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。 # 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。 # 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息。 # 9 表示极度冗余,输出非常详细的日志信息。
verb 3 verb 3
# 忽略过多的重复信息。 # 忽略过多的重复信息。
# 相同类别的信息只有前20条会输出到日志文件中。 # 相同类别的信息只有前20条会输出到日志文件中。
;mute 20 ;mute 20
``` ```
## 撤销客户端证书 ## 撤销客户端证书
- 生成/更新 crl.pem - 生成/更新 crl.pem

View File

@ -35,309 +35,309 @@ clob | 4GB | 字符串
bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中 bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
## 创建表 ## 创建表
```sql ```sql
CREATE TABLE table_name CREATE TABLE table_name
( (
column_name datatype [NULL|NOT NULL], column_name datatype [NULL|NOT NULL],
..., ...,
PRIMARY KEY(), PRIMARY KEY(),
CONSTRAINT table_name constraint_name FOREIGN KEY (column_name) REFERENCE table_name(column_name) ON DELETE CASCADE, CONSTRAINT table_name constraint_name FOREIGN KEY (column_name) REFERENCE table_name(column_name) ON DELETE CASCADE,
CONSTRAINT constraint_name CHECK(condition), CONSTRAINT constraint_name CHECK(condition),
CONSTRAINT constraint_name UNIQUE(column_name) CONSTRAINT constraint_name UNIQUE(column_name)
) )
|AS SELECT column_name1,column_name2,...FROM source_table; |AS SELECT column_name1,column_name2,...FROM source_table;
DROP TABLE table_name; DROP TABLE table_name;
``` ```
## 删除表 ## 删除表
```bash ```bash
DROP TABLE table_name; DROP TABLE table_name;
# 执行最快删除数据、结构、索引、约束、触发器和索引存储过程和索引invalid状态直接生效不可回滚不释放空间 # 执行最快删除数据、结构、索引、约束、触发器和索引存储过程和索引invalid状态直接生效不可回滚不释放空间
TRUNCATE TABLE table_name; TRUNCATE TABLE table_name;
# 执行较快,只删除数据,直接生效,不可回滚,释放空间 # 执行较快,只删除数据,直接生效,不可回滚,释放空间
DELETE FROM table_name [WHERE condition]; DELETE FROM table_name [WHERE condition];
# 执行最慢只删除数据commit 后生效,可回滚,不释放空间 # 执行最慢只删除数据commit 后生效,可回滚,不释放空间
``` ```
## 操作表列 ## 操作表列
```sql ```sql
ALTER TABLE table_name ALTER TABLE table_name
ADD column_name datatype [NULL|NOT NULL] ADD column_name datatype [NULL|NOT NULL]
|MODIFY column_name new_datatype|NULL|NOT NULL |MODIFY column_name new_datatype|NULL|NOT NULL
|DROP COLUMN column_name; |DROP COLUMN column_name;
-- 删除列时通常追加 CASCADE CONSTRAINTS ,以删除于该列有关的约束 -- 删除列时通常追加 CASCADE CONSTRAINTS ,以删除于该列有关的约束
``` ```
## 操作主键 ## 操作主键
```sql ```sql
ALTER TABLE table_name ALTER TABLE table_name
ADD CONSTRAINTS constraint_name PRIMARY KEY(column_name) ADD CONSTRAINTS constraint_name PRIMARY KEY(column_name)
|DROP CONSTRAINTS constraint_name; |DROP CONSTRAINTS constraint_name;
``` ```
## 操作外键 ## 操作外键
```sql ```sql
ALTER TABLE table_name ALTER TABLE table_name
ADD CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCE table_name(column_name) ON DELETE CASCADE ADD CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCE table_name(column_name) ON DELETE CASCADE
|DROP CONSTRAINT constraint_name; |DROP CONSTRAINT constraint_name;
``` ```
## 操作CHECK约束 ## 操作CHECK约束
```sql ```sql
ALTER TABLE table_name ALTER TABLE table_name
ADD CONSTRAINT constraint_name CHECK(condition) ADD CONSTRAINT constraint_name CHECK(condition)
|DROP CONSTRAINT constraint_name; |DROP CONSTRAINT constraint_name;
``` ```
## 操作UNIQUE约束 ## 操作UNIQUE约束
```sql ```sql
ALTER TABLE table_name ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE(column_name) ADD CONSTRAINT constraint_name UNIQUE(column_name)
|DROP CONSTRAINT constraint_name; |DROP CONSTRAINT constraint_name;
``` ```
## 添加数据 ## 添加数据
```sql ```sql
INSERT INTO table_name(column_name1,column_name2,...) INSERT INTO table_name(column_name1,column_name2,...)
VALUES(data1,data2,...) VALUES(data1,data2,...)
|SELECT column_name1,column_name2...FROM table_name2; |SELECT column_name1,column_name2...FROM table_name2;
``` ```
## 修改数据 ## 修改数据
```sql ```sql
UPDATE table_name SET column_name1=data1,column_name2=data2,...[WHERE condition]; UPDATE table_name SET column_name1=data1,column_name2=data2,...[WHERE condition];
``` ```
## 删除数据 ## 删除数据
```sql ```sql
DELETE FROM table_name [WHERE condition]; DELETE FROM table_name [WHERE condition];
TRUNCATE TABLE table_name; TRUNCATE TABLE table_name;
``` ```
## 查询数据 ## 查询数据
```sql ```sql
SELECT column_name1,column_name2,...FROM table_name [WHERE condition]; SELECT column_name1,column_name2,...FROM table_name [WHERE condition];
``` ```
## MERGE语句 ## MERGE语句
```sql ```sql
MERGE INTO table_name1 USING table_name2 ON(condition) WHEN MATCHED THEN ... WHEN NOT MATCHED THEN ...; MERGE INTO table_name1 USING table_name2 ON(condition) WHEN MATCHED THEN ... WHEN NOT MATCHED THEN ...;
``` ```
## SELECT 语句 ## SELECT 语句
```sql ```sql
SELECT [DISTINCT|ALL] select_list FROM table_list [WHERE ...] [GROUP BY ...] [HAVING ...] [ORDER BY ...]; SELECT [DISTINCT|ALL] select_list FROM table_list [WHERE ...] [GROUP BY ...] [HAVING ...] [ORDER BY ...];
``` ```
## select_list ## select_list
```sql ```sql
*|[schema.] {table|view} .*|expr[ [AS ]c_alias] *|[schema.] {table|view} .*|expr[ [AS ]c_alias]
``` ```
## expr ## expr
```sql ```sql
"||" 连接的字符串 | 函数 "||" 连接的字符串 | 函数
``` ```
## ORDER BY ... ## ORDER BY ...
```sql ```sql
{expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST}[ {expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST},...] {expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST}[ {expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST},...]
``` ```
## 模糊查询关键字like ## 模糊查询关键字like
```sql ```sql
'_'替代一个字符,'%'替代多个字符 '_'替代一个字符,'%'替代多个字符
``` ```
## 从给定值中选取查询 ## 从给定值中选取查询
```sql ```sql
IN(data1,data2,...) IN(data1,data2,...)
``` ```
## 连接 ## 连接
```sql ```sql
-- 连接,只能查询匹配记录 -- 连接,只能查询匹配记录
SELECT select_list FROM table_name1 INNER JOIN table_name2 ON condition; SELECT select_list FROM table_name1 INNER JOIN table_name2 ON condition;
-- 左外连接 -- 左外连接
SELECT select_list FROM table_name1 LEFT JOIN table_name2 ON condition; SELECT select_list FROM table_name1 LEFT JOIN table_name2 ON condition;
-- 右外连接 -- 右外连接
SELECT select_list FROM table_name1 RIGHT JOIN table_name2 ON condition; SELECT select_list FROM table_name1 RIGHT JOIN table_name2 ON condition;
-- 全外连接 -- 全外连接
SELECT select_list FROM table_name1 FULL JOIN table_name2 ON condition; SELECT select_list FROM table_name1 FULL JOIN table_name2 ON condition;
``` ```
## 内置函数 ## 内置函数
```sql ```sql
ABS(n) -- n绝对值 ABS(n) -- n绝对值
MOD(n2,n1) -- n2对n1取余 MOD(n2,n1) -- n2对n1取余
SIGN(n) -- n的符号 SIGN(n) -- n的符号
CEIL(n) -- 大于等于n的最小整数 CEIL(n) -- 大于等于n的最小整数
FLOOR(n) -- 小于等于n的最大整数 FLOOR(n) -- 小于等于n的最大整数
SQRT(n) -- n的平方根 SQRT(n) -- n的平方根
POWER(n2,n1) -- n2的n1次幂 POWER(n2,n1) -- n2的n1次幂
EXP(n) -- e的n次幂 EXP(n) -- e的n次幂
LOG(n1,n2) -- n1为底n2的对数 LOG(n1,n2) -- n1为底n2的对数
LN(n) -- n的自然对数 LN(n) -- n的自然对数
ROUND(n2,n1) -- n2小数部分四舍五入至n1位 ROUND(n2,n1) -- n2小数部分四舍五入至n1位
TRUNC(n2,n1) -- n2截取至n1位 TRUNC(n2,n1) -- n2截取至n1位
CHR(n) -- 把n根据ASCII转换成字符 CHR(n) -- 把n根据ASCII转换成字符
ASCII(char) -- 参数首字母的ASCII值 ASCII(char) -- 参数首字母的ASCII值
LENGTH(char) -- 字符串长度 LENGTH(char) -- 字符串长度
SUBSTR(char,position[,substring_length]) -- 截取字符串 SUBSTR(char,position[,substring_length]) -- 截取字符串
CONCAT(char1,char2) -- 连接字符串 CONCAT(char1,char2) -- 连接字符串
INSTR(string,substring[,position[,occurrence]]) -- 查找字符串 INSTR(string,substring[,position[,occurrence]]) -- 查找字符串
UPPER(char) -- 转换成大写 UPPER(char) -- 转换成大写
LOWER(char) -- 转换成小些 LOWER(char) -- 转换成小些
INITCAP(char) -- 单词首字母大写 INITCAP(char) -- 单词首字母大写
NLSSORT(char[,nslparam]) -- 按指定方式排序'NLS_SORT=SCHINESE_PINYIN_M' NLSSORT(char[,nslparam]) -- 按指定方式排序'NLS_SORT=SCHINESE_PINYIN_M'
REPLACE(char,search_string[,replacement_string]) -- 字符串替换,默认删除 REPLACE(char,search_string[,replacement_string]) -- 字符串替换,默认删除
RPAD(expr1,n[,expr2]) -- 用expr2右填充expr1至长度为n默认空格 RPAD(expr1,n[,expr2]) -- 用expr2右填充expr1至长度为n默认空格
LPAD(expr1,n[,expr2]) -- 用expr2左填充expr1至长度为n默认空格 LPAD(expr1,n[,expr2]) -- 用expr2左填充expr1至长度为n默认空格
TRIM([LEADING|TRAILING|BOTH] [trim_character FROM] trim_source) -- 删除字符串首尾指定字符 TRIM([LEADING|TRAILING|BOTH] [trim_character FROM] trim_source) -- 删除字符串首尾指定字符
SYSDATE -- 获取系统当前日期 SYSDATE -- 获取系统当前日期
SYSTIMESTAMP -- 获取系统当前时间 SYSTIMESTAMP -- 获取系统当前时间
DBTIMEZONE -- 获取数据库当前时区 DBTIMEZONE -- 获取数据库当前时区
ADD_MONTHS(date,integer) -- 指定日期增加指定月份数 ADD_MONTHS(date,integer) -- 指定日期增加指定月份数
SESSIONTIMEZONE -- 获取当前会话的时区 SESSIONTIMEZONE -- 获取当前会话的时区
LAST_DAY(date) -- 获取指定日期对应月份的最后一天 LAST_DAY(date) -- 获取指定日期对应月份的最后一天
NEXT_DAY(date,char) -- 获取下周char的日期 NEXT_DAY(date,char) -- 获取下周char的日期
CURRENT_DATE -- 获取会话时区的当前日期 CURRENT_DATE -- 获取会话时区的当前日期
EXTRACT(datetime) -- 从指定时间中获取指定部分 EXTRACT(datetime) -- 从指定时间中获取指定部分
MONTHS_BETWEEN(date1,date2) -- 获取两个时间之间的月份数 MONTHS_BETWEEN(date1,date2) -- 获取两个时间之间的月份数
NET_TIME(date,timezone1,timezone2) -- 获取时区1中的时间转换到时区2后的时间 NET_TIME(date,timezone1,timezone2) -- 获取时区1中的时间转换到时区2后的时间
TO_CHAR(n[,fmt]) -- 转换为字符类型 TO_CHAR(n[,fmt]) -- 转换为字符类型
TO_DATE(n[,fmt]) -- 转换为时间类型 TO_DATE(n[,fmt]) -- 转换为时间类型
TO_NUMBER(n[,fmt]) -- 转换为数字类型 TO_NUMBER(n[,fmt]) -- 转换为数字类型
LNNVL(condition) -- 排除指定条件函数 LNNVL(condition) -- 排除指定条件函数
NVL(expr1,expr2) -- expr1为空时返回expr2 NVL(expr1,expr2) -- expr1为空时返回expr2
NVL2(expr1,expr2,expr3) -- expr1为空时返回expr3不为空返回expr2 NVL2(expr1,expr2,expr3) -- expr1为空时返回expr3不为空返回expr2
AVG([DISTINCT|ALL ]expr) -- 获取平均值 AVG([DISTINCT|ALL ]expr) -- 获取平均值
COUNT(*|[DISTINCT|ALL ]expr) -- 获取数量 COUNT(*|[DISTINCT|ALL ]expr) -- 获取数量
SUM([DISTINCT|ALL ]expr) -- 获取和 SUM([DISTINCT|ALL ]expr) -- 获取和
SELECT USER FROM DUAL; -- 返回当前会话的登录名 SELECT USER FROM DUAL; -- 返回当前会话的登录名
USERENV(param) -- 返回当前会话的信息 USERENV(param) -- 返回当前会话的信息
SYS_CONTEXT(namespace,param) -- 返回oracle已创建的context SYS_CONTEXT(namespace,param) -- 返回oracle已创建的context
DECODE(expr,search,result[,search1,result1...]) -- expr结果是search返回result DECODE(expr,search,result[,search1,result1...]) -- expr结果是search返回result
``` ```
## 查看所有默认表空间 ## 查看所有默认表空间
```sql ```sql
SELECT TABLESPACE_NAME FROM DBA_TABLESPACES; SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;
``` ```
## 查看指定用户默认表空间 ## 查看指定用户默认表空间
```sql ```sql
SELECT DEFAULT_STAPCE,USERNAME FROM DBA_USERS WHERE USERNAME='username'; SELECT DEFAULT_STAPCE,USERNAME FROM DBA_USERS WHERE USERNAME='username';
``` ```
## 创建表空间 ## 创建表空间
```sql ```sql
CREATE TABLESPACE tablespace_name CREATE TABLESPACE tablespace_name
DATAFILE filename DATAFILE filename
SIZE size SIZE size
[AUTOEXTEND [ON NEXT size|OFF]] [AUTOEXTEND [ON NEXT size|OFF]]
[MAXSIZE size] [MAXSIZE size]
[PERMANENT|TEMPORARY] 永久/临时表空间,默认永久 [PERMANENT|TEMPORARY] 永久/临时表空间,默认永久
[EXTENT MANAGEMENT [DICTIONARY|LOCAL 字典/本地管理方式,默认本地 [EXTENT MANAGEMENT [DICTIONARY|LOCAL 字典/本地管理方式,默认本地
[AUTOALLOCATE|UNIFORM. [SIZE integer[K|M]]]]; [AUTOALLOCATE|UNIFORM. [SIZE integer[K|M]]]];
``` ```
## 重命名表空间 ## 重命名表空间
```sql ```sql
ALTER TABLESPACE oldname RENAME TO newname; ALTER TABLESPACE oldname RENAME TO newname;
``` ```
## 修改表空间大小 ## 修改表空间大小
```sql ```sql
ALTER DATABASE DATAFILE filename RESIZE size; ALTER DATABASE DATAFILE filename RESIZE size;
``` ```
## 增加表空间大小 ## 增加表空间大小
```sql ```sql
ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size; ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size;
``` ```
## 设置表空间读写状态 ## 设置表空间读写状态
```sql ```sql
ALTER TABLESPACE tablespace_name READ {ONLY|WRITE}; ALTER TABLESPACE tablespace_name READ {ONLY|WRITE};
``` ```
## 设置表空间可用状态 ## 设置表空间可用状态
```sql ```sql
ALTER TABLESPACE tablespace_name {ONLINE|OFFLINE [NORMAL|TEMPORARY|IMMEDIATE]}; ALTER TABLESPACE tablespace_name {ONLINE|OFFLINE [NORMAL|TEMPORARY|IMMEDIATE]};
``` ```
## 创建大文件表空间 ## 创建大文件表空间
```sql ```sql
CREATE BIGFILE TABLESPACE tablespace_name DATAFILE filename SIZE size; CREATE BIGFILE TABLESPACE tablespace_name DATAFILE filename SIZE size;
``` ```
## 删除表空间 ## 删除表空间
```sql ```sql
DROP TABLESPACE tablespace_name DROP TABLESPACE tablespace_name
[INCLUDING CONTENTS AND DATAFILES] 数据文件删除 [INCLUDING CONTENTS AND DATAFILES] 数据文件删除
[CASCADE CONSTRAINTS]; 完整性删除 [CASCADE CONSTRAINTS]; 完整性删除
``` ```
## 查看表空间大小 ## 查看表空间大小
```sql ```sql
SELECT TABLESPACE_NAME,FILE_NAME,BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME=tablespace_name; SELECT TABLESPACE_NAME,FILE_NAME,BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME=tablespace_name;
``` ```
## 查看表空间剩余 空间 ## 查看表空间剩余 空间
```sql ```sql
SELECT TABLESPACE_NAME,BYTES FROM DBA_FREE_SPACES; SELECT TABLESPACE_NAME,BYTES FROM DBA_FREE_SPACES;
``` ```
## 创建/修改用户 ## 创建/修改用户
```sql ```sql
CREATE|ALTER CREATE|ALTER
USER user_name USER user_name
IDENTIFIED BY password IDENTIFIED BY password
[DEFAULT TABLESPACE tablespace_name ] [DEFAULT TABLESPACE tablespace_name ]
[QUOTA size|UNLIMITED ON tablespace_name ] 用户使用表空间的最大值 [QUOTA size|UNLIMITED ON tablespace_name ] 用户使用表空间的最大值
[PROFILE profile ] 概要文件 [PROFILE profile ] 概要文件
[PASSWORD EXPIRE ] 用户密码过期 [PASSWORD EXPIRE ] 用户密码过期
[ACCOUNT LOCK|UNLOCK]; 默认锁定状态 [ACCOUNT LOCK|UNLOCK]; 默认锁定状态
``` ```
## 删除用户 ## 删除用户
```sql ```sql
DROP USER user_name CASCADE; DROP USER user_name CASCADE;
``` ```
## 授予系统权限 ## 授予系统权限
```sql ```sql
GRANT GRANT
system_privileges|ALL PRIVILEGES 权限 system_privileges|ALL PRIVILEGES 权限
TO {user IDENTIFIED BY password|role } 用户/角色 TO {user IDENTIFIED BY password|role } 用户/角色
[WITH ADMIN OPTION]; 授予其他用户或角色系统权限 [WITH ADMIN OPTION]; 授予其他用户或角色系统权限
``` ```
## 授予对象权限 ## 授予对象权限
```sql ```sql
GRANT GRANT
object_privilege|ALL 权限 object_privilege|ALL 权限
ON schema.object 对象 ON schema.object 对象
TO user_name|role_name 用户/角色 TO user_name|role_name 用户/角色
[WITH ADMIN OPTION ] 授予其他用户或角色系统权限 [WITH ADMIN OPTION ] 授予其他用户或角色系统权限
[WITH THE GRANT ANY OBJECT]; 授予其他用户或角色对象权限 [WITH THE GRANT ANY OBJECT]; 授予其他用户或角色对象权限
``` ```
## 撤销系统权限 ## 撤销系统权限
```sql ```sql
REVOKE system_privilege FROM REVOKE system_privilege FROM
user|role; user|role;
``` ```
## 撤销对象权限 ## 撤销对象权限
```sql ```sql
REVOKE REVOKE
object_privilege |ALL object_privilege |ALL
ON schema.object FROM ON schema.object FROM
user_name|role_name user_name|role_name
[CASCADE CONSTRAINTS]; [CASCADE CONSTRAINTS];
``` ```
## 数据字典 ## 数据字典
数据 | 字典 数据 | 字典
@ -347,150 +347,150 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
用户角色 | DBA_ROLE_PRIVS 用户角色 | DBA_ROLE_PRIVS
## 创建角色 ## 创建角色
```sql ```sql
CREATE|ALTER //创建/修改 CREATE|ALTER //创建/修改
ROLE role_name ROLE role_name
[NOT IDENTIFIED|IDENDIFIED BY [password]]; [NOT IDENTIFIED|IDENDIFIED BY [password]];
GRANT //填充权限 GRANT //填充权限
system_privilege|ALL PRIVILEGES system_privilege|ALL PRIVILEGES
TO role_name TO role_name
[WITH ADMIN OPTION]; [WITH ADMIN OPTION];
-- 角色创建完成后不能直接使用,需将角色赋予用户才能使用 -- 角色创建完成后不能直接使用,需将角色赋予用户才能使用
GRANT role_name TO user_name; GRANT role_name TO user_name;
SET ROLE role_name -- 设置角色生效 SET ROLE role_name -- 设置角色生效
SET ROLE ALL -- 设置所有角色生效 SET ROLE ALL -- 设置所有角色生效
SET ROLE ALL EXCEPT role_name -- 设置只有role_name失效 SET ROLE ALL EXCEPT role_name -- 设置只有role_name失效
SET ROLE NONE -- 设置所有角色失效 SET ROLE NONE -- 设置所有角色失效
``` ```
## 删除角色 ## 删除角色
```sql ```sql
DROP ROLE role_name; DROP ROLE role_name;
``` ```
## 脱机备份(冷备份)/恢复 ## 脱机备份(冷备份)/恢复
```sql ```sql
关闭数据库服务后直接复制需要的文件,包括数据文件和控制文件 关闭数据库服务后直接复制需要的文件,包括数据文件和控制文件
``` ```
## 联机备份(热备份) ## 联机备份(热备份)
```sql ```sql
ARCHIVE LOG LIST 查看本机数据库的日志状态 ARCHIVE LOG LIST 查看本机数据库的日志状态
ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE; 设置日志模式为归档 ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE; 设置日志模式为归档
SHUTDOWN IMMEDIATE; 关闭数据库 SHUTDOWN IMMEDIATE; 关闭数据库
STARTUP MOUNT; 启动mount实例 STARTUP MOUNT; 启动mount实例
ALTER DATABASE ARCHIVELOG; 更改数据库为归档日志模式 ALTER DATABASE ARCHIVELOG; 更改数据库为归档日志模式
ALTER DATABASE OPEN; 更改数据库状态为打开模式 ALTER DATABASE OPEN; 更改数据库状态为打开模式
ALTER TABLESPACE tablespace_name BEGIN BACKUP; 开始备份数据库 ALTER TABLESPACE tablespace_name BEGIN BACKUP; 开始备份数据库
复制文件到其他目录 复制文件到其他目录
ALTER TABLESPACE tablespace_name END BACKUP; 结束备份操作 ALTER TABLESPACE tablespace_name END BACKUP; 结束备份操作
``` ```
## 恢复 ## 恢复
```sql ```sql
ALTER SYSTEM ARCHIVE LOG CURRENT; 归档当前日志 ALTER SYSTEM ARCHIVE LOG CURRENT; 归档当前日志
ALTER SYSTEM SWITCH LOGFILE; 切换日志文件 ALTER SYSTEM SWITCH LOGFILE; 切换日志文件
SELECT * FROM v$RECOVER_FILE 获取文件编号 SELECT * FROM v$RECOVER_FILE 获取文件编号
ALTER DATABASE DATAFILE file_id OFFLINE DROP; 把要恢复的数据文件脱机 ALTER DATABASE DATAFILE file_id OFFLINE DROP; 把要恢复的数据文件脱机
ALTER DATABASE OPEN; 更改数据库状态为打开模式 ALTER DATABASE OPEN; 更改数据库状态为打开模式
RECOVER DATAFILE file_id; 恢复数据文件 RECOVER DATAFILE file_id; 恢复数据文件
ALTER DATABASE DATAFILE file_id ONLINE; 设置数据文件联机 ALTER DATABASE DATAFILE file_id ONLINE; 设置数据文件联机
``` ```
## EXP工具导出数据 ## EXP工具导出数据
```bash ```bash
exp db_user/password 登陆数据库的用户名和密码非SYS exp db_user/password 登陆数据库的用户名和密码非SYS
``` ```
## EXP工具直接导出表 ## EXP工具直接导出表
```bash ```bash
exp db_user/password file="filename.dmp" tables="table_name,..." exp db_user/password file="filename.dmp" tables="table_name,..."
``` ```
## EXP工具导出表空间 ## EXP工具导出表空间
```bash ```bash
exp db_user/password file="filename.dmp" tablespaces="tablespaces_name" exp db_user/password file="filename.dmp" tablespaces="tablespaces_name"
``` ```
## EXPDP导出数据 ## EXPDP导出数据
```sql ```sql
CREATE DIRECTORY directory_name AS 'file_name'; 目录名称 文件名称 CREATE DIRECTORY directory_name AS 'file_name'; 目录名称 文件名称
GRANT READ,WRITE ON DIRECTORY directory_name TO db_user; 授权用户使用该目录 GRANT READ,WRITE ON DIRECTORY directory_name TO db_user; 授权用户使用该目录
#expdp db_user/password directory=directory_name dumpfile=file_name tables=table_name; #expdp db_user/password directory=directory_name dumpfile=file_name tables=table_name;
``` ```
## IMP导入数据 ## IMP导入数据
```sql ```sql
imp db_user/password imp db_user/password
``` ```
## IMP直接导入表 ## IMP直接导入表
```sql ```sql
imp db_user/password file="filename.dmp" tables="table_name,..." imp db_user/password file="filename.dmp" tables="table_name,..."
``` ```
## IMPDP导入数据 ## IMPDP导入数据
```sql ```sql
impdp db_user_password impdp db_user_password
``` ```
## IMPDP直接导入表 ## IMPDP直接导入表
```bash ```bash
impdp db_user/password directory=dir dumpfile=filename.dmp tables=table_name; impdp db_user/password directory=dir dumpfile=filename.dmp tables=table_name;
``` ```
## RMAN工具配置 ## RMAN工具配置
```sql ```sql
CONN /AS SYSDBA; 连接恢复目录数据库 CONN /AS SYSDBA; 连接恢复目录数据库
CREATE USER rman_user IDENTIFIED BY password DEFAULT TABLESPACE tablespace_name; 创建恢复用户 CREATE USER rman_user IDENTIFIED BY password DEFAULT TABLESPACE tablespace_name; 创建恢复用户
GRANT RECOVERY_CATALOG_OWNER TO rman_user; 为新创建的用户授权 GRANT RECOVERY_CATALOG_OWNER TO rman_user; 为新创建的用户授权
#rman #rman
CONN CATALOG rman_user/password; 连接新创建的用户 CONN CATALOG rman_user/password; 连接新创建的用户
CREATE CATALOG; 创建恢复目录 CREATE CATALOG; 创建恢复目录
``` ```
## RMAN工具使用 ## RMAN工具使用
```sql ```sql
#rman target db_user/password@servicename catalog rman_user/password 连接恢复目录数据库 #rman target db_user/password@servicename catalog rman_user/password 连接恢复目录数据库
CONNECT TARGET db_user/password@servicename; 连接目标数据库 CONNECT TARGET db_user/password@servicename; 连接目标数据库
CONNECT CATALOG rman_user/password@servicename; 连接恢复目录数据库 CONNECT CATALOG rman_user/password@servicename; 连接恢复目录数据库
REGISTER database; 在恢复目录数据库中注册数据库 REGISTER database; 在恢复目录数据库中注册数据库
``` ```
## 手动分配通道 ## 手动分配通道
```sql ```sql
关闭目标数据库启动到mount状态运行 关闭目标数据库启动到mount状态运行
run run
{ {
ALLOCATE CHANNEL channel_name1 DEVICE TYPE {sbt|disk}; ALLOCATE CHANNEL channel_name1 DEVICE TYPE {sbt|disk};
... ...
BACKUP [level] [backup type] [option] BACKUP [level] [backup type] [option]
} }
``` ```
## 自动分配通道 ## 自动分配通道
```sql ```sql
CONFIGURE DEVICE TYPE {sbt|disk} PARALLELISM n; 指定通道类型和名称 CONFIGURE DEVICE TYPE {sbt|disk} PARALLELISM n; 指定通道类型和名称
CONFIGURE DEFAULT DEVICE TYPE {sbt|disk}; 指定默认设备类型 CONFIGURE DEFAULT DEVICE TYPE {sbt|disk}; 指定默认设备类型
BACKUP [level] [backup type] [option]; BACKUP [level] [backup type] [option];
``` ```
## BACKUP 参数 ## BACKUP 参数
```sql ```sql
level 备份增量1、2、3、4或者FULL全备份 level 备份增量1、2、3、4或者FULL全备份
backup type 对象类型database、datafile、tablespace、controlfilecopy、archivelog all backup type 对象类型database、datafile、tablespace、controlfilecopy、archivelog all
option channel备份使用的通道 maxsetsize定义备份集的最大值 option channel备份使用的通道 maxsetsize定义备份集的最大值
``` ```
## RESTORE还原 ## RESTORE还原
```sql ```sql
RESTORE database_object; RESTORE database_object;
database_object: DATABASE(mount),TABLESPACE(open),DATAFILE,CONTROLFILE(mount),ARCHIVELOG,SPFILE(mount) database_object: DATABASE(mount),TABLESPACE(open),DATAFILE,CONTROLFILE(mount),ARCHIVELOG,SPFILE(mount)
``` ```
## RECOVER同步恢复 ## RECOVER同步恢复
```sql ```sql
RECOVER database_object; RECOVER database_object;
database_object: DATABASE(mount),TABLESPACE(open),DATAFILE database_object: DATABASE(mount),TABLESPACE(open),DATAFILE
``` ```

View File

@ -7,30 +7,30 @@ categories: ["python"]
--- ---
## 生成标准的、符合Unix/Posix 规范的命令行说明 ## 生成标准的、符合Unix/Posix 规范的命令行说明
```python ```python
from optparse import OptionParser from optparse import OptionParser
parser = OptionParser() parser = OptionParser()
parser.add_option('-p', '--pdbk', action = 'store_true', dest = 'pdcl', default = False, parser.add_option('-p', '--pdbk', action = 'store_true', dest = 'pdcl', default = False,
help = 'write pdbk data to oracle db') help = 'write pdbk data to oracle db')
parser.add_option('-z', '--zdbk', action = 'store_true', dest = 'zdcl', default = False, parser.add_option('-z', '--zdbk', action = 'store_true', dest = 'zdcl', default = False,
help = 'write zdbk data to oracle db') help = 'write zdbk data to oracle db')
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
if options.pdcl == True: if options.pdcl == True:
print 'pdcl is true.' print 'pdcl is true.'
if options.zdcl == True: if options.zdcl == True:
print 'zdcl is True.' print 'zdcl is True.'
``` ```
## 简单流程 ## 简单流程
```python ```python
# 引入OptionParser类创建OptionParser对象 # 引入OptionParser类创建OptionParser对象
from optparse import OptionParser from optparse import OptionParser
parser = OptionParser() parser = OptionParser()
# 定义命令行参数 # 定义命令行参数
parser.add_option(opt_str, ..., attr = value, ...) parser.add_option(opt_str, ..., attr = value, ...)
# 解析命令行参数 # 解析命令行参数
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
``` ```
## parse_args 和 add_options 函数 ## parse_args 和 add_options 函数
- parse_args() 接收一个命令行列表,默认使用 sys.argv\[:-1\] - parse_args() 接收一个命令行列表,默认使用 sys.argv\[:-1\]
@ -93,12 +93,12 @@ categories: ["python"]
- metavar 提醒用户该参数期待的参数,如 metavar = 'mode' 会在帮助中显示成 -m MODE, --mode=MODE - metavar 提醒用户该参数期待的参数,如 metavar = 'mode' 会在帮助中显示成 -m MODE, --mode=MODE
## OptionGroup 参数分组 ## OptionGroup 参数分组
```python ```python
group = OptionGroup(parser, 'Dangerous Options', group = OptionGroup(parser, 'Dangerous Options',
'Caution: use these options at your own risk. It is believed that some of them bite.') 'Caution: use these options at your own risk. It is believed that some of them bite.')
group.add_option('-g', action = 'store_true', help = 'Group option.') group.add_option('-g', action = 'store_true', help = 'Group option.')
parser.add_option_group(group) parser.add_option_group(group)
``` ```
- version 创建OptionParser对象时指定该参数会解释成 --version 命令行参数 - version 创建OptionParser对象时指定该参数会解释成 --version 命令行参数
- optparser 可以自动探测并处理一些用户异常,也可以使用 parser.error() 方法来自定义部分异常的处理 - optparser 可以自动探测并处理一些用户异常,也可以使用 parser.error() 方法来自定义部分异常的处理