From f8bf6ecd5243e8a76d5543aea3755482d9650d8b Mon Sep 17 00:00:00 2001 From: colben Date: Tue, 17 May 2022 22:38:01 +0800 Subject: [PATCH] update --- content/post/awk.md | 35 +- content/post/centos6-oracle11g.md | 30 +- content/post/ftp.md | 126 ++--- content/post/gnome.md | 178 +++---- content/post/makefile.md | 11 +- content/post/mariadb-galera.md | 12 +- content/post/mariadb-replication.md | 196 +++---- content/post/mysql-galera.md | 116 ++-- content/post/mysql-group-replication.md | 120 ++--- content/post/mysql-replication.md | 320 +++++------ content/post/mysql.md | 246 ++++----- content/post/openvpn.md | 582 ++++++++++---------- content/post/oracle.md | 674 ++++++++++++------------ content/post/python-op.md | 56 +- 14 files changed, 1352 insertions(+), 1350 deletions(-) diff --git a/content/post/awk.md b/content/post/awk.md index ef770c2..68c2504 100644 --- a/content/post/awk.md +++ b/content/post/awk.md @@ -68,6 +68,7 @@ exit n | 终止 awk,返回 n ``` ## 判断语句 +- if ```awk if(条件){ # 语句 @@ -104,23 +105,23 @@ exit n | 终止 awk,返回 n - continue 退出本次循环,继续下一次循环 ## 脚本 - ```awk - #!/usr/bin/awk -f - - # 自定义的变量和函数 - # ... - - # 从这里开始执行 - BEGIN{ - # 语句 - } - 条件{ - # 语句 - } - END{ - # 语句 - } - ``` +```awk +#!/usr/bin/awk -f + +# 自定义的变量和函数 +# ... + +# 从这里开始执行 +BEGIN{ + # 语句 +} +条件{ + # 语句 +} +END{ + # 语句 +} +``` ## 其他说明 - 变量在使用时直接赋值即可,无需提前声明或定义 diff --git a/content/post/centos6-oracle11g.md b/content/post/centos6-oracle11g.md index e56ab83..d628ec5 100644 --- a/content/post/centos6-oracle11g.md +++ b/content/post/centos6-oracle11g.md @@ -7,19 +7,19 @@ categories: ["database"] --- ## 安装依赖 - ```bash - yum install binutils compat-libstdc++-33 compat-libstdc++-33.i686 \ - elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc.i686 \ - glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh libaio \ - libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc++ \ - libstdc++.i686 libstdc++-devel make sysstat unixODBC unixODBC-devel - ``` +```bash +yum install binutils compat-libstdc++-33 compat-libstdc++-33.i686 \ +elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc.i686 \ +glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh libaio \ +libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc++ \ +libstdc++.i686 libstdc++-devel make sysstat unixODBC unixODBC-devel +``` ## 创建用户和用户组 - ```bash - groupadd dba oinstall - useradd -g oinstall -m oracle - ``` +```bash +groupadd dba oinstall +useradd -g oinstall -m oracle +``` ## 配置oracle用户环境变量 - 打开 oracle 用户的的默认shell配置文件 ~/.bashrc,在最后添加以下代码 @@ -39,10 +39,10 @@ categories: ["database"] ``` ## 创建oracle 11g软件安装路径 - ```bash - mkdir /opt/oracle/app/product/11.2.0/db_home1 -p - chown oracle.oinstall /opt/oracle -R - ``` +```bash +mkdir /opt/oracle/app/product/11.2.0/db_home1 -p +chown oracle.oinstall /opt/oracle -R +``` ## 配置内核参数 - 编辑 /etc/sysctl.conf,在文件尾追加下面的参数设置 diff --git a/content/post/ftp.md b/content/post/ftp.md index e8b4ef2..6474957 100644 --- a/content/post/ftp.md +++ b/content/post/ftp.md @@ -12,9 +12,9 @@ categories: ["storage"] - 关闭 selinux ## 安装 vsftpd 服务 - ```bash - yum install vsftpd - ``` +```bash +yum install vsftpd +``` ## 常用客户端 - ftp @@ -54,69 +54,69 @@ categories: ["storage"] ``` ## 匿名用户配置 - ```ini - # 控制是否允许匿名用户登入 - # 匿名用户使用的登陆名为 ftp 或 anonymous,口令为空 - # 匿名用户不能离开匿名用户家目录/var/ftp,且只能下载不能上传 - anonymous_enable=YES/NO(YES) - - # 匿名登入时,不会询问密码 - no_anon_password=YES/NO(NO) - - # 定义匿名登入的使用者名称,默认值为ftp - ftp_username=ftp - - # 是否允许登陆用户有写权限,属于全局设置 - write_enable=YES/NO(YES) - - # 使用匿名登入时,所登入的目录,默认值为/var/ftp - # 注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限 - anon_root=/var/ftp - - # 是否允许匿名者有上传文件(非目录)的权限 - # 只有在write_enable=YES时,此项才有效 - # 匿名用户必须要有对上层目录的写入权 - anon_upload_enable=YES/NO(NO) - - # 是否允许匿名者下载可阅读的档案 - anon_world_readable_only=YES/NO(YES) - - # 是否允许匿名者有新增目录的权限 - # 只有在write_enable=YES时,此项才有效 - # 匿名用户必须要有对上层目录的写入权 - anon_mkdir_write_enable=YES/NO(NO) - - # 是否允许匿名入者拥有其他权限,譬如删除或者重命名 - # 如果anon_upload_enable=NO,则匿名用户不能上传文件,但可以删除或者重命名已经存在的文件 - # 如果anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但可以删除或者重命名已经存在的目录 - anon_other_write_enable=YES/NO(NO) - - # 是否改变匿名用户上传文件(非目录)的属主 - chown_uploads=YES/NO(NO) - - # 设置匿名用户上传文件(非目录)的属主名 - # 建议不要设置为root - chown_username=username - - # 设置匿名登入者新增或上传档案时的 umask 值,默认值为 077 - anon_umask=077 - ``` +```ini +# 控制是否允许匿名用户登入 +# 匿名用户使用的登陆名为 ftp 或 anonymous,口令为空 +# 匿名用户不能离开匿名用户家目录/var/ftp,且只能下载不能上传 +anonymous_enable=YES/NO(YES) + +# 匿名登入时,不会询问密码 +no_anon_password=YES/NO(NO) + +# 定义匿名登入的使用者名称,默认值为ftp +ftp_username=ftp + +# 是否允许登陆用户有写权限,属于全局设置 +write_enable=YES/NO(YES) + +# 使用匿名登入时,所登入的目录,默认值为/var/ftp +# 注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限 +anon_root=/var/ftp + +# 是否允许匿名者有上传文件(非目录)的权限 +# 只有在write_enable=YES时,此项才有效 +# 匿名用户必须要有对上层目录的写入权 +anon_upload_enable=YES/NO(NO) + +# 是否允许匿名者下载可阅读的档案 +anon_world_readable_only=YES/NO(YES) + +# 是否允许匿名者有新增目录的权限 +# 只有在write_enable=YES时,此项才有效 +# 匿名用户必须要有对上层目录的写入权 +anon_mkdir_write_enable=YES/NO(NO) + +# 是否允许匿名入者拥有其他权限,譬如删除或者重命名 +# 如果anon_upload_enable=NO,则匿名用户不能上传文件,但可以删除或者重命名已经存在的文件 +# 如果anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但可以删除或者重命名已经存在的目录 +anon_other_write_enable=YES/NO(NO) + +# 是否改变匿名用户上传文件(非目录)的属主 +chown_uploads=YES/NO(NO) + +# 设置匿名用户上传文件(非目录)的属主名 +# 建议不要设置为root +chown_username=username + +# 设置匿名登入者新增或上传档案时的 umask 值,默认值为 077 +anon_umask=077 +``` ## 配置 ### 常用配置 - ```ini - #允许匿名用户登陆 - anonymous_enable=YES - #允许本地用户登陆 - local_enable=YES - #允许登陆用户写可访问的目录或文件 - write_enable=YES - #指定用户登陆后直接进入系统的/mnt目录 - local_root=/mnt - chroot_list_enable=YES - #限定登陆用户可访问的目录只有自己的家目录或指定的local_root目录 - chroot_list_file=/etc/vsftpd/chroot_list - ``` +```ini +#允许匿名用户登陆 +anonymous_enable=YES +#允许本地用户登陆 +local_enable=YES +#允许登陆用户写可访问的目录或文件 +write_enable=YES +#指定用户登陆后直接进入系统的/mnt目录 +local_root=/mnt +chroot_list_enable=YES +#限定登陆用户可访问的目录只有自己的家目录或指定的local_root目录 +chroot_list_file=/etc/vsftpd/chroot_list +``` ### 允许 vsftpd 匿名用户上传和下载 - 创建匿名用户登陆目录 diff --git a/content/post/gnome.md b/content/post/gnome.md index 20842b5..ba05c36 100644 --- a/content/post/gnome.md +++ b/content/post/gnome.md @@ -7,103 +7,103 @@ categories: ["os"] --- ## 常用设置 - ```bash - # 关闭左上角热响应 - gsettings set org.gnome.desktop.interface enable-hot-corners false - - # 缩放系统字体 - gsettings set org.gnome.desktop.interface text-scaling-factor 1.5 - - # monospace 字体 - gsettings set org.gnome.desktop.interface monospace-font-name 'YaHei Consolas Hybrid 15' - - # gtk 主题 - gsettings set org.gnome.desktop.interface gtk-theme 'Vertex-Dark' - - # gnome-shell 主题 - gsettings set org.gnome.shell.extensions.user-theme name 'Vertex' - - # 图标主题 - gsettings set org.gnome.desktop.interface icon-theme 'Faenza' - - # 调整 gnome3 桌面(包括 gdm )放大级别 - # 0 系统自动缩放 - # n > 0 放大 n 倍 - gsettings set org.gnome.desktop.interface scaling-factor 1 - - # 启用用户扩展 - 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.mutter dynamic-workspaces false - 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 button-layout 'appmenu:minimize,maximize,close' - ``` +```bash +# 关闭左上角热响应 +gsettings set org.gnome.desktop.interface enable-hot-corners false + +# 缩放系统字体 +gsettings set org.gnome.desktop.interface text-scaling-factor 1.5 + +# monospace 字体 +gsettings set org.gnome.desktop.interface monospace-font-name 'YaHei Consolas Hybrid 15' + +# gtk 主题 +gsettings set org.gnome.desktop.interface gtk-theme 'Vertex-Dark' + +# gnome-shell 主题 +gsettings set org.gnome.shell.extensions.user-theme name 'Vertex' + +# 图标主题 +gsettings set org.gnome.desktop.interface icon-theme 'Faenza' + +# 调整 gnome3 桌面(包括 gdm )放大级别 +# 0 系统自动缩放 +# n > 0 放大 n 倍 +gsettings set org.gnome.desktop.interface scaling-factor 1 + +# 启用用户扩展 +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.mutter dynamic-workspaces false +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 button-layout 'appmenu:minimize,maximize,close' +``` ## 在 "活动" 中创建 "文件夹" - ```bash - # 创建文件夹 - 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/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/VirtualBox/ categories "['Emulator']" - ``` +```bash +# 创建文件夹 +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/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/VirtualBox/ categories "['Emulator']" +``` ## 快捷键 - ```bash - 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-up "['Up']" - gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down "['Down']" - gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['Left']" - gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['Right']" - - 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-windows "['Tab']" - gsettings set org.gnome.desktop.wm.keybindings switch-windows-backward "['Tab']" - 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.desktop.wm.keybindings move-to-workspace-down "['Down']" - gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-up "['Up']" - 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-right "[]" - 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 show-desktop "['d']" - gsettings set org.gnome.desktop.wm.keybindings toggle-maximized "['Up']" - gsettings set org.gnome.desktop.wm.keybindings minimize "['Down']" - gsettings set org.gnome.desktop.wm.keybindings maximize "[]" - ``` +```bash +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-up "['Up']" +gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down "['Down']" +gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['Left']" +gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['Right']" + +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-windows "['Tab']" +gsettings set org.gnome.desktop.wm.keybindings switch-windows-backward "['Tab']" +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.desktop.wm.keybindings move-to-workspace-down "['Down']" +gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-up "['Up']" +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-right "[]" +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 show-desktop "['d']" +gsettings set org.gnome.desktop.wm.keybindings toggle-maximized "['Up']" +gsettings set org.gnome.desktop.wm.keybindings minimize "['Down']" +gsettings set org.gnome.desktop.wm.keybindings maximize "[]" +``` ## 在 CentOS6 下安装 gnome 桌面 - ```bash - yum groupinstall 'X Window System' - yum groupinstall Desktop - sed -i '/^id/id:5:initdefault:' /etc/inittab - ``` +```bash +yum groupinstall 'X Window System' +yum groupinstall Desktop +sed -i '/^id/id:5:initdefault:' /etc/inittab +``` ## 在 CentOS7 下安装 gnome3 桌面 - ```bash - yum groupinstall 'X Window System' - yum groupinstall 'Gnome Desktop' - systemctl set-default graphical.target - systemctl enable gdm - # 创建一个可登陆的普通用户 - ``` +```bash +yum groupinstall 'X Window System' +yum groupinstall 'Gnome Desktop' +systemctl set-default graphical.target +systemctl enable gdm +# 创建一个可登陆的普通用户 +``` ## 在 gdm 中隐藏用户名 - 修改文件/etc/gdm/gdm.schemas,找到这一段: diff --git a/content/post/makefile.md b/content/post/makefile.md index 5763304..919031c 100644 --- a/content/post/makefile.md +++ b/content/post/makefile.md @@ -232,21 +232,22 @@ categories: ["dev/ops"] - 好了,还是让我们来看一看如何书写规则。 ### 规则举例 - ```makefile - foo.o: foo.c defs.h # foo模块 - cc -c -g foo.c - ``` +```makefile +foo.o: foo.c defs.h # foo模块 + cc -c -g foo.c +``` - 看到这个例子,各位应该不是很陌生了,前面也已说过,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文件。也就是那个cc命令,其说明了,如何生成foo.o这个文件。(当然foo.c文件include了defs.h文件) ### 规则的语法 +- 常规 ```makefile targets : prerequisites command ... ``` - - 或是这样: +- 或是这样: ```makefile targets : prerequisites ; command command diff --git a/content/post/mariadb-galera.md b/content/post/mariadb-galera.md index 8fd2114..46d3525 100644 --- a/content/post/mariadb-galera.md +++ b/content/post/mariadb-galera.md @@ -69,9 +69,9 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB ``` ## 启动server - ```bash - systemctl start mariadb - ``` +```bash +systemctl start mariadb +``` ## 安全设置 - 设置root账户密码(推荐) @@ -115,9 +115,9 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB ``` ## 停止 server - ```bash - systemctl stop mariadb - ``` +```bash +systemctl stop mariadb +``` ## 启动集群 - 启动 galera cluster diff --git a/content/post/mariadb-replication.md b/content/post/mariadb-replication.md index 28ff761..2e19913 100644 --- a/content/post/mariadb-replication.md +++ b/content/post/mariadb-replication.md @@ -13,116 +13,116 @@ categories: ["database"] - 忽略系统数据库: information_schema, mysql, performance_schema ## 在两个主服务器上创建用于备份的用户 replicator - ```sql - grant replication slave on *.* to 'replicator'@'%' identified by 'password'; - flush privileges; - ``` +```sql +grant replication slave on *.* to 'replicator'@'%' identified by 'password'; +flush privileges; +``` ## 在两个主服务器上修改 my.cnf - ``` - # 唯一 ID - # 192.168.1.141 配置 - server-id = 141 - # 192.168.1.142 配置 - server-id = 142 - read-only = 0 - - # binlog - # MariaDB 默认已开启 GTID - log-bin = /var/lib/mysql-bin/master - binlog-format = row - sync_binlog = 1 - expire-logs-days = 3 - gtid-strict-mode = ON - - # relay log - replicate-wild-ignore-table = information_schema.% - replicate-wild-ignore-table = init_sql.% - replicate-wild-ignore-table = mysql.% - replicate-wild-ignore-table = performance_schema.% - relay-log = /var/lib/mysql-bin/slave - relay-log-recovery = TRUE - # 复制线程数不超过 cpu 核数 - slave-parallel-threads = 4 - - # 双主或多主互备时,可能会用到以下配置 - # 自增主键初始值,与其他互备服务器一致 - #auto-increment-offset = - # 自增主键等差值,与其他互备服务器均不一致 - #auto-increment-increment = - # 该环境中,双主配合 keepalived 实现高可用,无需配置自增 - ``` +``` +# 唯一 ID +# 192.168.1.141 配置 +server-id = 141 +# 192.168.1.142 配置 +server-id = 142 +read-only = 0 + +# binlog +# MariaDB 默认已开启 GTID +log-bin = /var/lib/mysql-bin/master +binlog-format = row +sync_binlog = 1 +expire-logs-days = 3 +gtid-strict-mode = ON + +# relay log +replicate-wild-ignore-table = information_schema.% +replicate-wild-ignore-table = init_sql.% +replicate-wild-ignore-table = mysql.% +replicate-wild-ignore-table = performance_schema.% +relay-log = /var/lib/mysql-bin/slave +relay-log-recovery = TRUE +# 复制线程数不超过 cpu 核数 +slave-parallel-threads = 4 + +# 双主或多主互备时,可能会用到以下配置 +# 自增主键初始值,与其他互备服务器一致 +#auto-increment-offset = +# 自增主键等差值,与其他互备服务器均不一致 +#auto-increment-increment = +# 该环境中,双主配合 keepalived 实现高可用,无需配置自增 +``` ## 开启互主同步 - ```sql - -- 在 192.168.1.141 上启动 mariadb,配置同步 192.168.1.142: - change master to master_host = '192.168.1.142', - master_port = 3306, - master_user = 'replicator', - master_password = 'password', - master_use_gtid = slave_pos; - - -- 在 192.168.1.142 上启动 mariadb,配置同步 192.168.1.141: - change master to master_host = '192.168.1.141', - master_port = 3306, - master_user = 'replicator', - master_password = 'password', - master_use_gtid = slave_pos; - ``` +```sql +-- 在 192.168.1.141 上启动 mariadb,配置同步 192.168.1.142: +change master to master_host = '192.168.1.142', + master_port = 3306, + master_user = 'replicator', + master_password = 'password', + master_use_gtid = slave_pos; + +-- 在 192.168.1.142 上启动 mariadb,配置同步 192.168.1.141: +change master to master_host = '192.168.1.141', + master_port = 3306, + master_user = 'replicator', + master_password = 'password', + master_use_gtid = slave_pos; +``` ## 在两个主服务器上启动 slave ,查看 slave 状态 - ```sql - start slave; - -- 查看 slave 状态 - show slave status\G - -- 如果看到 - -- Slave_IO_Running: Yes - -- Slave_SQL_Running: Yes - -- 则表示 slave 开启成功! - ``` +```sql +start slave; +-- 查看 slave 状态 +show slave status\G +-- 如果看到 +-- Slave_IO_Running: Yes +-- Slave_SQL_Running: Yes +-- 则表示 slave 开启成功! +``` ## 在从服务器上编辑 my.cnf - ``` - # 唯一 ID - server-id = 143 - # 从服务器只做查询,无增删改 - read-only = 1 - - # 忽略的数据表 - #replicate-ignore-table = db1.t1 - replicate-wild-ignore-table = information_schema.% - replicate-wild-ignore-table = init_sql.% - replicate-wild-ignore-table = mysql.% - replicate-wild-ignore-table = performance_schema.% - relay-log = /var/log/mysql-bin/slave - slave-parallel-threads = 4 - ``` +``` +# 唯一 ID +server-id = 143 +# 从服务器只做查询,无增删改 +read-only = 1 + +# 忽略的数据表 +#replicate-ignore-table = db1.t1 +replicate-wild-ignore-table = information_schema.% +replicate-wild-ignore-table = init_sql.% +replicate-wild-ignore-table = mysql.% +replicate-wild-ignore-table = performance_schema.% +relay-log = /var/log/mysql-bin/slave +slave-parallel-threads = 4 +``` ## 开启同步 - ```sql - change master 'db141' to master_host = '192.168.1.141', - master_port = 3306, - master_user = 'replicator', - master_password = 'password', - master_use_gtid = slave_pos; - - change master 'db142' to master_host = '192.168.1.142', - master_port = 3306, - master_user = 'replicator', - master_password = 'password', - master_use_gtid = slave_pos; - ``` +```sql +change master 'db141' to master_host = '192.168.1.141', + master_port = 3306, + master_user = 'replicator', + master_password = 'password', + master_use_gtid = slave_pos; + +change master 'db142' to master_host = '192.168.1.142', + master_port = 3306, + master_user = 'replicator', + master_password = 'password', + master_use_gtid = slave_pos; +``` ## 在从服务器上启动 slave ,查看 slave 状态 - ```sql - start all slaves; - -- 在从服务器上查看 slave 状态 - show all slaves status\G - -- 如果看到 - -- Slave_IO_Running: Yes - -- Slave_SQL_Running: Yes - -- 则表示 slave 开启成功! - ``` +```sql +start all slaves; +-- 在从服务器上查看 slave 状态 +show all slaves status\G +-- 如果看到 +-- Slave_IO_Running: Yes +-- Slave_SQL_Running: Yes +-- 则表示 slave 开启成功! +``` ## 参考 - [MariaDB 复制](https://mariadb.com/kb/en/standard-replication/) diff --git a/content/post/mysql-galera.md b/content/post/mysql-galera.md index 2eac550..8216c53 100644 --- a/content/post/mysql-galera.md +++ b/content/post/mysql-galera.md @@ -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 ## 创建 galera yum 源文件 - ```bash - cat > /etc/yum.repos.d/galera.repo <<-END - [galera] - name = Galera - baseurl = http://releases.galeracluster.com/galera-3/centos/7/x86_64/ - gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com - gpgcheck = 1 +```bash +cat > /etc/yum.repos.d/galera.repo <<-END +[galera] +name = Galera +baseurl = http://releases.galeracluster.com/galera-3/centos/7/x86_64/ +gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com +gpgcheck = 1 - [mysql-wsrep] - name = MySQL-wsrep - baseurl = http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/ - gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com - gpgcheck = 1 - END - ``` +[mysql-wsrep] +name = MySQL-wsrep +baseurl = http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/ +gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com +gpgcheck = 1 +END +``` ## 安装 - ```bash - yum install galera-3 mysql-wsrep-5.7 rsync - ``` +```bash +yum install galera-3 mysql-wsrep-5.7 rsync +``` ## 修改 /etc/my.cnf - ``` - [mysqld] - datadir=/var/lib/mysql - socket=/var/lib/mysql/mysql.sock - user=mysql - binlog-format=ROW - bind-address=0.0.0.0 - default-storage-engine=innodb - innodb-autoinc-lock-mode=2 - innodb-flush-log-at-trx-commit=0 - innodb-buffer-pool-size=1024M #物理内存一半 - 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-cluster-name="mysql_galera_cluster" #集群名字 - wsrep-cluster-address="gcomm://10.10.10.1,10.10.10.2,10.10.10.3" - wsrep-sst-method=rsync - wsrep-node-name=mysql_1 #当前节点名字 - wsrep-node-address="10.10.10.1" #当前节点 cluster ip - #wsrep-auto-increment-control=OFF #只通过一个节点做增删改时使用 +``` +[mysqld] +datadir=/var/lib/mysql +socket=/var/lib/mysql/mysql.sock +user=mysql +binlog-format=ROW +bind-address=0.0.0.0 +default-storage-engine=innodb +innodb-autoinc-lock-mode=2 +innodb-flush-log-at-trx-commit=0 +innodb-buffer-pool-size=1024M #物理内存一半 +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-cluster-name="mysql_galera_cluster" #集群名字 +wsrep-cluster-address="gcomm://10.10.10.1,10.10.10.2,10.10.10.3" +wsrep-sst-method=rsync +wsrep-node-name=mysql_1 #当前节点名字 +wsrep-node-address="10.10.10.1" #当前节点 cluster ip +#wsrep-auto-increment-control=OFF #只通过一个节点做增删改时使用 - [mysql_safe] - log-error=/var/log/mysqld.log - pid-file=/var/run/mysqld/mysqld.pid +[mysql_safe] +log-error=/var/log/mysqld.log +pid-file=/var/run/mysqld/mysqld.pid - !includedir /etc/my.cnf.d/ - ``` +!includedir /etc/my.cnf.d/ +``` ## 随机选择一个节点,使用专用脚本 mysqld_bootstrap 初始化集群 - ```bash - /usr/bin/mysqld_bootstrap - # 该命令会启动本机的 mysqld 服务 - systemctl status mysqld - ``` +```bash +/usr/bin/mysqld_bootstrap +# 该命令会启动本机的 mysqld 服务 +systemctl status mysqld +``` ## 查找密码,修改初始密码 - ```bash - grep -i password /var/log/messages - # 记录输出的密码 - mysqladmin -uroot -p password 'P@sswo2d' - # 根据提示输入上一步输出的密码 - ``` +```bash +grep -i password /var/log/messages +# 记录输出的密码 +mysqladmin -uroot -p password 'P@sswo2d' +# 根据提示输入上一步输出的密码 +``` ## 在其他节点上启动 mysqld 服务 - ```bash - systemctl start mysqld - ``` +```bash +systemctl start mysqld +``` ## 查看集群节点数量 - ```sql - show status like 'wsrep_cluster_size'; - ``` +```sql +show status like 'wsrep_cluster_size'; +``` ## ssl 加密同步数据(不推荐,存在性能损失) - 生成证书 diff --git a/content/post/mysql-group-replication.md b/content/post/mysql-group-replication.md index 1ae56f1..d15b247 100644 --- a/content/post/mysql-group-replication.md +++ b/content/post/mysql-group-replication.md @@ -17,66 +17,66 @@ mysql_33 | 192.168.1.33 | centos7.7 | 8.0.19 - 懒得写了 ... ## 修改 my.cnf - ``` - # mysql_11(选择一个) - server-id = 11 - # mysql_22(选择一个) - server-id = 22 - # mysql_33(选择一个) - server-id = 33 - - # 开启 binlog - log-bin = /var/log/mysql-bin/master - binlog-format = ROW - # 关闭 binlog 校验 - binlog-checksum = NONE - # 保留 2 天的 binlog - binlog-expire-logs-seconds = 172800 - # 开启 gtid - gtid-mode = ON - enforce-gtid-consistency = TRUE - # 指定 relay-log 存储位置 - relay-log = /var/lib/mysql-bin/slave - # relay-log 更新计入 binlog - log-slave-updates = TRUE - - # 多线程执行从库日志(可选) - slave-parallel-workers = 2 - slave-parallel-type = LOGICAL_CLOCK - slave-preserve-commit-order = ON - - # 存储引擎只能用 InnoDB - disabled-storage-engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" - # 加载插件,克隆插件用于快速 state transfer - plugin-load-add = "group_replication.so;mysql_clone.so" - # 集群 uuid - group-replication-group-name = "aaaa1111-bbbb-2222-cccc-3333dddd4444" - - # mysql_11(选择一个) - group-replication-local-address = "192.168.1.11:33061" - # mysql_22(选择一个) - group-replication-local-address = "192.168.1.22:33061" - # mysql_33(选择一个) - 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-consistency = BEFORE_ON_PRIMARY_FAILOVER - # 启动时,不自动创建/初始化新集群 - group-replication-bootstrap-group = OFF - # 新节点启动时,先不启动组复制,待手动配置完成并确认正常后,再把 OFF 改成 ON - group-replication-start-on-boot = OFF - - # 怀疑某节点不可用,2秒内,如果该嫌疑节点依旧无响应,则开除它(可选) - group-replication-member-expel-timeout = 2 - # 2秒内,依旧连接不上主网(majority),则退出组复制,进入 ERROR 状态(可选) - group-replication-unreachable-majority-timeout = 2 - # 退出组复制后,不再尝试重新加入组复制,直接执行指定的退出动作(默认) - group-replication-autorejoin-tries = 0 - # 指定退出动作: 数据库设置超级只读并关闭客户端连接(推荐) - group-replication-exit-state-action = OFFLINE_MODE - ``` +``` +# mysql_11(选择一个) +server-id = 11 +# mysql_22(选择一个) +server-id = 22 +# mysql_33(选择一个) +server-id = 33 + +# 开启 binlog +log-bin = /var/log/mysql-bin/master +binlog-format = ROW +# 关闭 binlog 校验 +binlog-checksum = NONE +# 保留 2 天的 binlog +binlog-expire-logs-seconds = 172800 +# 开启 gtid +gtid-mode = ON +enforce-gtid-consistency = TRUE +# 指定 relay-log 存储位置 +relay-log = /var/lib/mysql-bin/slave +# relay-log 更新计入 binlog +log-slave-updates = TRUE + +# 多线程执行从库日志(可选) +slave-parallel-workers = 2 +slave-parallel-type = LOGICAL_CLOCK +slave-preserve-commit-order = ON + +# 存储引擎只能用 InnoDB +disabled-storage-engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" +# 加载插件,克隆插件用于快速 state transfer +plugin-load-add = "group_replication.so;mysql_clone.so" +# 集群 uuid +group-replication-group-name = "aaaa1111-bbbb-2222-cccc-3333dddd4444" + +# mysql_11(选择一个) +group-replication-local-address = "192.168.1.11:33061" +# mysql_22(选择一个) +group-replication-local-address = "192.168.1.22:33061" +# mysql_33(选择一个) +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-consistency = BEFORE_ON_PRIMARY_FAILOVER +# 启动时,不自动创建/初始化新集群 +group-replication-bootstrap-group = OFF +# 新节点启动时,先不启动组复制,待手动配置完成并确认正常后,再把 OFF 改成 ON +group-replication-start-on-boot = OFF + +# 怀疑某节点不可用,2秒内,如果该嫌疑节点依旧无响应,则开除它(可选) +group-replication-member-expel-timeout = 2 +# 2秒内,依旧连接不上主网(majority),则退出组复制,进入 ERROR 状态(可选) +group-replication-unreachable-majority-timeout = 2 +# 退出组复制后,不再尝试重新加入组复制,直接执行指定的退出动作(默认) +group-replication-autorejoin-tries = 0 +# 指定退出动作: 数据库设置超级只读并关闭客户端连接(推荐) +group-replication-exit-state-action = OFFLINE_MODE +``` ## 初始化集群 - 重新启动节点 mysql_11 diff --git a/content/post/mysql-replication.md b/content/post/mysql-replication.md index c546e8c..fbe626d 100644 --- a/content/post/mysql-replication.md +++ b/content/post/mysql-replication.md @@ -12,186 +12,186 @@ categories: ["database"] - 要复制的数据库有 data_db、conf_db ## 在主服务器上创建用于备份的用户 replicator - ```sql - grant replication slave on *.* to 'replicator'@'192.168.1.6' identified by 'password'; - flush privileges; - ``` +```sql +grant replication slave on *.* to 'replicator'@'192.168.1.6' identified by 'password'; +flush privileges; +``` ## 在主服务器上修改 my.cnf - ``` - # 建议与本机ip地址最后一位一致,与其他互备服务器均不一致 - server-id = 10 - read-only = 0 - - # 开启 binlog - log-bin = /var/log/mysql-bin/master - binlog-format = row - # 关注要复制的数据库,存在跨库问题 - binlog-do-db = data-db - binlog-do-db = conf-db - # 忽略的数据库,存在跨库问题 - #binlog-ignore-db = - #binlog 有效时间 - expire-logs-days = - # GTID 复制模式 - #gtid-mode = ON - #enforce-gtid-consistency=true - # 双主或多主互备时,会用到以下配置 - # 自增主键初始值,与其他互备服务器一致 - #auto-increment-offset = - # 自增主键等差值,与其他互备服务器均不一致 - #auto-increment-increment = - ``` +``` +# 建议与本机ip地址最后一位一致,与其他互备服务器均不一致 +server-id = 10 +read-only = 0 + +# 开启 binlog +log-bin = /var/log/mysql-bin/master +binlog-format = row +# 关注要复制的数据库,存在跨库问题 +binlog-do-db = data-db +binlog-do-db = conf-db +# 忽略的数据库,存在跨库问题 +#binlog-ignore-db = +#binlog 有效时间 +expire-logs-days = +# GTID 复制模式 +#gtid-mode = ON +#enforce-gtid-consistency=true +# 双主或多主互备时,会用到以下配置 +# 自增主键初始值,与其他互备服务器一致 +#auto-increment-offset = +# 自增主键等差值,与其他互备服务器均不一致 +#auto-increment-increment = +``` ## 在主服务器上重启 mysql,获取 master 状态 - ```sql - -- 如果 mysql 是全新安装,则无须导出数据库初态,直接查看 binlog pos 即可 - -- 锁定要导出的数据库表 - flush tables with read lock; - ``` +```sql +-- 如果 mysql 是全新安装,则无须导出数据库初态,直接查看 binlog pos 即可 +-- 锁定要导出的数据库表 +flush tables with read lock; +``` ## 导出数据库初态 - ```bash - # 在主服务器的另一个终端中运行 - mysqldump -uroot -p data_db > /tmp/data_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/ - ``` +```bash +# 在主服务器的另一个终端中运行 +mysqldump -uroot -p data_db > /tmp/data_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/ +``` ## 查看 binary 日志位置 - ```sql - show master status\G - -- 记住输出里的如下类似两行(不记录也可以,这两个信息已经写入了导出的sql文件中) - -- File: mysql-bin.000001 - -- Position: 137103822 - -- 解锁数据库表 - unlock tables; - ``` +```sql +show master status\G +-- 记住输出里的如下类似两行(不记录也可以,这两个信息已经写入了导出的sql文件中) +-- File: mysql-bin.000001 +-- Position: 137103822 +-- 解锁数据库表 +unlock tables; +``` ## 在从服务器上编辑 my.cnf - ``` - # 建议与本机ip地址最后一位一致,与其他互备服务器均不一致 - server-id = 6 - read-only = 1 - - # 如果该 slave 中也运行了 master,或者使用了 gtid 模式复制,则开启 binlog - #log-bin = mysql-bin - #binlog-format = row - # 把 slave 操作也计入 binlog,用于链式同步 - #log-slave-updates = ON - # 指定要复制的数据库,存在跨库问题 - #replicate-do-db = data_db - #replicate-do-db = conf_db - # 指定要复制的数据表,无跨库问题 - replicate-do-table = db1.t1 - replicate-wild-do-table = db1.% - # 忽略的数据库,存在跨库问题 - #replicate-ignore-db = - # 忽略的数据表,无跨库问题 - #replicate-ignore-table = db1.t1 - #replicate-wild-ignore-table = db1.% - # 中继日志 - relay-log = /var/lib/mysql-bin/slave - # 多线程复制 - slave-parallel-type = logical-clock - slave-parallel-workers = 4 - # GTID 模式 - #gtid-mode = ON - #enforce-gtid-consistency=true - # 双主或多主互备时,会用到以下配置 - # 自增主键初始值,与其他互备服务器一致 - #auto-increment-offset = - # 自增主键等差值,与其他互备服务器均不一致 - #auto-increment-increment = - ``` +``` +# 建议与本机ip地址最后一位一致,与其他互备服务器均不一致 +server-id = 6 +read-only = 1 + +# 如果该 slave 中也运行了 master,或者使用了 gtid 模式复制,则开启 binlog +#log-bin = mysql-bin +#binlog-format = row +# 把 slave 操作也计入 binlog,用于链式同步 +#log-slave-updates = ON +# 指定要复制的数据库,存在跨库问题 +#replicate-do-db = data_db +#replicate-do-db = conf_db +# 指定要复制的数据表,无跨库问题 +replicate-do-table = db1.t1 +replicate-wild-do-table = db1.% +# 忽略的数据库,存在跨库问题 +#replicate-ignore-db = +# 忽略的数据表,无跨库问题 +#replicate-ignore-table = db1.t1 +#replicate-wild-ignore-table = db1.% +# 中继日志 +relay-log = /var/lib/mysql-bin/slave +# 多线程复制 +slave-parallel-type = logical-clock +slave-parallel-workers = 4 +# GTID 模式 +#gtid-mode = ON +#enforce-gtid-consistency=true +# 双主或多主互备时,会用到以下配置 +# 自增主键初始值,与其他互备服务器一致 +#auto-increment-offset = +# 自增主键等差值,与其他互备服务器均不一致 +#auto-increment-increment = +``` ## 在从服务器上重启 mysql,导入初态 - ```sql - -- 创建要导入的数据库 - create database data_db default charset utf8mb4; - create database conf_db default charset utf8mb4; - ``` +```sql +-- 创建要导入的数据库 +create database data_db default charset utf8mb4; +create database conf_db default charset utf8mb4; +``` ## 导入数据库 - ```bash - msyql -uroot -p data_db < /tmp/data_db.sql - mysql -uroot -p conf_db < /tmp/conf_db.sql - ``` +```bash +msyql -uroot -p data_db < /tmp/data_db.sql +mysql -uroot -p conf_db < /tmp/conf_db.sql +``` ## 开启同步 - ```sql - -- 基于 binlog 文件位置复制 - change master to master_host = '192.168.1.10', - master_port = 3306, - master_user = 'replicator', - master_password = 'password', - master_log_file = 'mysql-bin.000001', - master_log_pos = 137103822; - flush privileges; - -- 基于 gtid 复制 - change master to master_host = '192.168.1.10', - master_port = 3306, - master_user = 'replicator', - master_password = 'password', - master_auto_position = 1; - ``` +```sql +-- 基于 binlog 文件位置复制 +change master to master_host = '192.168.1.10', + master_port = 3306, + master_user = 'replicator', + master_password = 'password', + master_log_file = 'mysql-bin.000001', + master_log_pos = 137103822; +flush privileges; +-- 基于 gtid 复制 +change master to master_host = '192.168.1.10', + master_port = 3306, + master_user = 'replicator', + master_password = 'password', + master_auto_position = 1; +``` ## 启动 slave,查看 slave 状态 - ```sql - start slave; - -- 在从服务器上查看 slave 状态 - show slave status\G - -- 如果看到 - -- Slave_IO_Running: Yes - -- Slave_SQL_Running: Yes - -- 则表示 slave 开启成功! - ``` +```sql +start slave; +-- 在从服务器上查看 slave 状态 +show slave status\G +-- 如果看到 +-- Slave_IO_Running: Yes +-- Slave_SQL_Running: Yes +-- 则表示 slave 开启成功! +``` ## MySQL8 gtid 互为主从配置 - ``` - [mysqld] - # ---- 固定配置 ---- - datadir = /var/lib/mysql - socket = /var/lib/mysql/mysql.sock - pid-file = /var/lib/mysql/mysql.pid - log-timestamps = SYSTEM - log-error = /var/log/mysql/error.log - slow-query-log = TRUE - slow-query-log-file = /var/log/mysql/slow.log - default-authentication-plugin = mysql_native_password - - # ---- 动态配置 ---- - mysqlx = OFF - character-set-server = utf8mb4 - default-storage-engine = innodb - lower-case-table-names = 1 - #skip-name-resolve = 1 - #max-user-connections = 600 - #innodb-buffer-pool-size = 8G - #innodb-buffer-pool-instances = 8 - - # master - # 确认不同节点该 id 唯一 - server-id = 1 - log-bin = /var/lib/mysql-bin/master - binlog-format = ROW - #binlog-do-db = db1 - binlog-expire-logs-seconds = 172800 - gtid-mode = ON - enforce-gtid-consistency = TRUE - - # slave - replicate-wild-ignore-table = information_schema.% - replicate-wild-ignore-table = mysql.% - replicate-wild-ignore-table = performance_schema.% - replicate-wild-ignore-table = sys.% - replica-parallel-workers = 2 - log-replica-updates = FALSE - relay-log = /var/lib/mysql-bin/slave - relay-log-recovery = TRUE - #read-only = ON - ``` +``` +[mysqld] +# ---- 固定配置 ---- +datadir = /var/lib/mysql +socket = /var/lib/mysql/mysql.sock +pid-file = /var/lib/mysql/mysql.pid +log-timestamps = SYSTEM +log-error = /var/log/mysql/error.log +slow-query-log = TRUE +slow-query-log-file = /var/log/mysql/slow.log +default-authentication-plugin = mysql_native_password + +# ---- 动态配置 ---- +mysqlx = OFF +character-set-server = utf8mb4 +default-storage-engine = innodb +lower-case-table-names = 1 +#skip-name-resolve = 1 +#max-user-connections = 600 +#innodb-buffer-pool-size = 8G +#innodb-buffer-pool-instances = 8 + +# master +# 确认不同节点该 id 唯一 +server-id = 1 +log-bin = /var/lib/mysql-bin/master +binlog-format = ROW +#binlog-do-db = db1 +binlog-expire-logs-seconds = 172800 +gtid-mode = ON +enforce-gtid-consistency = TRUE + +# slave +replicate-wild-ignore-table = information_schema.% +replicate-wild-ignore-table = mysql.% +replicate-wild-ignore-table = performance_schema.% +replicate-wild-ignore-table = sys.% +replica-parallel-workers = 2 +log-replica-updates = FALSE +relay-log = /var/lib/mysql-bin/slave +relay-log-recovery = TRUE +#read-only = ON +``` ## MySQL8 gtid 多源复制从库配置 - 修改 my.cnf diff --git a/content/post/mysql.md b/content/post/mysql.md index d8c6642..72cac9d 100644 --- a/content/post/mysql.md +++ b/content/post/mysql.md @@ -7,68 +7,68 @@ categories: ["database"] --- ## MySQL 5.7 配置文件 my.cnf - ``` - [mysqld] - datadir = /db/mysql - socket = /var/lib/mysql/mysql.sock - symbolic-links = 0 - log-timestamps = SYSTEM - slow-query-log = 1 - slow-query-log-file = /var/log/mysqld/slow.log - long-query-time = 8 - #log-queries-not-using-indexes = 1 - log-error = /var/log/mysqld/error.log - pid-file = /var/run/mysqld/mysqld.pid - max-connections = 1000 - max-connect-errors = 1000 - max-user-connections = 600 - interactive-timeout = 3600 - wait-timeout = 3600 - skip-name-resolve = 1 - lower-case-table-names = 1 - default-time-zone = '+08:00' - character-set-server = utf8mb4 - sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES - bind-address = 0.0.0.0 - table-open-cache = 2048 - default-storage-engine = innodb - innodb-autoinc-lock-mode = 2 - innodb-flush-log-at-trx-commit = 0 - # 建议物理内存一半 - innodb-buffer-pool-size = 8G - innodb-buffer-pool-instances = 8 - max-allowed-packet = 512M - query-cache-size = 0 - query-cache-type = 0 - # 建议点分 ip 的最后一个数字 - server-id = 123 - # bin log - #binlog-format = ROW - #log-bin = /var/lib/mysql/mysql-bin - #expire-logs-days = 3 - # relay log - #read-only = 1 - #replicate-wild-do-table = db1.% - #relay-log = /var/lib/mysql/mysql-relay-bin - #slave-parallel-type = logical-clock - ``` +``` +[mysqld] +datadir = /db/mysql +socket = /var/lib/mysql/mysql.sock +symbolic-links = 0 +log-timestamps = SYSTEM +slow-query-log = 1 +slow-query-log-file = /var/log/mysqld/slow.log +long-query-time = 8 +#log-queries-not-using-indexes = 1 +log-error = /var/log/mysqld/error.log +pid-file = /var/run/mysqld/mysqld.pid +max-connections = 1000 +max-connect-errors = 1000 +max-user-connections = 600 +interactive-timeout = 3600 +wait-timeout = 3600 +skip-name-resolve = 1 +lower-case-table-names = 1 +default-time-zone = '+08:00' +character-set-server = utf8mb4 +sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES +bind-address = 0.0.0.0 +table-open-cache = 2048 +default-storage-engine = innodb +innodb-autoinc-lock-mode = 2 +innodb-flush-log-at-trx-commit = 0 +# 建议物理内存一半 +innodb-buffer-pool-size = 8G +innodb-buffer-pool-instances = 8 +max-allowed-packet = 512M +query-cache-size = 0 +query-cache-type = 0 +# 建议点分 ip 的最后一个数字 +server-id = 123 +# bin log +#binlog-format = ROW +#log-bin = /var/lib/mysql/mysql-bin +#expire-logs-days = 3 +# relay log +#read-only = 1 +#replicate-wild-do-table = db1.% +#relay-log = /var/lib/mysql/mysql-relay-bin +#slave-parallel-type = logical-clock +``` ## 复制表结构 - ```sql - create table db1.t1 like db2.t2; - create table db1.t1 select db2.t2 where 1=2; - ``` +```sql +create table db1.t1 like db2.t2; +create table db1.t1 select db2.t2 where 1=2; +``` ## 复制表结构及其数据 - ```sql - create table db1.t1 select db2.t2 [where ...] - ``` +```sql +create table db1.t1 select db2.t2 [where ...] +``` ## 复制表数据 - ``` - insert into db2.t2(column1, column2 ...) - select column1, column2 ... from db1.t1 [where ...] - ``` +``` +insert into db2.t2(column1, column2 ...) + select column1, column2 ... from db1.t1 [where ...] +``` ## 通过复制表文件来复制表数据 - 在db2中创建同结构表 @@ -98,45 +98,45 @@ categories: ["database"] ``` ## 设置一个表的空列自增 - ```sql - -- 删除可能存在的主键 - alter table 表名 drop primary key; - alter table 表名 modify 列名 auto_increment primary key; - ``` +```sql +-- 删除可能存在的主键 +alter table 表名 drop primary key; +alter table 表名 modify 列名 auto_increment primary key; +``` ## 查看数据库中每个表的全部列名 - ```sql - select table_name, column_name from - information_schema.columns - where table_schema = '数据库名'; - ``` +```sql +select table_name, column_name from + information_schema.columns + where table_schema = '数据库名'; +``` ## 查看数据库中每个表的行数 - ```sql - select table_name, table_rows - from information_schema.tables - where table_schema = '数据库名'; - ``` +```sql +select table_name, table_rows + from information_schema.tables + where table_schema = '数据库名'; +``` ## 查看数据库中每个表的索引 - ```sql - select table_name, column_name, index_name - from INFORMATION_SCHEMA.STATISTICS - where table_schema = '数据库名'; - ``` +```sql +select table_name, column_name, index_name + from INFORMATION_SCHEMA.STATISTICS + where table_schema = '数据库名'; +``` ## 表的部分列数据到另一个表 - ```sql - update db2.t2(column1, column2 ...) = ( - select column1, column2 from db1.t1 - where db1.t1.id = db2.t2.id); - ``` +```sql +update db2.t2(column1, column2 ...) = ( + select column1, column2 from db1.t1 + where db1.t1.id = db2.t2.id); +``` ## 把语句执行结果写到文件 - ```bash - mysql -uroot -p -hsever_ip -Ddb_name - -Ne "select ... from table_name;" > file_name - ``` +```bash +mysql -uroot -p -hsever_ip -Ddb_name + -Ne "select ... from table_name;" > file_name +``` ## 表分区 - 查看表的分区情况 @@ -210,47 +210,47 @@ categories: ["database"] ``` ## MySQL 5.7 从库多线程同步 - ```sql - stop slave; - set global slave_parallel_type='logical_clock'; - set global slave_parallel_workers=4; - start slave; - show processlist; - ``` +```sql +stop slave; +set global slave_parallel_type='logical_clock'; +set global slave_parallel_workers=4; +start slave; +show processlist; +``` ## MySQL 5.7 提示密码复杂度不够 - ```sql - set global validate_password_policy=0; - ``` +```sql +set global validate_password_policy=0; +``` ## MySQL 5.7 从库复制失败跳过指定数量的事务 - ```sql - stop slave; - -- 跳过一个事务 - SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; - start slave; - -- 修改 my.cnf - slave-skip-errors=1062,1053,1146,1032 #跳过指定error no类型的错误 - slave-skip-errors=all #跳过所有错误 - ``` +```sql +stop slave; +-- 跳过一个事务 +SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; +start slave; +-- 修改 my.cnf +slave-skip-errors=1062,1053,1146,1032 #跳过指定error no类型的错误 +slave-skip-errors=all #跳过所有错误 +``` ## MySQL 5.7 查看全部任务 - ```sql - -- 分号换成 \G 显示完整 sql - show processlist; - show full processlist; - SELECT command FROM information_schema.processlist; - ``` +```sql +-- 分号换成 \G 显示完整 sql +show processlist; +show full processlist; +SELECT command FROM information_schema.processlist; +``` ## MySQL 5.7 ssl 连接 - ``` - --ssl-mode=REQUIRED - ``` +``` +--ssl-mode=REQUIRED +``` ## MariaDB 10.1 修改密码 - ```sql - UPDATE user SET password=password('newpassword') WHERE user='root'; - ``` +```sql +UPDATE user SET password=password('newpassword') WHERE user='root'; +``` ## MySQL 5.7 编码 - 查看 @@ -272,9 +272,9 @@ categories: ["database"] ``` ## MySQL 5.7 升级数据库管理表结构 - ```bash - mysql_upgrade -u root -p - ``` +```bash +mysql_upgrade -u root -p +``` ## MySQL 5.7 误删 root 后恢复 root 账户 - 停止 mysql 服务 @@ -385,10 +385,10 @@ categories: ["database"] - Using Flesort 依靠索引顺序达不到排序效果,需额外排序 ## 统计 insert、delete、update 和 select 次数 - ```sql - show global status where Variable_name in - ('com_insert', 'com_delete', 'com_update', 'com_select'); - ``` +```sql +show global status where Variable_name in + ('com_insert', 'com_delete', 'com_update', 'com_select'); +``` ## csv 文件 - 导出 diff --git a/content/post/openvpn.md b/content/post/openvpn.md index c7a1d91..c0c4639 100644 --- a/content/post/openvpn.md +++ b/content/post/openvpn.md @@ -8,299 +8,299 @@ categories: ["network"] --- ## 服务端配置文件 server.conf - ``` - ################################################# - # 针对多客户端的OpenVPN 2.0 的服务器端配置文件示例 - # - # 本文件用于多客户端<->单服务器端的OpenVPN服务器端配置 - # - # OpenVPN也支持单机<->单机的配置(更多信息请查看网站上的示例页面) - # - # 该配置支持Windows或者Linux/BSD系统。此外,在Windows上,记得将路径加上双引号, - # 并且使用两个反斜杠,例如:"C:\\Program Files\\OpenVPN\\config\\foo.key" - # - # '#' or ';'开头的均为注释内容 - ################################################# - - #OpenVPN应该监听本机的哪些IP地址? - #该命令是可选的,如果不设置,则默认监听本机的所有IP地址。 - ;local a.b.c.d - - # OpenVPN应该监听哪个TCP/UDP端口? - # 如果你想在同一台计算机上运行多个OpenVPN实例,你可以使用不同的端口号来区分它们。 - # 此外,你需要在防火墙上开放这些端口。 - port 1194 - - #OpenVPN使用TCP还是UDP协议? - ;proto tcp - proto udp - - # 指定OpenVPN创建的通信隧道类型。 - # "dev tun"将会创建一个路由IP隧道, - # "dev tap"将会创建一个以太网隧道。 - # - # 如果你是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0" - # - # 如果你想控制VPN的访问策略,你必须为TUN/TAP接口创建防火墙规则。 - # - # 在非Windows系统中,你可以给出明确的单位编号(unit number),例如"tun0"。 - # 在Windows中,你也可以使用"dev-node"。 - # 在多数系统中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。 - ;dev tap - dev tun - - # 如果你想配置多个隧道,你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。 - # 在XP SP2或更高版本的系统中,你可能需要有选择地禁用掉针对TAP适配器的防火墙 - # 通常情况下,非Windows系统则不需要该指令。 - ;dev-node MyTap - - # 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key)。 - # 每个客户端和服务器端都需要它们各自的证书和私钥文件。 - # 服务器端和所有的客户端都将使用相同的CA证书文件。 - # - # 通过easy-rsa目录下的一系列脚本可以生成所需的证书和私钥。 - # 记住,服务器端和每个客户端的证书必须使用唯一的Common Name。 - # - # 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。 - # OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的"pkcs12"指令) - ca ca.crt - cert server.crt - key server.key # 该文件应该保密 - - # 指定迪菲·赫尔曼参数。 - # 你可以使用如下名称命令生成你的参数: - # openssl dhparam -out dh1024.pem 1024 - # 如果你使用的是2048位密钥,使用2048替换其中的1024。 - dh dh1024.pem - - # 设置服务器端模式,并提供一个VPN子网,以便于从中为客户端分配IP地址。 - # 在此处的示例中,服务器端自身将占用10.8.0.1,其他的将提供客户端使用。 - # 如果你使用的是以太网桥接模式,请注释掉该行。更多信息请查看官方手册页面。 - server 10.8.0.0 255.255.255.0 - - # 指定用于记录客户端和虚拟IP地址的关联关系的文件。 - # 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址 - ifconfig-pool-persist ipp.txt - - # 该指令仅针对以太网桥接模式。 - # 首先,你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。 - # 然后,你需要手动设置桥接接口的IP地址、子网掩码; - # 在这里,我们假设为10.8.0.4和255.255.255.0。 - # 最后,我们必须指定子网的一个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 - - # 该指令仅针对使用DHCP代理的以太网桥接模式, - # 此时客户端将请求服务器端的DHCP服务器,从而获得分配给它的IP地址和DNS服务器地址。 - # - # 在此之前,你也需要先将以太网网卡接口和TAP接口进行桥接。 - # 注意:该指令仅用于OpenVPN客户端,并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。 - ;server-bridge - - # 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。 - # (简而言之,就是允许客户端访问VPN服务器自身所在的其他局域网) - # 记住,这些私有子网也要将OpenVPN客户端的地址池(10.8.0.0/255.255.255.0)反馈回OpenVPN服务器。 - ;push "route 192.168.10.0 255.255.255.0" - ;push "route 192.168.20.0 255.255.255.0" - - # 为指定的客户端分配指定的IP地址,或者客户端背后也有一个私有子网想要访问VPN, - # 那么你可以针对该客户端的配置文件使用ccd子目录。 - # (简而言之,就是允许客户端所在的局域网成员也能够访问VPN) - - # 举个例子:假设有个Common Name为"Thelonious"的客户端背后也有一个小型子网想要连接到VPN,该子网为192.168.40.128/255.255.255.248。 - # 首先,你需要去掉下面两行指令的注释: - ;client-config-dir ccd - ;route 192.168.40.128 255.255.255.248 - # 然后创建一个文件ccd/Thelonious,该文件的内容为: - # iroute 192.168.40.128 255.255.255.248 - #这样客户端所在的局域网就可以访问VPN了。 - # 注意,这个指令只能在你是基于路由、而不是基于桥接的模式下才能生效。 - # 比如,你使用了"dev tun"和"server"指令。 - - # 再举个例子:假设你想给Thelonious分配一个固定的IP地址10.9.0.1。 - # 首先,你需要去掉下面两行指令的注释: - ;client-config-dir ccd - ;route 10.9.0.0 255.255.255.252 - # 然后在文件ccd/Thelonious中添加如下指令: - # ifconfig-push 10.9.0.1 10.9.0.2 - - # 如果你想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法: - # (1)运行多个OpenVPN守护进程,每个进程对应一个群组,并为每个进程(群组)启用适当的防火墙规则。 - # (2) (进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则。 - # 关于learn-address脚本的更多信息请参考官方手册页面。 - ;learn-address ./script - - # 如果启用该指令,所有客户端的默认网关都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。 - # (为确保能正常工作,OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接) - ;push "redirect-gateway def1 bypass-dhcp" - - # 某些具体的Windows网络设置可以被推送到客户端,例如DNS或WINS服务器地址。 - # 下列地址来自opendns.com提供的Public DNS 服务器。 - ;push "dhcp-option DNS 208.67.222.222" - ;push "dhcp-option DNS 208.67.220.220" - - # 去掉该指令的注释将允许不同的客户端之间相互"可见"(允许客户端之间互相访问)。 - # 默认情况下,客户端只能"看见"服务器。为了确保客户端只能看见服务器,你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。 - ;client-to-client - - # 如果多个客户端可能使用相同的证书/私钥文件或Common Name进行连接,那么你可以取消该指令的注释。 - # 建议该指令仅用于测试目的。对于生产使用环境而言,每个客户端都应该拥有自己的证书和私钥。 - # 如果你没有为每个客户端分别生成Common Name唯一的证书/私钥,你可以取消该行的注释(但不推荐这样做)。 - ;duplicate-cn - - # keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。 - # 每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。 - keepalive 10 120 - - # 出于SSL/TLS之外更多的安全考虑,创建一个"HMAC 防火墙"可以帮助抵御DoS攻击和UDP端口淹没攻击。 - # 你可以使用以下命令来生成: - # openvpn --genkey --secret ta.key - # - # 服务器和每个客户端都需要拥有该密钥的一个拷贝。 - # 第二个参数在服务器端应该为'0',在客户端应该为'1'。 - ;tls-auth ta.key 0 # 该文件应该保密 - - # 选择一个密码加密算法。 - # 该配置项也必须复制到每个客户端配置文件中。 - ;cipher BF-CBC # Blowfish (默认) - ;cipher AES-128-CBC # AES - ;cipher DES-EDE3-CBC # Triple-DES - - # 在VPN连接上启用压缩。 - # 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。 - comp-lzo - - # 允许并发连接的客户端的最大数量 - ;max-clients 100 - - # 在完成初始化工作之后,降低OpenVPN守护进程的权限是个不错的主意。 - # 该指令仅限于非Windows系统中使用。 - ;user nobody - ;group nobody - - # 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。 - persist-key - persist-tun - - # 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。 - status openvpn-status.log - - # 默认情况下,日志消息将写入syslog(在Windows系统中,如果以服务方式运行,日志消息将写入OpenVPN安装目录的log文件夹中)。 - # 你可以使用log或者log-append来改变这种默认情况。 - # "log"方式在每次启动时都会清空之前的日志文件。 - # "log-append"这是在之前的日志内容后进行追加。 - # 你可以使用两种方式之一(但不要同时使用)。 - ;log openvpn.log - ;log-append openvpn.log - - # 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。 - # - # 0 表示静默运行,只记录致命错误。 - # 4 表示合理的常规用法。 - # 5 和 6 可以帮助调试连接错误。 - # 9 表示极度冗余,输出非常详细的日志信息。 - verb 3 - - # 重复信息的沉默度。 - # 相同类别的信息只有前20条会输出到日志文件中。 - ;mute 20 - ``` +``` +################################################# +# 针对多客户端的OpenVPN 2.0 的服务器端配置文件示例 +# +# 本文件用于多客户端<->单服务器端的OpenVPN服务器端配置 +# +# OpenVPN也支持单机<->单机的配置(更多信息请查看网站上的示例页面) +# +# 该配置支持Windows或者Linux/BSD系统。此外,在Windows上,记得将路径加上双引号, +# 并且使用两个反斜杠,例如:"C:\\Program Files\\OpenVPN\\config\\foo.key" +# +# '#' or ';'开头的均为注释内容 +################################################# + +#OpenVPN应该监听本机的哪些IP地址? +#该命令是可选的,如果不设置,则默认监听本机的所有IP地址。 +;local a.b.c.d + +# OpenVPN应该监听哪个TCP/UDP端口? +# 如果你想在同一台计算机上运行多个OpenVPN实例,你可以使用不同的端口号来区分它们。 +# 此外,你需要在防火墙上开放这些端口。 +port 1194 + +#OpenVPN使用TCP还是UDP协议? +;proto tcp +proto udp + +# 指定OpenVPN创建的通信隧道类型。 +# "dev tun"将会创建一个路由IP隧道, +# "dev tap"将会创建一个以太网隧道。 +# +# 如果你是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0" +# +# 如果你想控制VPN的访问策略,你必须为TUN/TAP接口创建防火墙规则。 +# +# 在非Windows系统中,你可以给出明确的单位编号(unit number),例如"tun0"。 +# 在Windows中,你也可以使用"dev-node"。 +# 在多数系统中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。 +;dev tap +dev tun + +# 如果你想配置多个隧道,你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。 +# 在XP SP2或更高版本的系统中,你可能需要有选择地禁用掉针对TAP适配器的防火墙 +# 通常情况下,非Windows系统则不需要该指令。 +;dev-node MyTap + +# 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key)。 +# 每个客户端和服务器端都需要它们各自的证书和私钥文件。 +# 服务器端和所有的客户端都将使用相同的CA证书文件。 +# +# 通过easy-rsa目录下的一系列脚本可以生成所需的证书和私钥。 +# 记住,服务器端和每个客户端的证书必须使用唯一的Common Name。 +# +# 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。 +# OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的"pkcs12"指令) +ca ca.crt +cert server.crt +key server.key # 该文件应该保密 + +# 指定迪菲·赫尔曼参数。 +# 你可以使用如下名称命令生成你的参数: +# openssl dhparam -out dh1024.pem 1024 +# 如果你使用的是2048位密钥,使用2048替换其中的1024。 +dh dh1024.pem + +# 设置服务器端模式,并提供一个VPN子网,以便于从中为客户端分配IP地址。 +# 在此处的示例中,服务器端自身将占用10.8.0.1,其他的将提供客户端使用。 +# 如果你使用的是以太网桥接模式,请注释掉该行。更多信息请查看官方手册页面。 +server 10.8.0.0 255.255.255.0 + +# 指定用于记录客户端和虚拟IP地址的关联关系的文件。 +# 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址 +ifconfig-pool-persist ipp.txt + +# 该指令仅针对以太网桥接模式。 +# 首先,你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。 +# 然后,你需要手动设置桥接接口的IP地址、子网掩码; +# 在这里,我们假设为10.8.0.4和255.255.255.0。 +# 最后,我们必须指定子网的一个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 + +# 该指令仅针对使用DHCP代理的以太网桥接模式, +# 此时客户端将请求服务器端的DHCP服务器,从而获得分配给它的IP地址和DNS服务器地址。 +# +# 在此之前,你也需要先将以太网网卡接口和TAP接口进行桥接。 +# 注意:该指令仅用于OpenVPN客户端,并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。 +;server-bridge + +# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。 +# (简而言之,就是允许客户端访问VPN服务器自身所在的其他局域网) +# 记住,这些私有子网也要将OpenVPN客户端的地址池(10.8.0.0/255.255.255.0)反馈回OpenVPN服务器。 +;push "route 192.168.10.0 255.255.255.0" +;push "route 192.168.20.0 255.255.255.0" + +# 为指定的客户端分配指定的IP地址,或者客户端背后也有一个私有子网想要访问VPN, +# 那么你可以针对该客户端的配置文件使用ccd子目录。 +# (简而言之,就是允许客户端所在的局域网成员也能够访问VPN) + +# 举个例子:假设有个Common Name为"Thelonious"的客户端背后也有一个小型子网想要连接到VPN,该子网为192.168.40.128/255.255.255.248。 +# 首先,你需要去掉下面两行指令的注释: +;client-config-dir ccd +;route 192.168.40.128 255.255.255.248 +# 然后创建一个文件ccd/Thelonious,该文件的内容为: +# iroute 192.168.40.128 255.255.255.248 +#这样客户端所在的局域网就可以访问VPN了。 +# 注意,这个指令只能在你是基于路由、而不是基于桥接的模式下才能生效。 +# 比如,你使用了"dev tun"和"server"指令。 + +# 再举个例子:假设你想给Thelonious分配一个固定的IP地址10.9.0.1。 +# 首先,你需要去掉下面两行指令的注释: +;client-config-dir ccd +;route 10.9.0.0 255.255.255.252 +# 然后在文件ccd/Thelonious中添加如下指令: +# ifconfig-push 10.9.0.1 10.9.0.2 + +# 如果你想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法: +# (1)运行多个OpenVPN守护进程,每个进程对应一个群组,并为每个进程(群组)启用适当的防火墙规则。 +# (2) (进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则。 +# 关于learn-address脚本的更多信息请参考官方手册页面。 +;learn-address ./script + +# 如果启用该指令,所有客户端的默认网关都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。 +# (为确保能正常工作,OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接) +;push "redirect-gateway def1 bypass-dhcp" + +# 某些具体的Windows网络设置可以被推送到客户端,例如DNS或WINS服务器地址。 +# 下列地址来自opendns.com提供的Public DNS 服务器。 +;push "dhcp-option DNS 208.67.222.222" +;push "dhcp-option DNS 208.67.220.220" + +# 去掉该指令的注释将允许不同的客户端之间相互"可见"(允许客户端之间互相访问)。 +# 默认情况下,客户端只能"看见"服务器。为了确保客户端只能看见服务器,你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。 +;client-to-client + +# 如果多个客户端可能使用相同的证书/私钥文件或Common Name进行连接,那么你可以取消该指令的注释。 +# 建议该指令仅用于测试目的。对于生产使用环境而言,每个客户端都应该拥有自己的证书和私钥。 +# 如果你没有为每个客户端分别生成Common Name唯一的证书/私钥,你可以取消该行的注释(但不推荐这样做)。 +;duplicate-cn + +# keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。 +# 每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。 +keepalive 10 120 + +# 出于SSL/TLS之外更多的安全考虑,创建一个"HMAC 防火墙"可以帮助抵御DoS攻击和UDP端口淹没攻击。 +# 你可以使用以下命令来生成: +# openvpn --genkey --secret ta.key +# +# 服务器和每个客户端都需要拥有该密钥的一个拷贝。 +# 第二个参数在服务器端应该为'0',在客户端应该为'1'。 +;tls-auth ta.key 0 # 该文件应该保密 + +# 选择一个密码加密算法。 +# 该配置项也必须复制到每个客户端配置文件中。 +;cipher BF-CBC # Blowfish (默认) +;cipher AES-128-CBC # AES +;cipher DES-EDE3-CBC # Triple-DES + +# 在VPN连接上启用压缩。 +# 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。 +comp-lzo + +# 允许并发连接的客户端的最大数量 +;max-clients 100 + +# 在完成初始化工作之后,降低OpenVPN守护进程的权限是个不错的主意。 +# 该指令仅限于非Windows系统中使用。 +;user nobody +;group nobody + +# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。 +persist-key +persist-tun + +# 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。 +status openvpn-status.log + +# 默认情况下,日志消息将写入syslog(在Windows系统中,如果以服务方式运行,日志消息将写入OpenVPN安装目录的log文件夹中)。 +# 你可以使用log或者log-append来改变这种默认情况。 +# "log"方式在每次启动时都会清空之前的日志文件。 +# "log-append"这是在之前的日志内容后进行追加。 +# 你可以使用两种方式之一(但不要同时使用)。 +;log openvpn.log +;log-append openvpn.log + +# 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。 +# +# 0 表示静默运行,只记录致命错误。 +# 4 表示合理的常规用法。 +# 5 和 6 可以帮助调试连接错误。 +# 9 表示极度冗余,输出非常详细的日志信息。 +verb 3 + +# 重复信息的沉默度。 +# 相同类别的信息只有前20条会输出到日志文件中。 +;mute 20 +``` ## 客户端配置文件 - ``` - ############################################## - # 针对多个客户端的OpenVPN 2.0 的客户端配置文件示例 - # - # 该配置文件可以被多个客户端使用,当然每个客户端都应该有自己的证书和密钥文件 - # - # 在Windows上此配置文件的后缀应该是".ovpn",在Linux/BSD系统中则是".conf" - ############################################## - - # 指定这是一个客户端,我们将从服务器获取某些配置文件指令 - client - - # 在大多数系统中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。 - ;dev tap - dev tun - - # 在Windows系统中,如果你想配置多个隧道,则需要该指令。 - # 你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。 - # 在XP SP2或更高版本的系统中,你可能需要禁用掉针对TAP适配器的防火墙。 - ;dev-node MyTap - - # 指定连接的服务器是采用TCP还是UDP协议。 - # 这里需要使用与服务器端相同的设置。 - ;proto tcp - proto udp - - # 指定服务器的主机名(或IP)以及端口号。 - # 如果有多个VPN服务器,为了实现负载均衡,你可以设置多个remote指令。 - remote my-server-1 1194 - ;remote my-server-2 1194 - - # 如果指定了多个remote指令,启用该指令将随机连接其中的一台服务器, - # 否则,客户端将按照指定的先后顺序依次尝试连接服务器。 - ;remote-random - - # 启用该指令,与服务器连接中断后将自动重新连接,这在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。 - resolv-retry infinite - - # 大多数客户端不需要绑定本机特定的端口号 - nobind - - # 在初始化完毕后,降低OpenVPN的权限(该指令仅限于非Windows系统中使用) - ;user nobody - ;group nobody - - # 持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。 - persist-key - persist-tun - - # 如果你是通过HTTP代理方式来连接到实际的VPN服务器,请在此处指定代理服务器的主机名(或IP)和端口号。 - # 如果你的代理服务器需要身份认证,请参考官方手册页面。 - ;http-proxy-retry # 连接失败时自动重试 - ;http-proxy [proxy server] [proxy port #] - - # 无线网络通常会产生大量的重复数据包。设置此标识将忽略掉重复数据包的警告信息。 - ;mute-replay-warnings - - # SSL/TLS 参数配置。 - # 更多描述信息请参考服务器端配置文件。 - # 最好为每个客户端单独分配.crt/.key文件对。 - # 单个CA证书可以供所有客户端使用。 - ca ca.crt - cert client.crt - key client.key - - # 指定通过检查证书的nsCertType字段是否为"server"来验证服务器端证书。 - # 这是预防潜在攻击的一种重要措施。 - # - # 为了使用该功能,你需要在生成服务器端证书时,将其中的nsCertType字段设为"server" - # easy-rsa文件夹中的build-key-server脚本文件可以达到该目的。 - ns-cert-type server - - # 如果服务器端使用了tls-auth密钥,那么每个客户端也都应该有该密钥。 - ;tls-auth ta.key 1 - - # 指定密码的加密算法。 - # 如果服务器端启用了cipher指令选项,那么你必须也在这里指定它。 - ;cipher x - - # 在VPN连接中启用压缩。 - # 该指令的启用/禁用应该与服务器端保持一致。 - comp-lzo - - # 设置日志文件冗余级别(0~9)。 - # 0 表示静默运行,只记录致命错误。 - # 4 表示合理的常规用法。 - # 5 和 6 可以帮助调试连接错误。 - # 9 表示极度冗余,输出非常详细的日志信息。 - verb 3 - - # 忽略过多的重复信息。 - # 相同类别的信息只有前20条会输出到日志文件中。 - ;mute 20 - ``` +``` +############################################## +# 针对多个客户端的OpenVPN 2.0 的客户端配置文件示例 +# +# 该配置文件可以被多个客户端使用,当然每个客户端都应该有自己的证书和密钥文件 +# +# 在Windows上此配置文件的后缀应该是".ovpn",在Linux/BSD系统中则是".conf" +############################################## + +# 指定这是一个客户端,我们将从服务器获取某些配置文件指令 +client + +# 在大多数系统中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。 +;dev tap +dev tun + +# 在Windows系统中,如果你想配置多个隧道,则需要该指令。 +# 你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。 +# 在XP SP2或更高版本的系统中,你可能需要禁用掉针对TAP适配器的防火墙。 +;dev-node MyTap + +# 指定连接的服务器是采用TCP还是UDP协议。 +# 这里需要使用与服务器端相同的设置。 +;proto tcp +proto udp + +# 指定服务器的主机名(或IP)以及端口号。 +# 如果有多个VPN服务器,为了实现负载均衡,你可以设置多个remote指令。 +remote my-server-1 1194 +;remote my-server-2 1194 + +# 如果指定了多个remote指令,启用该指令将随机连接其中的一台服务器, +# 否则,客户端将按照指定的先后顺序依次尝试连接服务器。 +;remote-random + +# 启用该指令,与服务器连接中断后将自动重新连接,这在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。 +resolv-retry infinite + +# 大多数客户端不需要绑定本机特定的端口号 +nobind + +# 在初始化完毕后,降低OpenVPN的权限(该指令仅限于非Windows系统中使用) +;user nobody +;group nobody + +# 持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。 +persist-key +persist-tun + +# 如果你是通过HTTP代理方式来连接到实际的VPN服务器,请在此处指定代理服务器的主机名(或IP)和端口号。 +# 如果你的代理服务器需要身份认证,请参考官方手册页面。 +;http-proxy-retry # 连接失败时自动重试 +;http-proxy [proxy server] [proxy port #] + +# 无线网络通常会产生大量的重复数据包。设置此标识将忽略掉重复数据包的警告信息。 +;mute-replay-warnings + +# SSL/TLS 参数配置。 +# 更多描述信息请参考服务器端配置文件。 +# 最好为每个客户端单独分配.crt/.key文件对。 +# 单个CA证书可以供所有客户端使用。 +ca ca.crt +cert client.crt +key client.key + +# 指定通过检查证书的nsCertType字段是否为"server"来验证服务器端证书。 +# 这是预防潜在攻击的一种重要措施。 +# +# 为了使用该功能,你需要在生成服务器端证书时,将其中的nsCertType字段设为"server" +# easy-rsa文件夹中的build-key-server脚本文件可以达到该目的。 +ns-cert-type server + +# 如果服务器端使用了tls-auth密钥,那么每个客户端也都应该有该密钥。 +;tls-auth ta.key 1 + +# 指定密码的加密算法。 +# 如果服务器端启用了cipher指令选项,那么你必须也在这里指定它。 +;cipher x + +# 在VPN连接中启用压缩。 +# 该指令的启用/禁用应该与服务器端保持一致。 +comp-lzo + +# 设置日志文件冗余级别(0~9)。 +# 0 表示静默运行,只记录致命错误。 +# 4 表示合理的常规用法。 +# 5 和 6 可以帮助调试连接错误。 +# 9 表示极度冗余,输出非常详细的日志信息。 +verb 3 + +# 忽略过多的重复信息。 +# 相同类别的信息只有前20条会输出到日志文件中。 +;mute 20 +``` ## 撤销客户端证书 - 生成/更新 crl.pem diff --git a/content/post/oracle.md b/content/post/oracle.md index e162b29..b677afa 100644 --- a/content/post/oracle.md +++ b/content/post/oracle.md @@ -35,309 +35,309 @@ clob | 4GB | 字符串 bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中 ## 创建表 - ```sql - CREATE TABLE table_name - ( - column_name datatype [NULL|NOT NULL], - ..., - PRIMARY KEY(), - 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 UNIQUE(column_name) - ) - |AS SELECT column_name1,column_name2,...FROM source_table; - DROP TABLE table_name; - ``` +```sql +CREATE TABLE table_name +( +column_name datatype [NULL|NOT NULL], +..., +PRIMARY KEY(), +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 UNIQUE(column_name) +) +|AS SELECT column_name1,column_name2,...FROM source_table; +DROP TABLE table_name; +``` ## 删除表 - ```bash - DROP TABLE table_name; - # 执行最快,删除数据、结构、索引、约束、触发器和索引,存储过程和索引invalid状态,直接生效,不可回滚,不释放空间 - TRUNCATE TABLE table_name; - # 执行较快,只删除数据,直接生效,不可回滚,释放空间 - DELETE FROM table_name [WHERE condition]; - # 执行最慢,只删除数据,commit 后生效,可回滚,不释放空间 - ``` +```bash +DROP TABLE table_name; +# 执行最快,删除数据、结构、索引、约束、触发器和索引,存储过程和索引invalid状态,直接生效,不可回滚,不释放空间 +TRUNCATE TABLE table_name; +# 执行较快,只删除数据,直接生效,不可回滚,释放空间 +DELETE FROM table_name [WHERE condition]; +# 执行最慢,只删除数据,commit 后生效,可回滚,不释放空间 +``` ## 操作表列 - ```sql - ALTER TABLE table_name - ADD column_name datatype [NULL|NOT NULL] - |MODIFY column_name new_datatype|NULL|NOT NULL - |DROP COLUMN column_name; - -- 删除列时通常追加 CASCADE CONSTRAINTS ,以删除于该列有关的约束 - ``` +```sql +ALTER TABLE table_name +ADD column_name datatype [NULL|NOT NULL] +|MODIFY column_name new_datatype|NULL|NOT NULL +|DROP COLUMN column_name; +-- 删除列时通常追加 CASCADE CONSTRAINTS ,以删除于该列有关的约束 +``` ## 操作主键 - ```sql - ALTER TABLE table_name - ADD CONSTRAINTS constraint_name PRIMARY KEY(column_name) - |DROP CONSTRAINTS constraint_name; - ``` +```sql +ALTER TABLE table_name +ADD CONSTRAINTS constraint_name PRIMARY KEY(column_name) +|DROP CONSTRAINTS constraint_name; +``` ## 操作外键 - ```sql - ALTER TABLE table_name - ADD CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCE table_name(column_name) ON DELETE CASCADE - |DROP CONSTRAINT constraint_name; - ``` +```sql +ALTER TABLE table_name +ADD CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCE table_name(column_name) ON DELETE CASCADE +|DROP CONSTRAINT constraint_name; +``` ## 操作CHECK约束 - ```sql - ALTER TABLE table_name - ADD CONSTRAINT constraint_name CHECK(condition) - |DROP CONSTRAINT constraint_name; - ``` +```sql +ALTER TABLE table_name +ADD CONSTRAINT constraint_name CHECK(condition) +|DROP CONSTRAINT constraint_name; +``` ## 操作UNIQUE约束 - ```sql - ALTER TABLE table_name - ADD CONSTRAINT constraint_name UNIQUE(column_name) - |DROP CONSTRAINT constraint_name; - ``` +```sql +ALTER TABLE table_name +ADD CONSTRAINT constraint_name UNIQUE(column_name) +|DROP CONSTRAINT constraint_name; +``` ## 添加数据 - ```sql - INSERT INTO table_name(column_name1,column_name2,...) - VALUES(data1,data2,...) - |SELECT column_name1,column_name2...FROM table_name2; - ``` +```sql +INSERT INTO table_name(column_name1,column_name2,...) +VALUES(data1,data2,...) +|SELECT column_name1,column_name2...FROM table_name2; +``` ## 修改数据 - ```sql - UPDATE table_name SET column_name1=data1,column_name2=data2,...[WHERE condition]; - ``` +```sql +UPDATE table_name SET column_name1=data1,column_name2=data2,...[WHERE condition]; +``` ## 删除数据 - ```sql - DELETE FROM table_name [WHERE condition]; - TRUNCATE TABLE table_name; - ``` +```sql +DELETE FROM table_name [WHERE condition]; +TRUNCATE TABLE table_name; +``` ## 查询数据 - ```sql - SELECT column_name1,column_name2,...FROM table_name [WHERE condition]; - ``` +```sql +SELECT column_name1,column_name2,...FROM table_name [WHERE condition]; +``` ## MERGE语句 - ```sql - MERGE INTO table_name1 USING table_name2 ON(condition) WHEN MATCHED THEN ... WHEN NOT MATCHED THEN ...; - ``` +```sql +MERGE INTO table_name1 USING table_name2 ON(condition) WHEN MATCHED THEN ... WHEN NOT MATCHED THEN ...; +``` ## SELECT 语句 - ```sql - SELECT [DISTINCT|ALL] select_list FROM table_list [WHERE ...] [GROUP BY ...] [HAVING ...] [ORDER BY ...]; - ``` +```sql +SELECT [DISTINCT|ALL] select_list FROM table_list [WHERE ...] [GROUP BY ...] [HAVING ...] [ORDER BY ...]; +``` ## select_list - ```sql - *|[schema.] {table|view} .*|expr[ [AS ]c_alias] - ``` +```sql +*|[schema.] {table|view} .*|expr[ [AS ]c_alias] +``` ## expr - ```sql - "||" 连接的字符串 | 函数 - ``` +```sql +"||" 连接的字符串 | 函数 +``` ## ORDER BY ... - ```sql - {expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST}[ {expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST},...] - ``` +```sql +{expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST}[ {expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST},...] +``` ## 模糊查询关键字like - ```sql - '_'替代一个字符,'%'替代多个字符 - ``` +```sql +'_'替代一个字符,'%'替代多个字符 +``` ## 从给定值中选取查询 - ```sql - IN(data1,data2,...) - ``` +```sql +IN(data1,data2,...) +``` ## 连接 - ```sql - -- 连接,只能查询匹配记录 - 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 RIGHT JOIN table_name2 ON condition; - -- 全外连接 - SELECT select_list FROM table_name1 FULL JOIN table_name2 ON condition; - ``` +```sql +-- 连接,只能查询匹配记录 +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 RIGHT JOIN table_name2 ON condition; +-- 全外连接 +SELECT select_list FROM table_name1 FULL JOIN table_name2 ON condition; +``` ## 内置函数 - ```sql - ABS(n) -- n绝对值 - MOD(n2,n1) -- n2对n1取余 - SIGN(n) -- n的符号 - CEIL(n) -- 大于等于n的最小整数 - FLOOR(n) -- 小于等于n的最大整数 - SQRT(n) -- n的平方根 - POWER(n2,n1) -- n2的n1次幂 - EXP(n) -- e的n次幂 - LOG(n1,n2) -- n1为底n2的对数 - LN(n) -- n的自然对数 - ROUND(n2,n1) -- n2小数部分四舍五入至n1位 - TRUNC(n2,n1) -- n2截取至n1位 - CHR(n) -- 把n根据ASCII转换成字符 - ASCII(char) -- 参数首字母的ASCII值 - LENGTH(char) -- 字符串长度 - SUBSTR(char,position[,substring_length]) -- 截取字符串 - CONCAT(char1,char2) -- 连接字符串 - INSTR(string,substring[,position[,occurrence]]) -- 查找字符串 - UPPER(char) -- 转换成大写 - LOWER(char) -- 转换成小些 - INITCAP(char) -- 单词首字母大写 - NLSSORT(char[,nslparam]) -- 按指定方式排序'NLS_SORT=SCHINESE_PINYIN_M' - REPLACE(char,search_string[,replacement_string]) -- 字符串替换,默认删除 - RPAD(expr1,n[,expr2]) -- 用expr2右填充expr1至长度为n,默认空格 - LPAD(expr1,n[,expr2]) -- 用expr2左填充expr1至长度为n,默认空格 - TRIM([LEADING|TRAILING|BOTH] [trim_character FROM] trim_source) -- 删除字符串首尾指定字符 - SYSDATE -- 获取系统当前日期 - SYSTIMESTAMP -- 获取系统当前时间 - DBTIMEZONE -- 获取数据库当前时区 - ADD_MONTHS(date,integer) -- 指定日期增加指定月份数 - SESSIONTIMEZONE -- 获取当前会话的时区 - LAST_DAY(date) -- 获取指定日期对应月份的最后一天 - NEXT_DAY(date,char) -- 获取下周char的日期 - CURRENT_DATE -- 获取会话时区的当前日期 - EXTRACT(datetime) -- 从指定时间中获取指定部分 - MONTHS_BETWEEN(date1,date2) -- 获取两个时间之间的月份数 - NET_TIME(date,timezone1,timezone2) -- 获取时区1中的时间转换到时区2后的时间 - TO_CHAR(n[,fmt]) -- 转换为字符类型 - TO_DATE(n[,fmt]) -- 转换为时间类型 - TO_NUMBER(n[,fmt]) -- 转换为数字类型 - LNNVL(condition) -- 排除指定条件函数 - NVL(expr1,expr2) -- expr1为空时返回expr2 - NVL2(expr1,expr2,expr3) -- expr1为空时返回expr3,不为空返回expr2 - AVG([DISTINCT|ALL ]expr) -- 获取平均值 - COUNT(*|[DISTINCT|ALL ]expr) -- 获取数量 - SUM([DISTINCT|ALL ]expr) -- 获取和 - SELECT USER FROM DUAL; -- 返回当前会话的登录名 - USERENV(param) -- 返回当前会话的信息 - SYS_CONTEXT(namespace,param) -- 返回oracle已创建的context - DECODE(expr,search,result[,search1,result1...]) -- expr结果是search返回result - ``` +```sql +ABS(n) -- n绝对值 +MOD(n2,n1) -- n2对n1取余 +SIGN(n) -- n的符号 +CEIL(n) -- 大于等于n的最小整数 +FLOOR(n) -- 小于等于n的最大整数 +SQRT(n) -- n的平方根 +POWER(n2,n1) -- n2的n1次幂 +EXP(n) -- e的n次幂 +LOG(n1,n2) -- n1为底n2的对数 +LN(n) -- n的自然对数 +ROUND(n2,n1) -- n2小数部分四舍五入至n1位 +TRUNC(n2,n1) -- n2截取至n1位 +CHR(n) -- 把n根据ASCII转换成字符 +ASCII(char) -- 参数首字母的ASCII值 +LENGTH(char) -- 字符串长度 +SUBSTR(char,position[,substring_length]) -- 截取字符串 +CONCAT(char1,char2) -- 连接字符串 +INSTR(string,substring[,position[,occurrence]]) -- 查找字符串 +UPPER(char) -- 转换成大写 +LOWER(char) -- 转换成小些 +INITCAP(char) -- 单词首字母大写 +NLSSORT(char[,nslparam]) -- 按指定方式排序'NLS_SORT=SCHINESE_PINYIN_M' +REPLACE(char,search_string[,replacement_string]) -- 字符串替换,默认删除 +RPAD(expr1,n[,expr2]) -- 用expr2右填充expr1至长度为n,默认空格 +LPAD(expr1,n[,expr2]) -- 用expr2左填充expr1至长度为n,默认空格 +TRIM([LEADING|TRAILING|BOTH] [trim_character FROM] trim_source) -- 删除字符串首尾指定字符 +SYSDATE -- 获取系统当前日期 +SYSTIMESTAMP -- 获取系统当前时间 +DBTIMEZONE -- 获取数据库当前时区 +ADD_MONTHS(date,integer) -- 指定日期增加指定月份数 +SESSIONTIMEZONE -- 获取当前会话的时区 +LAST_DAY(date) -- 获取指定日期对应月份的最后一天 +NEXT_DAY(date,char) -- 获取下周char的日期 +CURRENT_DATE -- 获取会话时区的当前日期 +EXTRACT(datetime) -- 从指定时间中获取指定部分 +MONTHS_BETWEEN(date1,date2) -- 获取两个时间之间的月份数 +NET_TIME(date,timezone1,timezone2) -- 获取时区1中的时间转换到时区2后的时间 +TO_CHAR(n[,fmt]) -- 转换为字符类型 +TO_DATE(n[,fmt]) -- 转换为时间类型 +TO_NUMBER(n[,fmt]) -- 转换为数字类型 +LNNVL(condition) -- 排除指定条件函数 +NVL(expr1,expr2) -- expr1为空时返回expr2 +NVL2(expr1,expr2,expr3) -- expr1为空时返回expr3,不为空返回expr2 +AVG([DISTINCT|ALL ]expr) -- 获取平均值 +COUNT(*|[DISTINCT|ALL ]expr) -- 获取数量 +SUM([DISTINCT|ALL ]expr) -- 获取和 +SELECT USER FROM DUAL; -- 返回当前会话的登录名 +USERENV(param) -- 返回当前会话的信息 +SYS_CONTEXT(namespace,param) -- 返回oracle已创建的context +DECODE(expr,search,result[,search1,result1...]) -- expr结果是search返回result +``` ## 查看所有默认表空间 - ```sql - SELECT TABLESPACE_NAME FROM DBA_TABLESPACES; - ``` +```sql +SELECT TABLESPACE_NAME FROM DBA_TABLESPACES; +``` ## 查看指定用户默认表空间 - ```sql - SELECT DEFAULT_STAPCE,USERNAME FROM DBA_USERS WHERE USERNAME='username'; - ``` +```sql +SELECT DEFAULT_STAPCE,USERNAME FROM DBA_USERS WHERE USERNAME='username'; +``` ## 创建表空间 - ```sql - CREATE TABLESPACE tablespace_name - DATAFILE filename - SIZE size - [AUTOEXTEND [ON NEXT size|OFF]] - [MAXSIZE size] - [PERMANENT|TEMPORARY] 永久/临时表空间,默认永久 - [EXTENT MANAGEMENT [DICTIONARY|LOCAL 字典/本地管理方式,默认本地 - [AUTOALLOCATE|UNIFORM. [SIZE integer[K|M]]]]; - ``` +```sql +CREATE TABLESPACE tablespace_name +DATAFILE filename +SIZE size +[AUTOEXTEND [ON NEXT size|OFF]] +[MAXSIZE size] +[PERMANENT|TEMPORARY] 永久/临时表空间,默认永久 +[EXTENT MANAGEMENT [DICTIONARY|LOCAL 字典/本地管理方式,默认本地 +[AUTOALLOCATE|UNIFORM. [SIZE integer[K|M]]]]; +``` ## 重命名表空间 - ```sql - ALTER TABLESPACE oldname RENAME TO newname; - ``` +```sql +ALTER TABLESPACE oldname RENAME TO newname; +``` ## 修改表空间大小 - ```sql - ALTER DATABASE DATAFILE filename RESIZE size; - ``` +```sql +ALTER DATABASE DATAFILE filename RESIZE size; +``` ## 增加表空间大小 - ```sql - ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size; - ``` +```sql +ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size; +``` ## 设置表空间读写状态 - ```sql - ALTER TABLESPACE tablespace_name READ {ONLY|WRITE}; - ``` +```sql +ALTER TABLESPACE tablespace_name READ {ONLY|WRITE}; +``` ## 设置表空间可用状态 - ```sql - ALTER TABLESPACE tablespace_name {ONLINE|OFFLINE [NORMAL|TEMPORARY|IMMEDIATE]}; - ``` +```sql +ALTER TABLESPACE tablespace_name {ONLINE|OFFLINE [NORMAL|TEMPORARY|IMMEDIATE]}; +``` ## 创建大文件表空间 - ```sql - CREATE BIGFILE TABLESPACE tablespace_name DATAFILE filename SIZE size; - ``` +```sql +CREATE BIGFILE TABLESPACE tablespace_name DATAFILE filename SIZE size; +``` ## 删除表空间 - ```sql - DROP TABLESPACE tablespace_name - [INCLUDING CONTENTS AND DATAFILES] 数据文件删除 - [CASCADE CONSTRAINTS]; 完整性删除 - ``` +```sql +DROP TABLESPACE tablespace_name +[INCLUDING CONTENTS AND DATAFILES] 数据文件删除 +[CASCADE CONSTRAINTS]; 完整性删除 +``` ## 查看表空间大小 - ```sql - SELECT TABLESPACE_NAME,FILE_NAME,BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME=tablespace_name; - ``` +```sql +SELECT TABLESPACE_NAME,FILE_NAME,BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME=tablespace_name; +``` ## 查看表空间剩余 空间 - ```sql - SELECT TABLESPACE_NAME,BYTES FROM DBA_FREE_SPACES; - ``` +```sql +SELECT TABLESPACE_NAME,BYTES FROM DBA_FREE_SPACES; +``` ## 创建/修改用户 - ```sql - CREATE|ALTER - USER user_name - IDENTIFIED BY password - [DEFAULT TABLESPACE tablespace_name ] - [QUOTA size|UNLIMITED ON tablespace_name ] 用户使用表空间的最大值 - [PROFILE profile ] 概要文件 - [PASSWORD EXPIRE ] 用户密码过期 - [ACCOUNT LOCK|UNLOCK]; 默认锁定状态 - ``` +```sql +CREATE|ALTER +USER user_name +IDENTIFIED BY password +[DEFAULT TABLESPACE tablespace_name ] +[QUOTA size|UNLIMITED ON tablespace_name ] 用户使用表空间的最大值 +[PROFILE profile ] 概要文件 +[PASSWORD EXPIRE ] 用户密码过期 +[ACCOUNT LOCK|UNLOCK]; 默认锁定状态 +``` ## 删除用户 - ```sql - DROP USER user_name CASCADE; - ``` +```sql +DROP USER user_name CASCADE; +``` ## 授予系统权限 - ```sql - GRANT - system_privileges|ALL PRIVILEGES 权限 - TO {user IDENTIFIED BY password|role } 用户/角色 - [WITH ADMIN OPTION]; 授予其他用户或角色系统权限 - ``` +```sql +GRANT +system_privileges|ALL PRIVILEGES 权限 +TO {user IDENTIFIED BY password|role } 用户/角色 +[WITH ADMIN OPTION]; 授予其他用户或角色系统权限 +``` ## 授予对象权限 - ```sql - GRANT - object_privilege|ALL 权限 - ON schema.object 对象 - TO user_name|role_name 用户/角色 - [WITH ADMIN OPTION ] 授予其他用户或角色系统权限 - [WITH THE GRANT ANY OBJECT]; 授予其他用户或角色对象权限 - ``` +```sql +GRANT +object_privilege|ALL 权限 +ON schema.object 对象 +TO user_name|role_name 用户/角色 +[WITH ADMIN OPTION ] 授予其他用户或角色系统权限 +[WITH THE GRANT ANY OBJECT]; 授予其他用户或角色对象权限 +``` ## 撤销系统权限 - ```sql - REVOKE system_privilege FROM - user|role; - ``` +```sql +REVOKE system_privilege FROM +user|role; +``` ## 撤销对象权限 - ```sql - REVOKE - object_privilege |ALL - ON schema.object FROM - user_name|role_name - [CASCADE CONSTRAINTS]; - ``` +```sql +REVOKE +object_privilege |ALL +ON schema.object FROM +user_name|role_name +[CASCADE CONSTRAINTS]; +``` ## 数据字典 数据 | 字典 @@ -347,150 +347,150 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中 用户角色 | DBA_ROLE_PRIVS ## 创建角色 - ```sql - CREATE|ALTER //创建/修改 - ROLE role_name - [NOT IDENTIFIED|IDENDIFIED BY [password]]; - GRANT //填充权限 - system_privilege|ALL PRIVILEGES - TO role_name - [WITH ADMIN OPTION]; - -- 角色创建完成后不能直接使用,需将角色赋予用户才能使用 - GRANT role_name TO user_name; - SET ROLE role_name -- 设置角色生效 - SET ROLE ALL -- 设置所有角色生效 - SET ROLE ALL EXCEPT role_name -- 设置只有role_name失效 - SET ROLE NONE -- 设置所有角色失效 - ``` +```sql +CREATE|ALTER //创建/修改 +ROLE role_name +[NOT IDENTIFIED|IDENDIFIED BY [password]]; +GRANT //填充权限 +system_privilege|ALL PRIVILEGES +TO role_name +[WITH ADMIN OPTION]; +-- 角色创建完成后不能直接使用,需将角色赋予用户才能使用 +GRANT role_name TO user_name; +SET ROLE role_name -- 设置角色生效 +SET ROLE ALL -- 设置所有角色生效 +SET ROLE ALL EXCEPT role_name -- 设置只有role_name失效 +SET ROLE NONE -- 设置所有角色失效 +``` ## 删除角色 - ```sql - DROP ROLE role_name; - ``` +```sql +DROP ROLE role_name; +``` ## 脱机备份(冷备份)/恢复 - ```sql - 关闭数据库服务后直接复制需要的文件,包括数据文件和控制文件 - ``` +```sql +关闭数据库服务后直接复制需要的文件,包括数据文件和控制文件 +``` ## 联机备份(热备份) - ```sql - ARCHIVE LOG LIST 查看本机数据库的日志状态 - ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE; 设置日志模式为归档 - SHUTDOWN IMMEDIATE; 关闭数据库 - STARTUP MOUNT; 启动mount实例 - ALTER DATABASE ARCHIVELOG; 更改数据库为归档日志模式 - ALTER DATABASE OPEN; 更改数据库状态为打开模式 - ALTER TABLESPACE tablespace_name BEGIN BACKUP; 开始备份数据库 - 复制文件到其他目录 - ALTER TABLESPACE tablespace_name END BACKUP; 结束备份操作 - ``` +```sql +ARCHIVE LOG LIST 查看本机数据库的日志状态 +ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE; 设置日志模式为归档 +SHUTDOWN IMMEDIATE; 关闭数据库 +STARTUP MOUNT; 启动mount实例 +ALTER DATABASE ARCHIVELOG; 更改数据库为归档日志模式 +ALTER DATABASE OPEN; 更改数据库状态为打开模式 +ALTER TABLESPACE tablespace_name BEGIN BACKUP; 开始备份数据库 +复制文件到其他目录 +ALTER TABLESPACE tablespace_name END BACKUP; 结束备份操作 +``` ## 恢复 - ```sql - ALTER SYSTEM ARCHIVE LOG CURRENT; 归档当前日志 - ALTER SYSTEM SWITCH LOGFILE; 切换日志文件 - SELECT * FROM v$RECOVER_FILE 获取文件编号 - ALTER DATABASE DATAFILE file_id OFFLINE DROP; 把要恢复的数据文件脱机 - ALTER DATABASE OPEN; 更改数据库状态为打开模式 - RECOVER DATAFILE file_id; 恢复数据文件 - ALTER DATABASE DATAFILE file_id ONLINE; 设置数据文件联机 - ``` +```sql +ALTER SYSTEM ARCHIVE LOG CURRENT; 归档当前日志 +ALTER SYSTEM SWITCH LOGFILE; 切换日志文件 +SELECT * FROM v$RECOVER_FILE 获取文件编号 +ALTER DATABASE DATAFILE file_id OFFLINE DROP; 把要恢复的数据文件脱机 +ALTER DATABASE OPEN; 更改数据库状态为打开模式 +RECOVER DATAFILE file_id; 恢复数据文件 +ALTER DATABASE DATAFILE file_id ONLINE; 设置数据文件联机 +``` ## EXP工具导出数据 - ```bash - exp db_user/password 登陆数据库的用户名和密码,非SYS - ``` +```bash +exp db_user/password 登陆数据库的用户名和密码,非SYS +``` ## EXP工具直接导出表 - ```bash - exp db_user/password file="filename.dmp" tables="table_name,..." - ``` +```bash +exp db_user/password file="filename.dmp" tables="table_name,..." +``` ## EXP工具导出表空间 - ```bash - exp db_user/password file="filename.dmp" tablespaces="tablespaces_name" - ``` +```bash +exp db_user/password file="filename.dmp" tablespaces="tablespaces_name" +``` ## EXPDP导出数据 - ```sql - CREATE DIRECTORY directory_name AS 'file_name'; 目录名称 文件名称 - GRANT READ,WRITE ON DIRECTORY directory_name TO db_user; 授权用户使用该目录 - #expdp db_user/password directory=directory_name dumpfile=file_name tables=table_name; - ``` +```sql +CREATE DIRECTORY directory_name AS 'file_name'; 目录名称 文件名称 +GRANT READ,WRITE ON DIRECTORY directory_name TO db_user; 授权用户使用该目录 +#expdp db_user/password directory=directory_name dumpfile=file_name tables=table_name; +``` ## IMP导入数据 - ```sql - imp db_user/password - ``` +```sql +imp db_user/password +``` ## IMP直接导入表 - ```sql - imp db_user/password file="filename.dmp" tables="table_name,..." - ``` +```sql +imp db_user/password file="filename.dmp" tables="table_name,..." +``` ## IMPDP导入数据 - ```sql - impdp db_user_password - ``` +```sql +impdp db_user_password +``` ## IMPDP直接导入表 - ```bash - impdp db_user/password directory=dir dumpfile=filename.dmp tables=table_name; - ``` +```bash +impdp db_user/password directory=dir dumpfile=filename.dmp tables=table_name; +``` ## RMAN工具配置 - ```sql - CONN /AS SYSDBA; 连接恢复目录数据库 - CREATE USER rman_user IDENTIFIED BY password DEFAULT TABLESPACE tablespace_name; 创建恢复用户 - GRANT RECOVERY_CATALOG_OWNER TO rman_user; 为新创建的用户授权 - #rman - CONN CATALOG rman_user/password; 连接新创建的用户 - CREATE CATALOG; 创建恢复目录 - ``` +```sql +CONN /AS SYSDBA; 连接恢复目录数据库 +CREATE USER rman_user IDENTIFIED BY password DEFAULT TABLESPACE tablespace_name; 创建恢复用户 +GRANT RECOVERY_CATALOG_OWNER TO rman_user; 为新创建的用户授权 +#rman +CONN CATALOG rman_user/password; 连接新创建的用户 +CREATE CATALOG; 创建恢复目录 +``` ## RMAN工具使用 - ```sql - #rman target db_user/password@servicename catalog rman_user/password 连接恢复目录数据库 - CONNECT TARGET db_user/password@servicename; 连接目标数据库 - CONNECT CATALOG rman_user/password@servicename; 连接恢复目录数据库 - REGISTER database; 在恢复目录数据库中注册数据库 - ``` +```sql +#rman target db_user/password@servicename catalog rman_user/password 连接恢复目录数据库 +CONNECT TARGET db_user/password@servicename; 连接目标数据库 +CONNECT CATALOG rman_user/password@servicename; 连接恢复目录数据库 +REGISTER database; 在恢复目录数据库中注册数据库 +``` ## 手动分配通道 - ```sql - 关闭目标数据库,启动到mount状态,运行: - run - { - ALLOCATE CHANNEL channel_name1 DEVICE TYPE {sbt|disk}; - ... - BACKUP [level] [backup type] [option] - } - ``` +```sql +关闭目标数据库,启动到mount状态,运行: +run +{ + ALLOCATE CHANNEL channel_name1 DEVICE TYPE {sbt|disk}; + ... + BACKUP [level] [backup type] [option] +} +``` ## 自动分配通道 - ```sql - CONFIGURE DEVICE TYPE {sbt|disk} PARALLELISM n; 指定通道类型和名称 - CONFIGURE DEFAULT DEVICE TYPE {sbt|disk}; 指定默认设备类型 - BACKUP [level] [backup type] [option]; - ``` +```sql +CONFIGURE DEVICE TYPE {sbt|disk} PARALLELISM n; 指定通道类型和名称 +CONFIGURE DEFAULT DEVICE TYPE {sbt|disk}; 指定默认设备类型 +BACKUP [level] [backup type] [option]; +``` ## BACKUP 参数 - ```sql - level 备份增量,1、2、3、4或者FULL(全备份) - backup type 对象类型,database、datafile、tablespace、controlfilecopy、archivelog all - option channel备份使用的通道 maxsetsize定义备份集的最大值 - ``` +```sql +level 备份增量,1、2、3、4或者FULL(全备份) +backup type 对象类型,database、datafile、tablespace、controlfilecopy、archivelog all +option channel备份使用的通道 maxsetsize定义备份集的最大值 +``` ## RESTORE还原 - ```sql - RESTORE database_object; - database_object: DATABASE(mount),TABLESPACE(open),DATAFILE,CONTROLFILE(mount),ARCHIVELOG,SPFILE(mount) - ``` +```sql +RESTORE database_object; +database_object: DATABASE(mount),TABLESPACE(open),DATAFILE,CONTROLFILE(mount),ARCHIVELOG,SPFILE(mount) +``` ## RECOVER同步恢复 - ```sql - RECOVER database_object; - database_object: DATABASE(mount),TABLESPACE(open),DATAFILE - ``` +```sql +RECOVER database_object; +database_object: DATABASE(mount),TABLESPACE(open),DATAFILE +``` diff --git a/content/post/python-op.md b/content/post/python-op.md index 6402333..58f7c9e 100644 --- a/content/post/python-op.md +++ b/content/post/python-op.md @@ -7,30 +7,30 @@ categories: ["python"] --- ## 生成标准的、符合Unix/Posix 规范的命令行说明 - ```python - from optparse import OptionParser - parser = OptionParser() - parser.add_option('-p', '--pdbk', action = 'store_true', dest = 'pdcl', default = False, - help = 'write pdbk data to oracle db') - parser.add_option('-z', '--zdbk', action = 'store_true', dest = 'zdcl', default = False, - help = 'write zdbk data to oracle db') - (options, args) = parser.parse_args() - if options.pdcl == True: - print 'pdcl is true.' - if options.zdcl == True: - print 'zdcl is True.' - ``` +```python +from optparse import OptionParser +parser = OptionParser() +parser.add_option('-p', '--pdbk', action = 'store_true', dest = 'pdcl', default = False, + help = 'write pdbk data to oracle db') +parser.add_option('-z', '--zdbk', action = 'store_true', dest = 'zdcl', default = False, + help = 'write zdbk data to oracle db') +(options, args) = parser.parse_args() +if options.pdcl == True: + print 'pdcl is true.' +if options.zdcl == True: + print 'zdcl is True.' +``` ## 简单流程 - ```python - # 引入OptionParser类,创建OptionParser对象 - from optparse import OptionParser - parser = OptionParser() - # 定义命令行参数 - parser.add_option(opt_str, ..., attr = value, ...) - # 解析命令行参数 - (options, args) = parser.parse_args() - ``` +```python +# 引入OptionParser类,创建OptionParser对象 +from optparse import OptionParser +parser = OptionParser() +# 定义命令行参数 +parser.add_option(opt_str, ..., attr = value, ...) +# 解析命令行参数 +(options, args) = parser.parse_args() +``` ## parse_args 和 add_options 函数 - parse_args() 接收一个命令行列表,默认使用 sys.argv\[:-1\] @@ -93,12 +93,12 @@ categories: ["python"] - metavar 提醒用户该参数期待的参数,如 metavar = 'mode' 会在帮助中显示成 -m MODE, --mode=MODE ## OptionGroup 参数分组 - ```python - group = OptionGroup(parser, 'Dangerous Options', - '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.') - parser.add_option_group(group) - ``` +```python +group = OptionGroup(parser, 'Dangerous Options', + '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.') +parser.add_option_group(group) +``` - version 创建OptionParser对象时指定该参数,会解释成 --version 命令行参数 - optparser 可以自动探测并处理一些用户异常,也可以使用 parser.error() 方法来自定义部分异常的处理