[{"content":"前言 公司使用群晖 NAS 搭建了文件共享平台，大家通过 SMB 共享的方式映射为网络驱动器使用，但是有个问题，就是当一个人打开 Word 或 Excel 文件编辑时，其他人打开相同的文件会提示文件处于锁定状态，某某正在编辑，只能以只读的方式打开，根据提示无法获知具体是谁占用的文件。\n那有没有办法知道具体是哪个 NAS 用户或者哪个电脑 IP 占用的了？当然是有的，下面给出解决方法。\n解决方法 首先打开群晖 NAS 的 SSH 功能。依次点击 控制面板 \u0026gt; 终端机和SNMP，然后勾选 启动 SSH 功能，最后点击 应用 按钮即可。 使用终端工具连接 NAS 主机，我这里使用的 MobaXterm，输入 NAS 的 IP 地址和 SSH 端口号（没修改的情况下默认为：22）后点击 OK 按钮进行连接。 输入 NAS 系统的管理员账号和密码后就进入到 NAS 系统的 Shell 环境了。 切换为 root 用户，输入 sudo -i，这里会提示你输入密码，这个密码就是上面的 NAS 管理员账号的密码。 执行命令 smbstatus -L，该命令会列出共享文件夹中所有被锁定的文件的信息。在返回的列表中找到需要排查的锁定文件，记住该文件最前面的 Pid，比如我这里是 8204。 根据前面的 Pid，执行 smbstatus -b | grep 8204 命令，该命令会列出此 Pid 对应的 NAS 账号和电脑 IP 信息。 ","permalink":"https://varkai.com/posts/9ac49acb/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e公司使用群晖 NAS 搭建了文件共享平台，大家通过 SMB 共享的方式映射为网络驱动器使用，但是有个问题，就是当一个人打开 Word 或 Excel 文件编辑时，其他人打开相同的文件会提示文件处于锁定状态，某某正在编辑，只能以只读的方式打开，根据提示无法获知具体是谁占用的文件。\u003c/p\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/9ac49acb/1.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003e那有没有办法知道具体是哪个 NAS 用户或者哪个电脑 IP 占用的了？当然是有的，下面给出解决方法。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"解决方法\"\u003e解决方法\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e首先打开群晖 NAS 的 SSH 功能。依次点击 \u003ccode\u003e控制面板\u003c/code\u003e \u0026gt; \u003ccode\u003e终端机和SNMP\u003c/code\u003e，然后勾选 \u003ccode\u003e启动 SSH 功能\u003c/code\u003e，最后点击 \u003ccode\u003e应用\u003c/code\u003e 按钮即可。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/9ac49acb/2.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003col start=\"2\"\u003e\n\u003cli\u003e使用终端工具连接 NAS 主机，我这里使用的 MobaXterm，输入 NAS 的 IP 地址和 SSH 端口号（没修改的情况下默认为：22）后点击 \u003ccode\u003eOK\u003c/code\u003e 按钮进行连接。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/9ac49acb/3.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003col start=\"3\"\u003e\n\u003cli\u003e输入 NAS 系统的管理员账号和密码后就进入到 NAS 系统的 Shell 环境了。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/9ac49acb/4.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/9ac49acb/5.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003col start=\"4\"\u003e\n\u003cli\u003e切换为 root 用户，输入 \u003ccode\u003esudo -i\u003c/code\u003e，这里会提示你输入密码，这个密码就是上面的 NAS 管理员账号的密码。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/9ac49acb/6.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003col start=\"5\"\u003e\n\u003cli\u003e执行命令 \u003ccode\u003esmbstatus -L\u003c/code\u003e，该命令会列出共享文件夹中所有被锁定的文件的信息。在返回的列表中找到需要排查的锁定文件，记住该文件最前面的 \u003ccode\u003ePid\u003c/code\u003e，比如我这里是 \u003ccode\u003e8204\u003c/code\u003e。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/9ac49acb/7.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003col start=\"6\"\u003e\n\u003cli\u003e根据前面的 \u003ccode\u003ePid\u003c/code\u003e，执行 \u003ccode\u003esmbstatus -b | grep 8204\u003c/code\u003e 命令，该命令会列出此 Pid 对应的 NAS 账号和电脑 IP 信息。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/9ac49acb/8.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003chr\u003e","title":"群晖 NAS 共享文件占用排查"},{"content":"前言 最近有个需求，就是希望在公司或者外面的时候能够访问到家里提供的网络服务，例如：文件共享、照片存储等。但是我家里的网络没有提供公网地址，在外面是无法直接访问的，几经搜寻之后，发现可以使用 WireGurad 组件虚拟专用局域网实现内网的穿透，从而实现在外面访问家里的内网服务。\n本文将介绍如何在 Debian 12 上安装和配置 WireGuard，它将充当中转服务器。还将展示如何在 Linux、Windows 和 macOS 上将 WireGuard 配置为客户端。客户端的流量将通过 Debian 12 服务器进行路由。\n通过 WireGuard 组建虚拟专用网络，可用于防止中间人攻击、匿名上网、绕过受地理限制的内容或允许在家工作的同事安全地连接到公司网络。\nWireGuard 是什么 下面是 WireGuard 官网的介绍：\nWireGuard 是一种极其简单但快速且现代的 VPN，它利用了最先进的加密技术。它的目标是比 IPsec 更快、更简单、更精简和更有用，同时避免令人头疼的问题。其旨在提供比 OpenVPN 更高的性能。WireGuard 被设计为在嵌入式接口和超级计算机等上运行的通用 VPN，适用于许多不同的环境。虽然最初仅支持 Linux，但现在可以跨平台（Windows、macOS、BSD、iOS、Android）广泛部署。\n通过 WireGuard 可以将广域网上的主机连接起来，形成一个局域网。只需要有一台具有固定公网 IP 的服务器，就可以将其作为我们搭建的局域网的中心节点，让其他的主机（不论是否有公网IP，不论是否在NAT内），都通过这个中心节点和彼此相连。由此就构建了一个中心辐射型的局域网，实现了内网穿透等功能。\n前提条件 公网服务器： 一台具有公网 IP 地址的 Linux 服务器，我这里采用的是 Debian 12 系统，这台服务器充当中转站，负责将外部请求转发到相应的内部网络。 内网服务器： 在家庭内网中，也需要准备一台 Linux 服务器做内部局域网的地址转发。 网络拓扑 Peer1 - 公网服务器（OS：Debian 12） Peer2 - 家庭内网服务器 （OS：Debian12） Peer3 - 需要访问家庭网络的外部客户端（OS：任意 WireGuard 支持的平台，有关 WireGuard 所有受支持平台的安装说明，请访问 https://wireguard.com/install/） WireGuard 组网配置 配置 Peer1 中继服务器 安装 WireGuard 1 $ sudo apt install wireguard 配置 WireGuard 生成服务端密钥对 执行以下命令后，将在 /etc/wireguard 目录下生成私钥文件 privatekey 和公钥文件 publickey ：\n1 $ wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey 创建配置文件 在 /etc/wireguard 目录下创建一个名为 wg0.conf 的配置文件，使用编辑器打开并编写配置：\n1 $ sudo vim /etc/wireguard/wg0.conf 配置文件内容如下：\n1 2 3 4 5 6 7 [Interface] Address = 10.0.0.1/24 ListenPort = 51820 PrivateKey = YOUR_SERVER_PRIVATE_KEY SaveConfig = true PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE 配置文件中 Interface 节点的设置含义：\nAddress - WireGuard 的接口地址，可以从为专用网络保留的地址范围（10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16）中选择一个 IP 地址。\nListenPort - 服务的监听端口，这里使用的是 UDP 端口。\nPrivateKey - 服务端私钥，可以通过 sudo cat /etc/wireguard/privatekey 查看。\nSaveConfig - 当设置为 true，关闭 WireGuard 接口时，将当前状态保存到配置文件中。\nPostUp - 在启动接口之前执行的命令或脚本。 注意：这里需要将 POSTROUTING -o 后面的网络接口名称 eth0 替换成你自己服务器的默认网络接口名称，可以通过下面的命令查看默认网络接口名称：\n1 $ ip -o -4 route show to default | awk \u0026#39;{print $5}\u0026#39; PostDown - 在关闭接口之前执行的命令或脚本。一旦接口关闭，iptables 规则将被删除。这里同样的也需要将网络接口名称 eth0 替换成你自己服务器的默认网络接口名称。\n设置 /etc/wireguard 目录下所有文件的权限为 600，确保服务的安全性。\n1 $ sudo chmod 600 /etc/wireguard/* 完成以上步骤后，使用 wg0 配置文件中的设置启动接口：\n1 $ sudo wg-quick up wg0 要检查接口状态和配置，请运行：\n1 $ sudo wg show wg0 还可以使用以下命令验证接口状态：\n1 $ ip a show wg0 WireGuard 可以使用 Systemd 进行管理，运行以下命令设置 WireGuard 接口开机自启动：\n1 $ sudo systemctl enable wg-quick@wg0 网络和防火墙配置 必须启用 IP 转发才能使 NAT 正常工作。\n打开 /etc/sysctl.conf 文件：\n1 $ sudo vim /etc/sysctl.conf 添加或取消注释以下行：\n1 net.ipv4.ip_forward=1 保存文件后执行以下命应用更改：\n1 $ sudo sysctl -p 如果系统启用了防火墙，则需要在防火墙放行 UDP 端口 51820 的流量，我使用的是 ufw 软件管理防火墙，相应的命令如下：\n1 $ sudo ufw allow 51820/udp 到这里，WireGuard 的服务端就已经设置好了。\n配置 Peer2 内网服务器 开启 IP 地址转发 开启 IP 地址转发后，才能将其它客户端访问内部局域网的数据转发到相应的目标机器。\n打开 /etc/sysctl.conf 文件：\n1 $ sudo vim /etc/sysctl.conf 添加或取消注释以下行：\n1 net.ipv4.ip_forward=1 保存文件后执行以下命应用更改：\n1 $ sudo sysctl -p 安装 WireGuard 1 $ sudo apt install wireguard 配置 WireGuard 配置过程与配置 Peer1 的过程几乎相同。首先，生成公钥和私钥：\n1 $ wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey 在 /etc/wireguard 目录下创建一个名为 wg0.conf 的配置文件，使用编辑器打开并编写配置：\n1 $ sudo vim /etc/wireguard/wg0.conf 配置文件内容如下：\n1 2 3 4 5 6 7 8 9 10 11 [Interface] PrivateKey = YOUR_CLIENT_PRIVATE_KEY Address = 10.0.0.2/24 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = YOUR_SERVER_PUBLIC_KEY Endpoint = 1.2.3.4:51820 AllowedIPs = 10.0.0.0/24 PersistentKeepalive = 25 配置文件中 Interface 节点的设置含义：\nPrivateKey - 本机客户端的私钥，可以通过 sudo cat /etc/wireguard/privatekey 查看。\nAddress - 本机客户端的接口地址。\nPostUp - 在启动接口之前执行的命令或脚本。 注意：这里需要将 POSTROUTING -o 后面的网络接口名称 eth0 替换成你自己服务器的默认网络接口名称，可以通过下面的命令查看默认网络接口名称：\n1 $ ip -o -4 route show to default | awk \u0026#39;{print $5}\u0026#39; PostDown - 在关闭接口之前执行的命令或脚本。一旦接口关闭，iptables 规则将被删除。这里同样的也需要将网络接口名称 eth0 替换成你自己服务器的默认网络接口名称。\n配置文件 Peer 节点的设置含义：\nPublicKey - Peer1（中继服务器）的公钥，可以通过在 Peer1 服务器上运行 sudo cat /etc/wireguard/publickey 查看。 Endpoint - 指定远端 Peer1（中继服务器）的公网地址和监听端口。 AllowedIPs - 需要进行路由转发的目标网段，可以是以逗号分隔的 IPv4 或 IPv6 地址列表。 PersistentKeepalive - 表示每隔多少秒发送一次 ping 来检查连通性。 配置 Peer3 客户端 Peer3 做为需要访问家庭内部网络的客户端，这里主要以 Windows 为例进行配置演示。\n从 WireGuard 网站 下载并安装 Windows MSI 软件包。\n安装完成后，打开 WireGuard 应用程序后，单击 新建隧道 -\u0026gt; 新建空隧道... ，如下图所示：\n密钥对会自动创建并显示在弹出的编辑框中：\n输入隧道的名称后并编辑配置，如下所示：\n1 2 3 4 5 6 7 8 9 [Interface] PrivateKey = UKbdobnRCZlycBkHZQAD7hPVjicoKQCM1ktBZhGLfno= Address = 10.0.0.3/24 [Peer] PublicKey = YOUR_SERVER_PUBLIC_KEY Endpoint = 1.2.3.4:51820 AllowedIPs = 10.0.0.0/24, 192.168.1.0/24 PersistentKeepalive = 25 在 Interface 节点添加：\nAddress - 本机客户端的接口地址。 在 Peer 节点添加：\nPublicKey - Peer1（中继服务器）的公钥，可以通过在 Peer1 服务器上运行 sudo cat /etc/wireguard/publickey 查看。 Endpoint - 指定远端 Peer1（中继服务器）的公网地址和监听端口。 AllowedIPs - 需要进行路由转发的目标网段，这里需要额外添加需要访问的家庭内网网段。 PersistentKeepalive - 表示每隔多少秒发送一次 ping 来检查连通性。 完成后，点击 保存 按钮。\n将客户端添加到中继服务器 最后一步是将所有客户端的公钥和 IP 地址添加到中继服务器。\n添加 Peer2 客户端 1 $ sudo wg set wg0 peer ${Peer2 公钥} allowed-ips 10.0.0.2/32,192.168.1.0/24 添加 Peer3 客户端 1 $ sudo wg set wg0 peer ${Peer3 公钥} allowed-ips 10.0.0.3/32 完成后，返回客户端计算机并启动隧道接口。\n启动客户端并检查连接状态 启动 Peer2 客户端 在 Peer2 服务器上运行以下命令以启动接口：\n1 $ sudo wg-quick up wg0 现在，Peer2 服务器应该已连接到 Peer1 服务器，可以通过以下方式检查连接：\n1 $ sudo wg 要停止隧道，允许如下命令关闭接口：\n1 $ sudo wg-quick down wg0 启动 Peer3 客户端 打开 WireGuard 软件后，点击主界面的 连接 按钮，连接到中继服务器后，隧道状态将变更为 已连接。\n此时就可以通过 Peer3 这台客户端访问家庭局域网了。\n","permalink":"https://varkai.com/posts/53d88863/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e最近有个需求，就是希望在公司或者外面的时候能够访问到家里提供的网络服务，例如：文件共享、照片存储等。但是我家里的网络没有提供公网地址，在外面是无法直接访问的，几经搜寻之后，发现可以使用 WireGurad 组件虚拟专用局域网实现内网的穿透，从而实现在外面访问家里的内网服务。\u003c/p\u003e\n\u003cp\u003e本文将介绍如何在 Debian 12 上安装和配置 WireGuard，它将充当中转服务器。还将展示如何在 Linux、Windows 和 macOS 上将 WireGuard 配置为客户端。客户端的流量将通过 Debian 12 服务器进行路由。\u003c/p\u003e\n\u003cp\u003e通过 WireGuard 组建虚拟专用网络，可用于防止中间人攻击、匿名上网、绕过受地理限制的内容或允许在家工作的同事安全地连接到公司网络。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"wireguard-是什么\"\u003eWireGuard 是什么\u003c/h2\u003e\n\u003cp\u003e下面是 WireGuard 官网的介绍：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWireGuard 是一种极其简单但快速且现代的 VPN，它利用了最先进的加密技术。它的目标是比 IPsec 更快、更简单、更精简和更有用，同时避免令人头疼的问题。其旨在提供比 OpenVPN 更高的性能。WireGuard 被设计为在嵌入式接口和超级计算机等上运行的通用 VPN，适用于许多不同的环境。虽然最初仅支持 Linux，但现在可以跨平台（Windows、macOS、BSD、iOS、Android）广泛部署。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e通过 WireGuard 可以将广域网上的主机连接起来，形成一个局域网。只需要有一台具有固定公网 IP 的服务器，就可以将其作为我们搭建的局域网的中心节点，让其他的主机（不论是否有公网IP，不论是否在NAT内），都通过这个中心节点和彼此相连。由此就构建了一个中心辐射型的局域网，实现了内网穿透等功能。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"前提条件\"\u003e前提条件\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e公网服务器：\u003c/strong\u003e 一台具有公网 IP 地址的 Linux 服务器，我这里采用的是 Debian 12 系统，这台服务器充当中转站，负责将外部请求转发到相应的内部网络。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e内网服务器：\u003c/strong\u003e 在家庭内网中，也需要准备一台 Linux 服务器做内部局域网的地址转发。\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"网络拓扑\"\u003e网络拓扑\u003c/h2\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/53d88863/1.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePeer1\u003c/strong\u003e - 公网服务器（OS：Debian 12）\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePeer2\u003c/strong\u003e - 家庭内网服务器 （OS：Debian12）\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePeer3\u003c/strong\u003e - 需要访问家庭网络的外部客户端（OS：任意 WireGuard 支持的平台，有关 WireGuard 所有受支持平台的安装说明，请访问 \u003ca href=\"https://wireguard.com/install/\"\u003ehttps://wireguard.com/install/\u003c/a\u003e）\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"wireguard-组网配置\"\u003eWireGuard 组网配置\u003c/h2\u003e\n\u003ch3 id=\"配置-peer1-中继服务器\"\u003e配置 Peer1 中继服务器\u003c/h3\u003e\n\u003ch4 id=\"安装-wireguard\"\u003e安装 WireGuard\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sudo apt install wireguard\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"配置-wireguard\"\u003e配置 WireGuard\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e生成服务端密钥对\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e执行以下命令后，将在 \u003ccode\u003e/etc/wireguard\u003c/code\u003e 目录下生成私钥文件 \u003ccode\u003eprivatekey\u003c/code\u003e 和公钥文件 \u003ccode\u003epublickey\u003c/code\u003e ：\u003c/p\u003e","title":"使用 WireGuard 组网实现内网穿透"},{"content":"RAID 级别对比表格：\nRAID级别 最小硬盘数 可用容量 容错性 冗余性 热备盘选项 读性能 随机写性能 连续写性能 RAID 0 n ≥ 2 n 无 无 无 高 高 高 RAID 1 n ≥ 2 1 有 镜像 有 中 低 低 RAID 5 n ≥ 3 n-1 有 奇偶校验 有 高 低 中 RAID 6 n ≥ 4 n-2 有 奇偶校验 有 高 低 低 RAID 10 n ≥ 4（n为偶数） n/2 有 镜像 有 中 中 中 RAID 级别详解 RAID 0 至少需要硬盘数：2\n可使用空间：所有硬盘容量的加总\n说明：将多个硬盘合并成一个存储空间，可使用空间为所有硬盘容量的加总。这种组态的优点是能够将不同容量的硬盘合并成一个大的存储空间，但是这种组态不提供任何的数据保护。\n优：资料会被均分并写入不同的硬盘上。数据存取会更快速并更有效率。\n劣：如果其中一颗硬盘损毁，所有数据将会遗失除非平时有在做额外的数据备份。\nRAID 1 至少需要硬盘数：2\n可使用空间：（最小硬盘容量）*（1）\n说明：RAID 1 模式下你的数据将直接同时写入两颗硬盘成为 “镜像对映”，任何时刻两颗硬盘上的数据都会完全相同，当其中一颗硬盘故障时，系统也能够正常运作。这种组态的优点是提供数据保护，RAID 1 的缺点是当你使用两颗不同容量的硬盘来建立 RAID 组态时，可用的存储空间将会等于最小硬盘容量。\n优：数据将会被复制到所有的硬盘上，不管坏了几颗硬盘，只要还有一颗硬盘是正常的，数据将不受影响。\n劣：不管安装了多少颗硬盘，可用空间会被局限同等于一颗硬盘。\nRAID 5 至少需要硬盘数：3\n可使用空间：（最小硬盘容量）*（硬盘总数 - 1）\n说明：由三颗或以上的硬盘所组成，能够允许一颗硬盘故障而不会造成数据流失。当硬盘损坏时，你只需更换新的硬盘，系统将会自动替你重建 RAID 组态。RAID 5 的优点是提供数据保护，然而如果你使用不同容量的硬盘来建立 RAID 组态时，可用的存储空间将会以最小硬盘容量来计算。\n优：一颗硬盘的容错机制。数据会被均分到不同的硬盘上并加上同比特 (储备) 的数据检查，如果坏了一颗硬盘，同比特数据将会确保数据的完整性。\n劣：存储空间将会有一颗硬盘的容量大小被保留为同比特数据的检查/存储，因此将会影响整体的数据可用空间。\nRAID 6 至少需要硬盘数：4\n可使用空间：（最小硬盘容量）*（硬盘总数 - 2）\n说明：由四颗或以上的硬盘所组成，能够允许两颗硬盘故障而不会造成数据流失。当硬盘损坏时，你只需更换新的硬盘，系统将会自动替你重建 RAID 组态。RAID 6 的优点是提供数据保护，然而如果你使用不同容量的硬盘来建立 RAID 组态时，可用的存储空间将会以最小硬盘容量来计算。\n优：二颗硬盘的容错机制。数据会被均分到不同的硬盘上并加上同比特 (储备) 的数据检查，如果坏了一颗硬盘，同比特数据将会提升数据的完整性。\n劣：存储空间将会有两颗硬盘的容量大小被保留为同比特数据的检查/存储，因此将会影响整体的数据可用空间。\nRAID 10 至少需要硬盘数：4，且必须为偶数\n可使用空间：（最小硬盘容量）*（硬盘总数 / 2）\n说明：由四颗或以上的硬盘所组成，可允许多颗硬盘故障而不会造成数据流失 (必须非相同的镜像对映硬盘)，RAID 10 综合了 RAID 1 的数据保护以及 RAID 0 的数据访问速度。RAID 10 是利用 RAID 1 先将数据镜射到两组硬盘，再用 RAID 0 将所有硬盘分为两组。建立 RAID 0 时需要四颗或以上的双数硬盘，当使用不同容量的硬盘来建立 RAID 组态时，可用的存储空间将会以最小硬盘容量来计算。\n优：利用了 RAID 0 的速度以及 RAID 1 的保护两种特性。\n劣：所需的硬盘数较多，至少必须拥有四个以上的偶数硬盘才能使用，且能被利用的可用空间有限。\n","permalink":"https://varkai.com/posts/79f629a6/","summary":"\u003cp\u003e\u003cstrong\u003eRAID 级别对比表格：\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth style=\"text-align: left\"\u003eRAID级别\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e最小硬盘数\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e可用容量\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e容错性\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e冗余性\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e热备盘选项\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e读性能\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e随机写性能\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e连续写性能\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eRAID 0\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en ≥ 2\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e无\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e无\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e无\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e高\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e高\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e高\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eRAID 1\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en ≥ 2\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e1\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e有\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e镜像\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e有\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e中\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e低\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e低\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eRAID 5\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en ≥ 3\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en-1\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e有\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e奇偶校验\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e有\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e高\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e低\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e中\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eRAID 6\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en ≥ 4\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en-2\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e有\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e奇偶校验\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e有\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e高\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e低\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e低\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eRAID 10\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en ≥ 4（n为偶数）\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003en/2\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e有\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e镜像\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e有\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e中\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e中\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e中\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"raid-级别详解\"\u003eRAID 级别详解\u003c/h2\u003e\n\u003ch3 id=\"raid-0\"\u003eRAID 0\u003c/h3\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/79f629a6/1.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003e\u003cstrong\u003e至少需要硬盘数\u003c/strong\u003e：2\u003c/p\u003e","title":"RAID 级别对比"},{"content":"因为众所周知的原因，国内从 GitHub 上克隆代码是非常非常的慢的，只能利用梯子曲线救国了，但是就算梯子打开全局系统代理，对 git clone 也是没有用的，经过一番搜寻和实践，终于找到利用梯子加速的方法：\n只要在 ~/.ssh 目录下新建一个 config 文件，并写入以下内容：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 这里的 -a none 是 NO-AUTH 模式 # 详情参见 https://bitbucket.org/gotoh/connect/wiki/Home 中的 More detail 一节 # 将 SOCKS5 代理地址替换成自己的地址 ProxyCommand connect -S 127.0.0.1:7890 -a none %h %p Host github.com User git Port 22 Hostname github.com # 这里是 ssh 的私钥地址，注意修改路径为你的路径 IdentityFile \u0026#34;C:\\Users\\username\\.ssh\\id_rsa\u0026#34; TCPKeepAlive yes Host ssh.github.com User git Port 443 Hostname ssh.github.com # 这里是 ssh 的私钥地址，注意修改路径为你的路径 IdentityFile \u0026#34;C:\\Users\\username\\.ssh\\id_rsa\u0026#34; TCPKeepAlive yes 到这里就可以打开你的梯子，享受 GitHub 克隆时飞一般的感觉！\n","permalink":"https://varkai.com/posts/749d0bab/","summary":"\u003cp\u003e因为众所周知的原因，国内从 GitHub 上克隆代码是非常非常的慢的，只能利用梯子曲线救国了，但是就算梯子打开全局系统代理，对 \u003ccode\u003egit clone\u003c/code\u003e 也是没有用的，经过一番搜寻和实践，终于找到利用梯子加速的方法：\u003c/p\u003e\n\u003cp\u003e只要在 \u003ccode\u003e~/.ssh\u003c/code\u003e 目录下新建一个 \u003ccode\u003econfig\u003c/code\u003e 文件，并写入以下内容：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 这里的 -a none 是 NO-AUTH 模式\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 详情参见 https://bitbucket.org/gotoh/connect/wiki/Home 中的 More detail 一节\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 将 SOCKS5 代理地址替换成自己的地址\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProxyCommand connect -S 127.0.0.1:7890 -a none %h %p\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost github.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  User git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Port \u003cspan class=\"m\"\u003e22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Hostname github.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e# 这里是 ssh 的私钥地址，注意修改路径为你的路径\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  IdentityFile \u003cspan class=\"s2\"\u003e\u0026#34;C:\\Users\\username\\.ssh\\id_rsa\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  TCPKeepAlive yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost ssh.github.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  User git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Port \u003cspan class=\"m\"\u003e443\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Hostname ssh.github.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e# 这里是 ssh 的私钥地址，注意修改路径为你的路径\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  IdentityFile \u003cspan class=\"s2\"\u003e\u0026#34;C:\\Users\\username\\.ssh\\id_rsa\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  TCPKeepAlive yes\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e到这里就可以打开你的梯子，享受 GitHub 克隆时飞一般的感觉！\u003c/p\u003e","title":"使用 SOCKS5 代理加速 GitHub 克隆"},{"content":"前言 这篇文章主要讲解 VMware ESXi 下安装 NUT 客户端实现断电自动关机，同样的，NUT 在 ESXi 下也提供了现成的软件包，我们只需要安装并配置好就行了，我这里采用的 ESXi 版本是 VMware ESXi 6.7.0 Update 3，其他版本应该也是通用的。\n准备工作 ESXi 默认是关闭主机 SSH 功能的，但是我们后续会使用到，所以我们首先要去 WEB 后台开启，进入 WEB 后台，打开 管理后，切换到 服务 选项卡，最后找到列表中的 TSM 和 TSM-SSH 服务将其启动，这样 SSH 功能就临时可以用了。\n另外需要修改 ESXi 的默认软件安装策略，否则会阻止软件的安装，进入 WEB 后台后，打开 管理，切换到 安全和用户 选项卡，点击左侧的 接受级别 会弹出软件接受级别的设置，我们将其修改为 社区。\n接着，我们下载 ESXi 平台下的 NUT 客户端软件包（下载地址：NutClient-ESXi），将下载好的软件包上传到 ESXi 的 /tmp 目录待安装使用。\n安装 NUT 客户端 通过 SSH 连接到 ESXi 主机，然后进入到 /tmp 目录后，解压缩 NUT 软件包，最后执行安装脚本 upsmon-install.sh，返回如下的安装信息代表安装成功了。\n1 2 3 4 5 6 7 8 9 $ cd /tmp $ tar -xzvf NutClient-ESXi-2.8.2-2.6.2.x86_64.tar.gz $ sh upsmon-install.sh Installation Result Message: Operation finished successfully. Reboot Required: false VIBs Installed: Margar_bootbank_upsmon_2.8.2-2.6.2 VIBs Removed: VIBs Skipped: 配置 NUT 客户端 NUT 客户端安装成功后，我们返回到 ESXi 的 WEB 后台，打开 管理后，切换到 系统 选项卡，在 高级设置 菜单的右边列表中找到 NUT 相关的设置项，可以直接在右上角的搜索中输入 NUT 进行快速查找，一共有6个参数设置，如果没有，可以尝试重启 ESXi 主机后再看，如下图所示：\n各参数作用说明：\n1 2 3 4 5 6 UserVars.NutFinalDelay：关闭 ESXi 前的等待时间，单位为秒。 UserVars.NutMailTo：接收邮件通知的邮箱地址，如果没有开启邮件通知，这里不用设置。 UserVars.NutPassword：密码，如果没有在群晖上修改过，这里统一填：secret UserVars.NutSendMail：关机前是否发送邮件通知（0：不发送，1：发送） UserVars.NutUpsName：监听的网络 UPS 服务器，例子：ups@192.168.99.10（这里填写你们自己群晖地址） UserVars.NutUser：用户名，如果没有在群晖上修改过，这里统一填：monuser 参数配置完成后，需要重新启动 NutClient 服务，进入 WEB 后台，打开 管理后，切换到 服务 选项卡，找到 NutClient 服务，然后点击上方的 重新启动 按钮，以后每次修改配置参数后，都需要重启该服务，另外需将该服务设置为 随主机启动和停止。\n到这里，我们的 ESXi 服务器已经可以实现断电自动关机了，但是 ESXi 平台上的虚拟机并不会安全的关闭，我们还需要在 ESXi 上设置虚拟机在主机关闭前自动关机，在主机启动后自动开机，前提条件是虚拟机已经安装好了 VMware Tools，设置方法：进入 WEB 后台，打开 管理后，切换到 系统 选项卡，打开左侧的 自动启动 菜单，然后点击最上方的 编辑设置，按下图设置：\n上面的设置只是系统一个总的自动启动停止开关，我们还需要对每台虚拟机进行启用设置，依次点击列表里的虚拟机进行 启用。\n结语 经过以上的配置，我们的 ESXi 主机以及上面的虚拟机都能断电后自动关机了，我最初的设想也得以完美实现，UPS 系列文章也就到此完结，至于 Windows 和 macOS 系统，网上都有第三方的图形客户端，配置也比较简单，大家可以自行研究。。。\u0026#x1f634;\n","permalink":"https://varkai.com/posts/8320366f/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e这篇文章主要讲解 VMware ESXi 下安装 NUT 客户端实现断电自动关机，同样的，NUT 在 ESXi 下也提供了现成的软件包，我们只需要安装并配置好就行了，我这里采用的 ESXi 版本是 VMware ESXi 6.7.0 Update 3，其他版本应该也是通用的。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"准备工作\"\u003e准备工作\u003c/h2\u003e\n\u003cp\u003eESXi 默认是关闭主机 SSH 功能的，但是我们后续会使用到，所以我们首先要去 WEB 后台开启，进入 WEB 后台，打开 \u003ccode\u003e管理\u003c/code\u003e后，切换到 \u003ccode\u003e服务\u003c/code\u003e 选项卡，最后找到列表中的 \u003ccode\u003eTSM\u003c/code\u003e 和 \u003ccode\u003eTSM-SSH\u003c/code\u003e 服务将其启动，这样 SSH 功能就临时可以用了。\u003c/p\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/8320366f/1.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003e另外需要修改 ESXi 的默认软件安装策略，否则会阻止软件的安装，进入 WEB 后台后，打开 \u003ccode\u003e管理\u003c/code\u003e，切换到 \u003ccode\u003e安全和用户\u003c/code\u003e 选项卡，点击左侧的 \u003ccode\u003e接受级别\u003c/code\u003e 会弹出软件接受级别的设置，我们将其修改为 \u003ccode\u003e社区\u003c/code\u003e。\u003c/p\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/8320366f/2.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003e接着，我们下载 ESXi 平台下的 NUT 客户端软件包（下载地址：\u003ca href=\"http://rene.margar.fr/download/1483/\"\u003eNutClient-ESXi\u003c/a\u003e），将下载好的软件包上传到 ESXi 的 \u003ccode\u003e/tmp\u003c/code\u003e 目录待安装使用。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"安装-nut-客户端\"\u003e安装 NUT 客户端\u003c/h2\u003e\n\u003cp\u003e通过 SSH 连接到 ESXi 主机，然后进入到 \u003ccode\u003e/tmp\u003c/code\u003e 目录后，解压缩 NUT 软件包，最后执行安装脚本 \u003ccode\u003eupsmon-install.sh\u003c/code\u003e，返回如下的安装信息代表安装成功了。\u003c/p\u003e","title":"VMware ESXi 使用 NUT 实现断电自动关机"},{"content":"前言 在前面 《群晖和UPS的联姻》 中，我们完成了群晖连接 UPS 并实现了断电自动关机，同时也启用了网络 UPS 服务器，但这也只限于和 UPS 直接连接的群晖，其他局域网中的服务器还无法监控 UPS 的状态，前面提到，服务器上安装 NUT 客户端软件就能实现，所以这一回主要讲解如何在 Linux 系统下安装 NUT 客户端软件并实现断电自动关机。\n我这里使用的 Linux 发行版是 Ubuntu server 20.04 LTS，所以 Debian 系的发行版安装配置都是一样的，其他的发行版操作大同小异。\n准备工作 首先我们需要先进到群晖 WEB 后台，依次打开 控制面板 - 硬件和电源，切换到 不断电系统 选项卡，找到 启用网络 UPS 服务器，确保已经勾选，接着点击下方的 允许的 DiskStation 设备， 这时会弹出一个输入 IP 的对话框，这里填写的 IP 地址是局域网其他需要网络监控 UPS 状态的服务器 IP 地址，只有在这里列出的 IP 地址所对应的服务器才能实现网络监控，这里最多支持5台服务器，我这里 Ubuntu server 的 IP 是 192.168.98.210，我们把它填进去后点击确认就行了。\n安装 NUT 客户端 NUT 提供了源码，我们可以直接源码编译安装，但太麻烦了，而且基本上各大发行版的软件仓库都有现成的包，所以我们直接用 apt 安装就行了。\n1 $ sudo apt install nut-client 安装好后，我们可以检查下是否安装成功，在终端执行 upsc ups@192.168.99.10 后，如果能够显示网络 UPS 的详细信息则代表安装成功了，其中 192.168.99.10 是网络 UPS 服务器的 IP 地址，在这里也就是群晖的 IP 地址。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 $ upsc ups@192.168.99.10 Init SSL without certificate database battery.charge: 100 battery.charge.low: 10 battery.charge.warning: 50 battery.date: 2001/09/25 battery.mfr.date: 2020/02/07 battery.runtime: 1600 battery.runtime.low: 120 battery.type: PbAc battery.voltage: 13.6 battery.voltage.nominal: 12.0 device.mfr: American Power Conversion device.model: Back-UPS RS 550G device.serial: 4B2006P24872 device.type: ups driver.name: usbhid-ups driver.parameter.pollfreq: 30 driver.parameter.pollinterval: 5 driver.parameter.port: auto driver.version: DSM6-2-25364-191230 driver.version.data: APC HID 0.95 driver.version.internal: 0.38 input.sensitivity: medium input.transfer.high: 282 input.transfer.low: 176 input.voltage: 221.0 input.voltage.nominal: 230 ups.beeper.status: enabled ups.delay.shutdown: 20 ups.firmware: 857.L7 .I ups.firmware.aux: L7 ups.load: 19 ups.mfr: American Power Conversion ups.mfr.date: 2020/02/07 ups.model: Back-UPS RS 550G ups.productid: 0002 ups.realpower.nominal: 330 ups.serial: 4B2006P24872 ups.status: OL ups.test.result: No test initiated ups.timer.reboot: 0 ups.timer.shutdown: -1 ups.vendorid: 051d 配置 NUT 客户端 NUT 安装成功之后，还需要一些基本的配置，才能实现网络监控，NUT 的配置文件在 /etc/nut 目录下。\n首先我们找到 nut.conf 文件，将文件中的 MODE=none 修改为 MODE=netclient， 让 NUT 运行在 UPS 客户端模式。\n1 $ sudo sed -i \u0026#34;s/^MODE=.*/MODE=netclient/g\u0026#34; /etc/nut/nut.conf 然后在找到 upsmon.conf 文件，添加监听的 UPS 服务器信息，具体格式如下，一般情况下，我们只需要把 IP 地址修改为自己的 UPS 服务器地址即可，其他默认即可，另外该配置文件中还有一些其他参数，如果没有什么特殊要求，也保持默认即可，如有需要，也可自行去研究各参数的含义，这里就不再赘述了。\n1 2 3 4 5 6 7 # 首先把可能存在的默认配置注释掉，否则会导致 nut-client 服务启动失败 $ sudo sed -i \u0026#34;s/^MONITOR[ \\t]*/#MONITOR /g\u0026#34; /etc/nut/upsmon.conf # 设置 NUT 监听的服务器信息 # 格式：MONITOR ups@{UPS 服务器地址} {可用 UPS 数量} {用户名} {密码} {设备模式} # 例子：MONITOR ups@192.168.99.10 1 monuser secret slave $ sudo sed -i \u0026#39;$a\\MONITOR ups@192.168.99.10 1 monuser secret slave\u0026#39; /etc/nut/upsmon.conf 全部配置好后，最后启动 nut-client 服务，并设置为开机自动启动服务。\n1 2 3 4 # 启动 nut-client 服务 $ sudo systemctl start nut-client # 设置开机自启动 $ sudo systemctl enable nut-client 结语 到这里，我们就已经完成了局域网 Linux 服务器监控网络 UPS 服务器状态和断电自动关机，下一回将讲解 VMware ESXi 如何通过 NUT 监控网络 UPS实现断电关机。。。\u0026#x1f634;\n","permalink":"https://varkai.com/posts/f5bf0730/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在前面 \u003ca href=\"/posts/0e7551f9\"\u003e《群晖和UPS的联姻》\u003c/a\u003e 中，我们完成了群晖连接 UPS 并实现了断电自动关机，同时也启用了网络 UPS 服务器，但这也只限于和 UPS 直接连接的群晖，其他局域网中的服务器还无法监控 UPS 的状态，前面提到，服务器上安装 NUT 客户端软件就能实现，所以这一回主要讲解如何在 Linux 系统下安装 NUT 客户端软件并实现断电自动关机。\u003c/p\u003e\n\u003cp\u003e我这里使用的 Linux 发行版是 Ubuntu server 20.04 LTS，所以 Debian 系的发行版安装配置都是一样的，其他的发行版操作大同小异。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"准备工作\"\u003e准备工作\u003c/h2\u003e\n\u003cp\u003e首先我们需要先进到群晖 WEB 后台，依次打开 \u003ccode\u003e控制面板\u003c/code\u003e - \u003ccode\u003e硬件和电源\u003c/code\u003e，切换到 \u003ccode\u003e不断电系统\u003c/code\u003e 选项卡，找到 \u003ccode\u003e启用网络 UPS 服务器\u003c/code\u003e，确保已经勾选，接着点击下方的 \u003ccode\u003e允许的 DiskStation 设备\u003c/code\u003e， 这时会弹出一个输入 IP 的对话框，这里填写的 IP 地址是局域网其他需要网络监控 UPS 状态的服务器 IP 地址，只有在这里列出的 IP 地址所对应的服务器才能实现网络监控，这里最多支持5台服务器，我这里 Ubuntu server 的 IP 是 192.168.98.210，我们把它填进去后点击确认就行了。\u003c/p\u003e\n\u003cfigure class=\"align-center \"\u003e\n    \u003cimg loading=\"lazy\" src=\"/images/f5bf0730/1.png#center\"/\u003e \n\u003c/figure\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"安装-nut-客户端\"\u003e安装 NUT 客户端\u003c/h2\u003e\n\u003cp\u003eNUT 提供了源码，我们可以直接源码编译安装，但太麻烦了，而且基本上各大发行版的软件仓库都有现成的包，所以我们直接用 apt 安装就行了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sudo apt install nut-client\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e安装好后，我们可以检查下是否安装成功，在终端执行 \u003ccode\u003eupsc ups@192.168.99.10\u003c/code\u003e 后，如果能够显示网络 UPS 的详细信息则代表安装成功了，其中 \u003ccode\u003e192.168.99.10\u003c/code\u003e 是网络 UPS 服务器的 IP 地址，在这里也就是群晖的 IP 地址。\u003c/p\u003e","title":"Linux 下使用 NUT 实现断电自动关机"},{"content":"前言 之前公司停过几次电，虽然公司机房配有 UPS（不断电系统）和停电电话报警系统，但是停电时间无法确定，也没办法保证不漏接报警电话，所以机房里面的服务器设备还是存在很大的意外断电隐患，所以比较理想的方式就是市电断开后，所有的服务器实现自动关机，经过大量的查阅资料，然后经过反复的测试，最终得以应用到机房中，进一步保障了设备的安全，也因此有了这一系列文章。\nNUT 介绍 NUT 是 Network UPS Tools 的简称，它是一款非常强大的网络 UPS 监控工具，支持大多数的 UPS 设备，包括：APC、Belkin、Best Power、MGE、Tripp-Lite 等，而且它还支持作为监控服务器模式，这样不仅能监控本地连接的 UPS 设备状态，局域网内的其他设备安装该软件的客户端后，不仅可以获得监控服务器所连接的 UPS 状态，也能接收到断电信息，及时的进行自动关机操作，最棒的是，该软件是免费开源的，在 Windows、Linux、Mac 以及 ESXi 平台都能使用，而知名的 NAS 制造商群晖（Synology）和威联通（QNAP）都直接原生集成了该软件，而我前面的设想都基于该软件实现。\nUPS 监控服务器 这篇文章主要是介绍如何搭建一台 UPS 监控服务器，所需条件：\n一台支持能和计算机通讯并且支持断电通知的 UPS。 因为机房的旧 UPS 不支持与计算机通讯，所以又买了一台 APC BR550G-CN，基本上 APC 家的大部分 UPS 都能很好的支持。\n一台安装了监控 UPS 状态软件（NUT）的主机。 公司有一台群晖 NAS，而群晖系统本身就集成了 NUT 软件。\n原来这台群晖是接入到旧的 UPS 的，现在只需要将群晖电源插入新的 UPS，然后将 APC 附赠的 RJ 网卡转 USB 数据线，RJ 插口一头插入 APC 的数据口，USB 插头插入群晖的 USB 口，这样就可以通过群晖监控 UPS 状态了。\n登录群晖 WEB 后台后，依次打开 控制面板 - 硬件和电源，切换到 不断电系统 选项卡，首先必须勾选 启用 UPS 支持，群晖才能和 UPS 联动，然后下面有三个选项：\nDiskStation 进入\u0026quot;安全模式\u0026quot;之前的等待时间 如果不勾选，群晖会等到 UPS 电量快耗尽的时候进入安全模式，勾选，则需要设置一个进入安全模式的等待时间。\n当系统进入安全模式时将不断电系统关机 这个是群晖进入安全模式后发送关机命令给群晖，告诉 UPS，我已经很安全了，你可以把自己关了。\n启用网络 UPS 服务器 这个是这个系列文章的重点，通过它，我们可以管理其他装有 NUT 客户端的服务器，实现局域网 UPS 状态监控并联动关机。这里先勾选上，后续的文章再进行实际的应用介绍。\n点击界面上的 设备信息 可以查询到 UPS 的详细信息，如下图所示：\n最后切换到 常规 选项卡，将 电源自动回复 下的 修复电源问题后自动重新启动 勾选，这样来电后，群晖就能自动开机了，另外如果需要网络唤醒（WOL），则勾选相应的选项即可。\n结语 到这里，我们就已经实现了断电后群晖自动关机，来电后自动开机的功能，并把群晖作为一台网络 UPS 服务器，至于其他服务器怎么安装 NUT 客户端和群晖通讯实现自动关机，我会在接下来的文章中娓娓道来，其中包括 Linux、Windows 以及 ESXi 这三个平台的实现。。。\u0026#x1f634;\n","permalink":"https://varkai.com/posts/0e7551f9/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e之前公司停过几次电，虽然公司机房配有 UPS（不断电系统）和停电电话报警系统，但是停电时间无法确定，也没办法保证不漏接报警电话，所以机房里面的服务器设备还是存在很大的意外断电隐患，所以比较理想的方式就是市电断开后，所有的服务器实现自动关机，经过大量的查阅资料，然后经过反复的测试，最终得以应用到机房中，进一步保障了设备的安全，也因此有了这一系列文章。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"nut-介绍\"\u003eNUT 介绍\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://networkupstools.org/\"\u003eNUT\u003c/a\u003e 是 Network UPS Tools 的简称，它是一款非常强大的网络 UPS 监控工具，支持大多数的 UPS 设备，包括：APC、Belkin、Best Power、MGE、Tripp-Lite 等，而且它还支持作为监控服务器模式，这样不仅能监控本地连接的 UPS 设备状态，局域网内的其他设备安装该软件的客户端后，不仅可以获得监控服务器所连接的 UPS 状态，也能接收到断电信息，及时的进行自动关机操作，最棒的是，该软件是免费开源的，在 Windows、Linux、Mac 以及 ESXi 平台都能使用，而知名的 NAS 制造商群晖（Synology）和威联通（QNAP）都直接原生集成了该软件，而我前面的设想都基于该软件实现。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"ups-监控服务器\"\u003eUPS 监控服务器\u003c/h2\u003e\n\u003cp\u003e这篇文章主要是介绍如何搭建一台 UPS 监控服务器，所需条件：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e一台支持能和计算机通讯并且支持断电通知的 UPS。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e因为机房的旧 UPS 不支持与计算机通讯，所以又买了一台 APC BR550G-CN，基本上 APC 家的大部分 UPS 都能很好的支持。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e一台安装了监控 UPS 状态软件（NUT）的主机。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e公司有一台群晖 NAS，而群晖系统本身就集成了 NUT 软件。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e原来这台群晖是接入到旧的 UPS 的，现在只需要将群晖电源插入新的 UPS，然后将 APC 附赠的 RJ 网卡转 USB 数据线，RJ 插口一头插入 APC 的数据口，USB 插头插入群晖的 USB 口，这样就可以通过群晖监控 UPS 状态了。\u003c/p\u003e\n\u003cp\u003e登录群晖 WEB 后台后，依次打开 \u003ccode\u003e控制面板\u003c/code\u003e - \u003ccode\u003e硬件和电源\u003c/code\u003e，切换到 \u003ccode\u003e不断电系统\u003c/code\u003e 选项卡，首先必须勾选 \u003ccode\u003e启用 UPS 支持\u003c/code\u003e，群晖才能和 UPS 联动，然后下面有三个选项：\u003c/p\u003e","title":"群晖和 UPS 的联姻"},{"content":"前言 从 Oracle Database 10g 开始提供了新的导出导入工具-数据泵，expdp 和 impdp 分别对应导出和导入命令，我们先看看它的主要特性：\n支持并行处理导入、导出任务。 支持暂停和重启动导入、导出任务。 支持通过 Database Link 的方式导出或导入远端数据库中的对象。 支持在导入时通过 Remap_schema、Remap_datafile、Remap_tablespace 几个参数实现导入过程中自动修改对象属主、 数据文件或数据所在表空间。 导入/导出时提供了非常细粒度的对象控制。通过 Include、Exclude 两个参数，甚至可以详细制定是否包含或不包含某个对象。 下面是 expdp/impdp 和 exp/imp 的区别：\nexp 和 imp 是客户端工具程序，它们既可以在客户端使用，也可以在服务端使用。 expdp 和 impdp 是服务端的工具程序，他们只能在 Oracle 服务端使用，不能在客户端使用。 imp 只适用于 exp 导出的文件，不适用于 expdp 导出文件，impdp 只适用于 expdp 导出的文件，而不适用于 exp 导出文件。 对于 Oracle Database 10g 以上的服务器，使用 exp 通常不能导出0行数据的空表，而此时必须使用 expdp 导出。 创建导出导入目录 首先我们需要在数据库服务器上创建一个用来保存导出文件的目录，我这里设置为 oracle 用户目录下的 dmp 目录，绝对路径为 /home/oracle/dmp，使用 oracle 用户登入服务器并创建该目录：\n1 $ mkdir ~/dmp 然后进入 sqlplus 环境：\n1 $ sqlplus /nolog 使用 SYSDBA 连接到数据库\n1 SQL\u0026gt; CONN /AS SYSDBA 创建数据库逻辑目录：\n1 SQL\u0026gt; CREATE DIRECTORY DATA_DUMP_DIR AS \u0026#39;/home/oracle/dmp\u0026#39;; 使用以下语句可以查询所有的逻辑目录：\n1 SQL\u0026gt; SELECT * FROM DBA_DIRECTORIES; 给指定用户赋予在该目录的操作权限，比如我这里授权给 MIAERP 用户：\n1 SQL\u0026gt; GRANT READ, WRITE ON DIRECTORY DATA_DUMP_DIR TO MIAERP; expdp 导出 使用 oracle 用户执行以下命令，使用 expdp 导出数据，有大概以下几种不同的方式：\n全量导出： 1 $ expdp system/passwd@orcl dumpfile=expdp.dmp directory=data_dump_dir full=y logfile=expdp.log; 导出指定用户，其中 schemas 指定需要导出的用户： 1 $ expdp system/passwd@orcl schemas=导出的用户名 dumpfile=expdp.dmp directory=data_dump_dir logfile=expdp.log; 导出指定表空间，其中 tablespace 指定需要导出的表空间，多个表空间使用逗号隔开： 1 $ expdp system/passwd@orcl tablespace=tbs1,tbs2 dumpfile=expdp.dmp directory=data_dump_dir logfile=expdp.log; 导出指定表，其中 tables 指定需要导出的表，多个表使用逗号隔开： 1 $ expdp system/passwd@orcl tables=table1,table2 dumpfile=expdp.dmp directory=data_dump_dir logfile=expdp.log; impdp 导入 首先参照上面的 创建导出导入目录 章节，在需要导入数据的目标服务器上创建好相应的目录，然后将需要导入的 dmp 文件上传到该目录。\n使用 oracle 用户执行以下命令，使用 impdp 导入数据，主要有以下几种方式：\n全量导入： 1 $ impdp system/passwd@orcl dumpfile=impdp.dmp directory=data_dump_dir full=y logfile=impdp.log; 导入指定用户： 导入到指定用户又分为下面几种情况：\n导入的用户已经存在，并且导入用户名和导出的用户名不一致： 1 $ impdp system/passwd@orcl schemas=导出用户名 dumpfile=impdp.dmp directory=data_dump_dir remap_schema=导出用户名:导入用户名 exclude=user logfile=impdp.log; 导入的用户不存在： 此时 user2 用户会自动建立，其权限和使用的表空间与 user1 用户相同，但此时 user2 无法登入，必须修改密码。\n1 $ impdp system/passwd@orcl dumpfile=impdp.dmp directory=data_dump_dir remap_schema=导出用户名:导入用户名 logfile=impdp.log; 导入的用户已经存在，并且导入用户名和导出的用户名一致： 1 $ impdp system/passwd@orcl dumpfile=impdp.dmp directory=data_dump_dir schemas=导入用户名 logfile=impdp.log; 导入指定表： 1 $ impdp system/passwd@orcl tables=导出用户名.table1,导出用户名.table2 dumpfile=impdp.dmp directory=data_dump_dir remap_schema=导出用户名:导入用户名 logfile=impdp.log; 导入指定表空间： 1 $ impdp system/passwd@orcl tablespaces=tbs1,tbs2 dumpfile=impdp.dmp directory=data_dump_dir logfile=impdp.log; ","permalink":"https://varkai.com/posts/2454662a/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e从 Oracle Database 10g 开始提供了新的导出导入工具-数据泵，expdp 和 impdp 分别对应导出和导入命令，我们先看看它的主要特性：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e支持并行处理导入、导出任务。\u003c/li\u003e\n\u003cli\u003e支持暂停和重启动导入、导出任务。\u003c/li\u003e\n\u003cli\u003e支持通过 Database Link 的方式导出或导入远端数据库中的对象。\u003c/li\u003e\n\u003cli\u003e支持在导入时通过 Remap_schema、Remap_datafile、Remap_tablespace 几个参数实现导入过程中自动修改对象属主、 数据文件或数据所在表空间。\u003c/li\u003e\n\u003cli\u003e导入/导出时提供了非常细粒度的对象控制。通过 Include、Exclude 两个参数，甚至可以详细制定是否包含或不包含某个对象。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e下面是 expdp/impdp 和 exp/imp 的区别：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eexp 和 imp 是客户端工具程序，它们既可以在客户端使用，也可以在服务端使用。\u003c/li\u003e\n\u003cli\u003eexpdp 和 impdp 是服务端的工具程序，他们只能在 Oracle 服务端使用，不能在客户端使用。\u003c/li\u003e\n\u003cli\u003eimp 只适用于 exp 导出的文件，不适用于 expdp 导出文件，impdp 只适用于 expdp 导出的文件，而不适用于 exp 导出文件。\u003c/li\u003e\n\u003cli\u003e对于 Oracle Database 10g 以上的服务器，使用 exp 通常不能导出0行数据的空表，而此时必须使用 expdp 导出。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"label1\"\u003e创建导出导入目录\u003c/h2\u003e\n\u003cp\u003e首先我们需要在数据库服务器上创建一个用来保存导出文件的目录，我这里设置为 \u003ccode\u003eoracle\u003c/code\u003e 用户目录下的 \u003ccode\u003edmp\u003c/code\u003e 目录，绝对路径为 \u003ccode\u003e/home/oracle/dmp\u003c/code\u003e，使用 \u003ccode\u003eoracle\u003c/code\u003e 用户登入服务器并创建该目录：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ mkdir ~/dmp\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e然后进入 \u003ccode\u003esqlplus\u003c/code\u003e 环境：\u003c/p\u003e","title":"Oracle 使用数据泵进行数据导出导入"},{"content":"前言 之前工作数据库一直使用的 Oracle Database 11g，所使用的系统是 Oracle Linux 6，鉴于两者都比较老旧，而且都停止维护支持了，所以今后再部署数据库，肯定会使用较新的系统和数据库，于是这一阵先在虚拟机里折腾折腾，把安装文档整理出来，方便以后安装部署，下面是我的安装环境：\n虚拟机软件：VMware Workstation 15 Pro 虚拟机：Oracle Linux 7.8 数据库：Oracle Database 12c Release 2\n下面是安装 Oracle 12c 数据库对系统的一些关键要求：\n分类 要求 内存 至少1GB /tmp 目录 至少1GB swap 分区 内存在1GB到2GB之间：大小为内存的1.5倍内存在2GB到16GB之间：大小和内存大小一致内存大于16GB：大小为16GB 安装环境配置 首先通过 SSH 连接或者本地登入到 Oracle Linux 系统，以下命令执行用户除非特别指出，默认为 root 用户。\n配置 hosts 和 network 这里需要在 /etc/hosts 文件中添加一行主机 IP 指向 HOSTNAME 的一行记录，另外需要在 /etc/sysconfig/network 文件中添加一行 HOSTNAME 的变量，如果这里不设置，数据库安装过程中的网络配置会报错。\n查看主机 HOSTNAME： 1 2 $ hostname oracle-test 在 /etc/hosts 文件末尾添加一行主机 IP 指向 HOSTNAME 的一行记录： 1 $ sed -i \u0026#39;$a\\192.168.98.210 oracle-test\u0026#39; /etc/hosts 在 /etc/sysconfig/network 文件末尾添加一行 HOSTNAME 的变量： 1 $ sed -i \u0026#39;$a\\HOSTNAME=oracle-test\u0026#39; /etc/sysconfig/network 扩容 /dev/shm 1 2 3 4 5 # 调整 tmpfs 大小，size 可以设置为物理内存大小 $ vim /etc/fstab tmpfs /dev/shm tmpfs defaults,size=8G 0 0 # 重新挂载让设置生效 $ mount -o remount /dev/shm 安装 Oracle 预安装检测包 Oracle 官方提供了一个名为 oracle-database-server-12cR2-preinstall 的 RPM 包来进行安装前的系统依赖安装检测，系统参数设定、oracle 用户建立等工作，省去了手工配置的繁琐，强烈推荐使用，直接通过 yum 安装即可：\n1 $ yum install oracle-database-server-12cR2-preinstall 安装完成后，使系统参数生效：\n1 $ sysctl -p 现在 oracle 用户已经帮我们建立，只需要修改下密码就可以了：\n1 $ passwd oracle 创建 Oracle 数据库安装目录 1 2 3 4 # Oracle 数据库安装基目录 $ mkdir -p /u01/app/oracle # Oracle 数据库软件包解压目录 $ mkdir -p /u01/app/oracle/oracle-software 配置 oracle 用户的环境变量 修改 oracle 用户的环境变量文件 /home/oracle/.bashrc：\n1 $ vim /home/oracle/.bashrc 在文件末尾添加如下内容：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 # Oracle 主机名 export ORACLE_HOSTNAME=oracle-test # Oracle 数据库安装基目录 export ORACLE_BASE=/u01/app/oracle # Oracle 数据库安装目录 export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/dbhome_1 # Oracle 数据库实例名 export ORACLE_SID=orcl # 添加系统环境变量 export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH # 添加系统环境变量 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib # 设置 Oracle 客户端字符集 export NLS_LANG=\u0026#39;AMERICAN_AMERICA.AL32UTF8\u0026#39; 使环境变量生效：\n1 $ source /home/oracle/.bashrc 配置防火墙 可以直接禁用防火墙，并关闭开机自启：\n1 2 3 4 # 关闭防火墙 $ systemctl stop firewalld.service # 关闭开机自启 $ systemctl disable firewalld.service 为了安全，不建议执行以上操作，更合理的做法是防火墙放通 Oracle 所需的端口（默认是 1521）：\n1 $ firewall-cmd --zone=public --add-port=1521/tcp --permanent 重新加载防火墙：\n1 $ firewall-cmd --reload 查看端口号是否开启\n1 2 $ firewall-cmd --zone=public --query-port=1521/tcp yes 关闭 selinux，将 SELINUX=enforcing 改为 SELINUX=disabled：\n1 $ sed -i \u0026#34;s/^SELINUX=.*/SELINUX=disabled/\u0026#34; /etc/selinux/config 关闭 selinux 需重启系统才能生效：\n1 $ reboot 开始安装 首先将 Oracle 安装文件上传到系统的 /tmp 目录，然后将文件解压到之前建立的 Oracle 软件包目录：\n1 $ unzip /tmp/linuxx64_12201_database.zip -d /u01/app/oracle/oracle-software 然后把 /u01/app/ 目录下的所有文件和文件夹的拥有者更改为指定的用户和组：\n1 $ chown -R oracle:oinstall /u01/app/ 使用 oracle 用户登入到系统图形化界面，然后进入到软件安装文件目录，执行 runInstaller 文件进行安装：\n1 2 3 4 # 进入安装目录 $ cd /u01/app/oracle/oracle-software/database/ # 执行安装 $ ./runInstaller 此时，系统会弹出 Oracle 的图形化安装界面，安装步骤如下：\n取消勾选 我希望通过 My Oracle Support 接收安全更新。，点击 下一步： 1-1. 在弹出的确认框中选择 是：\n选择 创建和配置数据库，点击 下一步： 选择 服务器类，点击 下一步： 选择 单实例数据库安装，点击 下一步： 选择 高级安装，点击 下一步： 选择 企业版，点击 下一步： 数据库安装路径设置，默认即可，点击 下一步： 产品清单路径设置，默认即可，点击 下一步： 选择 一般用途/事务处理，点击 下一步： 全局数据库名和 SID 设置，取消勾选 创建为容器数据库，点击 下一步： 配置选项，首先根据自身情况调整分配给数据库的内存比例，然后点击 字符集 选项卡： 11-1. 根据自身情况选择相应的数据库字符集，点击 下一步：\n数据库存储设置，默认即可，点击 下一步： 集中管理选项，默认为不使用，点击 下一步： 恢复选项，默认为不使用恢复，如果有需要，可以安装完成后配置，点击 下一步： 数据库管理员账户密码设置，这里选择 对所有账户使用相同的口令，密码强度要求为必须同时包含大写字母，小写字母和数字，点击 下一步： 操作系统组设置，默认即可，点击 下一步： 这里会对数据库的安装先决条件进行检查，如果不通过，则会列出所有不满足的条件，如果通过，则会自动进入下一步： 这里会列出数据库安装设置的概要，确认无误后，点击 安装： 数据库开始进行安装： 19-1. 安装过程中，会弹出一个 执行配置脚本 的对话框：\n根据对话框提示，使用 root 用户执行对话框中列出的两个文件，执行过程中如有对话选项，一路回车即可：\n1 2 3 4 5 $ cd /u01/app/oraInventory/ $ ./orainstRoot.sh $ cd /u01/app/oracle/product/12.2.0/dbhome_1/ $ ./root.sh 两个脚本都执行完成后，回到安装界面，点击 执行配置脚本 对话框中的 确定 继续进行安装。\n到这里数据库就安装好了，而且监听和数据库都已经帮我们配置好了，最后点击 关闭 按钮结束安装： 安装后的配置 兼容性设置 在使用旧版本的客户端驱动连接 Oracle 12c 数据库报 ORA-28040 没有匹配的认证协议 错误，我们需要在数据库服务器端 $ORACLE_HOME/network/admin/sqlnet.ora 文件中添加一行 SQLNET.ALLOWED_LOGON_VERSION=8 配置，允许旧版本的驱动连接：\n1 $ sed -i \u0026#39;$a\\SQLNET.ALLOWED_LOGON_VERSION=8\u0026#39; /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/sqlnet.ora Oracle 自动启动和关闭 Oracle 数据库默认不是开机自动启动的，需要额外的配置。\n首先修改 /etc/oratab 文件，找到文件中的 orcl:/u01/app/oracle/product/12.2.0/dbhome_1:N 将末尾的 N 修改为 Y：\n1 $ sed -i \u0026#39;s/^orcl:\\/u01\\/app\\/oracle\\/product\\/12.2.0\\/dbhome_1:N/orcl:\\/u01\\/app\\/oracle\\/product\\/12.2.0\\/dbhome_1:Y/\u0026#39; /etc/oratab 接着在 /etc/systemd/system/ 目录下新建 Oracle 服务的启动配置文件 oracle-rdbms.service：\n1 $ touch /etc/systemd/system/oracle-rdbms.service 然后编辑 oracle-rdbms.service 文件，将以下内容复制到该文件后保存退出：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # /etc/systemd/system/oracle-rdbms.service # Invoking Oracle scripts to start/shutdown Instances defined in /etc/oratab # and starts Listener [Unit] Description=Oracle Database(s) and Listener After=syslog.target network.target [Service] LimitMEMLOCK=infinity LimitNOFILE=65535 Type=oneshot RemainAfterExit=yes User=oracle Environment=\u0026#34;ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1\u0026#34; ExecStart=/u01/app/oracle/product/12.2.0/dbhome_1/bin/dbstart $ORACLE_HOME \u0026gt;\u0026gt; 2\u0026gt;\u0026amp;1 \u0026amp; ExecStop=/u01/app/oracle/product/12.2.0/dbhome_1/bin/dbshut $ORACLE_HOME \u0026gt;\u0026gt; 2\u0026gt;\u0026amp;1 \u0026amp; [Install] WantedBy=multi-user.target 最后设置开机自启动：\n1 $ systemctl enable oracle-rdbms.service 我们可以重启系统后，通过 oracle 用户查看 Oracle 服务进程和监听程序确认自动启动是否设置成功：\n1 2 3 4 5 # 检查 oracle 服务是否启动 $ ps -ef | grep orcl # 检查监听是否启动 $ lsnrctl status 数据库配置 DEFERRED_SEGMENT_CREATION 从 Oracle 11g 开始，数据库有个参数 DEFERRED_SEGMENT_CREATION，当这个参数设置为 true 时，当创建一个表的时候，不会给它马上分配空间，只有向这个表中插入第一条数据的时候才开始分配空间，而使用 exp 导出数据的时候是不会导出没有分配空间的表，使用 expdp 就不会受到影响，所以这里把这个参数设置为 false，让新建的表都马上分配空间。\n首先使用 oracle 用户登入系统，进入 sqlplus 环境：\n1 $ sqlplus /nolog 使用管理员连接到数据库：\n1 SQL\u0026gt; CONN /AS SYSDBA 查看数据库当前空间分配设置，默认为 TRUE：\n1 2 3 4 5 SQL\u0026gt; SHOW PARAMETER DEFERRED_SEGMENT_CREATION; NAME\tTYPE\tVALUE ------------------------------------ ----------- ------------------------------ deferred_segment_creation\tboolean\tTRUE 将 DEFERRED_SEGMENT_CREATION 参数设置为 FALSE：\n1 SQL\u0026gt; ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE; DB_SECUREFILE DB_SECUREFILE 参数必须初始化配置，否则使用低版本 dmp 文件导入数据时会报错：\n1 SQL\u0026gt; ALTER SYSTEM SET DB_SECUREFILE=PERMITTED SCOPE=BOTH; PROCESSES PROCESSES 参数控制数据库允许的最大连接数，可以根据自身情况进行修改：\n1 SQL\u0026gt; ALTER SYSTEM SET PROCESSES = 500 SCOPE = SPFILE; PASSWORD_LIFE_TIME PASSWORD_LIFE_TIME 参数是数据库用户的密码有效期策略，默认为密码180天过期。\n首先查看用户的配置文件是哪个，一般是 DEFAULT\n1 SQL\u0026gt; SELECT USERNAME,PROFILE FROM DBA_USERS; 查看指定配置文件（如 DEFAULT）的密码有效期设置：\n1 SQL\u0026gt; SELECT * FROM DBA_PROFILES S WHERE S.PROFILE=\u0026#39;DEFAULT\u0026#39; AND RESOURCE_NAME=\u0026#39;PASSWORD_LIFE_TIME\u0026#39;; 将密码有效期由默认的180天修改成无限制：\n1 SQL\u0026gt; ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 最后重启数据库：\n1 2 SQL\u0026gt; SHUTDOWN IMMEDIATE; SQL\u0026gt; STARTUP; ","permalink":"https://varkai.com/posts/9095ce34/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e之前工作数据库一直使用的 Oracle Database 11g，所使用的系统是 Oracle Linux 6，鉴于两者都比较老旧，而且都停止维护支持了，所以今后再部署数据库，肯定会使用较新的系统和数据库，于是这一阵先在虚拟机里折腾折腾，把安装文档整理出来，方便以后安装部署，下面是我的安装环境：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e虚拟机软件：VMware Workstation 15 Pro\u003c!-- raw HTML omitted --\u003e\n虚拟机：Oracle Linux 7.8\u003c!-- raw HTML omitted --\u003e\n数据库：Oracle Database 12c Release 2\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e下面是安装 Oracle 12c 数据库对系统的一些关键要求：\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth style=\"text-align: left\"\u003e分类\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003e要求\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003e内存\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e至少1GB\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003e/tmp\u003c/code\u003e 目录\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e至少1GB\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eswap\u003c/code\u003e 分区\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e内存在1GB到2GB之间：大小为内存的1.5倍\u003c!-- raw HTML omitted --\u003e内存在2GB到16GB之间：大小和内存大小一致\u003c!-- raw HTML omitted --\u003e内存大于16GB：大小为16GB\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"安装环境配置\"\u003e安装环境配置\u003c/h2\u003e\n\u003cp\u003e首先通过 SSH 连接或者本地登入到 Oracle Linux 系统，以下命令执行用户除非特别指出，默认为 root 用户。\u003c/p\u003e\n\u003ch3 id=\"配置-hosts-和-network\"\u003e配置 hosts 和 network\u003c/h3\u003e\n\u003cp\u003e这里需要在 \u003ccode\u003e/etc/hosts\u003c/code\u003e 文件中添加一行主机 IP 指向 HOSTNAME 的一行记录，另外需要在 \u003ccode\u003e/etc/sysconfig/network\u003c/code\u003e 文件中添加一行 \u003ccode\u003eHOSTNAME\u003c/code\u003e 的变量，如果这里不设置，数据库安装过程中的网络配置会报错。\u003c/p\u003e","title":"Oracle Linux 7 安装 Oracle Database 12c"},{"content":"我们有时候需要整理 Git 提交记录，让仓库成为一个干净的新仓库，经过大量网上搜寻以及自己的反复测试，步骤如下：\n首先创建一个新的分支 1 $ git checkout --orphan latest_branch 然后把所有文件添加到Git仓库 1 $ git add -A 提交更改 1 $ git commit -am \u0026#34;commit message\u0026#34; 删除主分支 1 $ git branch -D master 重命名当前分支为主分支 1 $ git branch -m master 最后强制更新远程仓库 1 $ git push -f origin master ","permalink":"https://varkai.com/posts/380d8302/","summary":"\u003cp\u003e我们有时候需要整理 Git 提交记录，让仓库成为一个干净的新仓库，经过大量网上搜寻以及自己的反复测试，步骤如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e首先创建一个新的分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ git checkout --orphan latest_branch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e然后把所有文件添加到Git仓库\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ git add -A\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e提交更改\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ git commit -am \u003cspan class=\"s2\"\u003e\u0026#34;commit message\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e删除主分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ git branch -D master\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e重命名当前分支为主分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ git branch -m master\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003e最后强制更新远程仓库\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ git push -f origin master\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"Git 仓库删除所有提交历史记录"},{"content":"前言 Oracle 数据库在数据出错时可以使用 重做日志 (Redo Log)进行恢复，重做日志分为两部分：\n在线重做日志文件 (Online Redo Log Files) 归档日志文件 (Archive Redo Log Files) 这里主要说一下归档日志 (Archive Log)，在线重做日志大小毕竟是有限的，当都写满了的时候，就面临着2个选择，第一个就是把以前在线重做日志从头擦除开始继续写，第二种就是把以前的在线重做日志先进行备份，然后对被备份的日志擦除开始写新的在线 Redo Log，数据库如果采用这种生成归档日志的模式的话，就是归档日志模式 (ARCHIVELOG)，反之如果不生成归档日志，就是非归档日志模式 (NOARCHIVELOG)。\nOracle 数据库默认采用的是非归档模式，假如说一共有三个重做日志组，当三个日志组全部写满之后将从第一个日志组开始循环记录，并且第一个日志组中的内容将被彻底覆盖，这样，如果数据库崩溃了，就没办法恢复很早之前的数据了。而使用归档模式后，这样写入日志循环的时候，会先把日志组中的数据写入到归档日志中，然后才会被覆盖，这样恢复问题就解决了，下面是一些常用的操作。\n改变数据库归档模式 首先使用 oracle 用户登入数据库服务器，然后进入 sqlplus 环境：\n1 $ sqlplus /nolog 使用管理员连接到数据库：\n1 SQL\u0026gt; CONN /AS SYSDBA; 查看当前归档模式，显示为非归档模式：\n1 2 3 4 5 SQL\u0026gt; SELECT LOG_MODE FROM V$DATABASE; LOG_MODE ------------ NOARCHIVELOG 改变归档日志模式前要先关闭数据库：\n1 SQL\u0026gt; SHUTDOWN IMMEDIATE; 数据库以 MOUNT 方式启动：\n1 SQL\u0026gt; STARTUP MOUNT; 启用归档模式：\n1 SQL\u0026gt; ALTER DATABASE ARCHIVELOG; 关闭归档模式：\n1 SQL\u0026gt; ALTER DATABASE NOARCHIVELOG; 最后打开数据库：\n1 SQL\u0026gt; ALTER DATABASE OPEN; 查看归档日志信息：\n1 2 3 4 5 6 7 8 SQL\u0026gt; ARCHIVE LOG LIST; Database log mode\tArchive Mode Automatic archival\tEnabled Archive destination\tUSE_DB_RECOVERY_FILE_DEST Oldest online log sequence 330 Next log sequence to archive 332 Current log sequence\t332 归档路径管理 首先查看默认的归档日志路径：\n1 2 3 4 5 6 SQL\u0026gt; SHOW PARAMETER DB_RECOVERY_FILE_DEST; NAME\tTYPE\tVALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest\tstring\t/data/oracle/flash_recovery_area db_recovery_file_dest_size\tbig integer 4977M Oracle11g 版本，Oracle 默认的日志归档路径为闪回恢复区 ($ORACLE_BASE/flash_recovery_area)。对于这个路径，Oracle 有一个限制，就是默认只有 4G 的空间，而且不只是归档日志的默认路径，也是备份文件和闪回日志的默认地址，所以空间很容易不足，可以通过以下几个方式修改。\n增大闪回空间大小： 1 SQL\u0026gt; ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=8G SCOPE=SPFILE; 修改归档日志存储路径： 1 SQL\u0026gt; ALTER SYSTEM SET LOG_ARCHIVE_DEST_1=\u0026#39;LOCATION=/DATA/ORACLE/ARCHIVE_LOG\u0026#39; SCOPE=SPFILE; 修改归档日志格式：\n1 SQL\u0026gt; ALTER SYSTEM SET LOG_ARCHIVE_FORMAT=\u0026#39;ARCH_%D_%T_%R_%S.ARC\u0026#39; SCOPE=SPFILE; 归档日志清理 随着时间的推移，归档日志可能会占满磁盘空间，这将导致无法连接到数据库，所以需要定期的清理一部分归档日志。那么我们就直接物理删除一些归档日志呗，可是别高兴的太早，在 Oralce 的 Control File 中仍然记录着这些 archivelog 文件的相关信息，当我们手工清除这些文件后，这些记录并没有被我们从 Control File 中清除掉，也就是 Oracle 并不知道这些文件已经不存在了。正确的方法是利用 Oracle 提供的 RMAN 工具进行清理。\n正确删除归档日志的过程 使用 oracle 用户登入数据库服务器，然后进入 rman 环境：\n1 $ rman rman 连接到本地数据库后就可以对归档日志进行清理了：\n1 2 3 4 5 6 7 8 # 连接到本地数据库 RMAN\u0026gt; connect target / # 核对控制文件和实际物理文件 RMAN\u0026gt; crosscheck archivelog all; # 删除失效的归档日志文件，同步控制文件和物理文件信息。 RMAN\u0026gt; delete expired archivelog all; # 删除 7 天前的归档日志 RMAN\u0026gt; delete archivelog all completed before \u0026#39;sysdate-7\u0026#39;; 定时清理归档日志 每次手工清理比较麻烦，而且也容易忘记，可以写一个自动清理脚本，然后利用定时任务定时进行清理。\n首先使用 oracle 用户登入到数据库服务器，然后在 /home/oracle/auto_del_arc/ 目录下新建一个 del_arc.sh 自动清理脚本：\n1 2 3 4 # 在oracle用户目录下新建一个存放脚本和日志的文件夹 $ mkdir /home/oracle/auto_del_arc # 新建脚本文件 $ touch /home/oracle/auto_del_arc/del_arc.sh 然后将以下内容复制到 del_arc.sh 后保存退出：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/bash echo \u0026#34;----------------------------------------`date`---------------------------------------\u0026#34; if [ -f ~/.bash_profile ]; then . ~/.bash_profile fi export Today=`date +%Y%m%d` $ORACLE_HOME/bin/rman target / log=~/auto_del_arc/${Today}.log \u0026lt;\u0026lt;EOF run{ crosscheck archivelog all; delete noprompt expired archivelog all; delete noprompt archivelog all completed before \u0026#39;sysdate - 7\u0026#39;; } exit; EOF echo -e \u0026#34;\\n\u0026#34; echo \u0026#34;------------------------------------ FINISHED ------------------------------------\u0026#34; 赋予清理脚本可执行权限：\n1 $ chmod a+x /home/oracle/auto_del_arc/del_arc.sh 最后使用 oracle 用户把清理脚本添加到定时任务：\n1 2 # 编辑定时任务 $ crontab -e 在文件中添加如下行，代表每天凌晨2点执行清理脚本：\n1 00 02 * * * /home/oracle/auto_del_arc/del_arc.sh ","permalink":"https://varkai.com/posts/f8db08fe/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003eOracle 数据库在数据出错时可以使用 \u003ccode\u003e重做日志 (Redo Log)\u003c/code\u003e进行恢复，重做日志分为两部分：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e在线重做日志文件 (Online Redo Log Files)\u003c/li\u003e\n\u003cli\u003e归档日志文件 (Archive Redo Log Files)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里主要说一下归档日志 (Archive Log)，在线重做日志大小毕竟是有限的，当都写满了的时候，就面临着2个选择，第一个就是把以前在线重做日志从头擦除开始继续写，第二种就是把以前的在线重做日志先进行备份，然后对被备份的日志擦除开始写新的在线 Redo Log，数据库如果采用这种生成归档日志的模式的话，就是归档日志模式 (ARCHIVELOG)，反之如果不生成归档日志，就是非归档日志模式 (NOARCHIVELOG)。\u003c/p\u003e\n\u003cp\u003eOracle 数据库默认采用的是非归档模式，假如说一共有三个重做日志组，当三个日志组全部写满之后将从第一个日志组开始循环记录，并且第一个日志组中的内容将被彻底覆盖，这样，如果数据库崩溃了，就没办法恢复很早之前的数据了。而使用归档模式后，这样写入日志循环的时候，会先把日志组中的数据写入到归档日志中，然后才会被覆盖，这样恢复问题就解决了，下面是一些常用的操作。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"改变数据库归档模式\"\u003e改变数据库归档模式\u003c/h2\u003e\n\u003cp\u003e首先使用 \u003ccode\u003eoracle\u003c/code\u003e 用户登入数据库服务器，然后进入 \u003ccode\u003esqlplus\u003c/code\u003e 环境：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sqlplus /nolog\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e使用管理员连接到数据库：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eSQL\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCONN\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"k\"\u003eAS\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSYSDBA\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e查看当前归档模式，显示为非归档模式：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eSQL\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eLOG_MODE\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eV$DATABASE\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e     \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLOG_MODE\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e------------\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eNOARCHIVELOG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e改变归档日志模式前要先关闭数据库：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eSQL\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSHUTDOWN\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eIMMEDIATE\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e数据库以 \u003ccode\u003eMOUNT\u003c/code\u003e 方式启动：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eSQL\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSTARTUP\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMOUNT\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e启用归档模式：\u003c/p\u003e","title":"Oracle 数据库归档日志详解"},{"content":"今天上午公司 Oracle 数据库连接非常的慢，甚至无法连接，于是决定先重启服务器看问题是否解决，重启后问题依旧，登入服务器查看监听状态，发现一直停留在正在连接状态。\n1 2 3 4 5 6 7 8 $ su - oracle $ lsnrctl status LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 03-4月 -2019 13:58:55 Copyright (c) 1991, 2009, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) 后经网上几番查阅并尝试，发现是服务器配置了公共 DNS，可能公共 DNS 出现了故障，导致连接监听缓慢，把 DNS 配置注释掉后就恢复正常了。\n1 2 3 4 $ vi /etc/resolv.conf # Generated by NetworkManager # nameserver 119.29.29.29 还有一个方法就是修改 sshd 配置文件，将 UseDNS 参数设置为 no，不解析 DNS\n1 2 3 4 $ su - root $ vi /etc/ssh/sshd_config UseDNS no 如果服务器只是内网使用，去掉 DNS 不会有什么影响，如果服务器需要访问外部网络，则必须配置 DNS，最后这种方法即可以保留 DNS 配置也不会对 Oracle 监听产生影响。\n","permalink":"https://varkai.com/posts/5737da7e/","summary":"\u003cp\u003e今天上午公司 Oracle 数据库连接非常的慢，甚至无法连接，于是决定先重启服务器看问题是否解决，重启后问题依旧，登入服务器查看监听状态，发现一直停留在正在连接状态。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ su - oracle\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ lsnrctl status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLSNRCTL \u003cspan class=\"k\"\u003efor\u003c/span\u003e Linux: Version 11.2.0.1.0 - Production on 03-4月 -2019 13:58:55\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCopyright \u003cspan class=\"o\"\u003e(\u003c/span\u003ec\u003cspan class=\"o\"\u003e)\u003c/span\u003e 1991, 2009, Oracle.  All rights reserved.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConnecting to \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eDESCRIPTION\u003c/span\u003e\u003cspan class=\"o\"\u003e=(\u003c/span\u003e\u003cspan class=\"nv\"\u003eADDRESS\u003c/span\u003e\u003cspan class=\"o\"\u003e=(\u003c/span\u003e\u003cspan class=\"nv\"\u003ePROTOCOL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eTCP\u003cspan class=\"o\"\u003e)(\u003c/span\u003e\u003cspan class=\"nv\"\u003eHOST\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003elocalhost\u003cspan class=\"o\"\u003e)(\u003c/span\u003e\u003cspan class=\"nv\"\u003ePORT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e1521\u003cspan class=\"o\"\u003e)))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e后经网上几番查阅并尝试，发现是服务器配置了公共 DNS，可能公共 DNS 出现了故障，导致连接监听缓慢，把 DNS 配置注释掉后就恢复正常了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ vi /etc/resolv.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Generated by NetworkManager\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# nameserver 119.29.29.29\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e还有一个方法就是修改 \u003ccode\u003esshd\u003c/code\u003e 配置文件，将 \u003ccode\u003eUseDNS\u003c/code\u003e 参数设置为 \u003ccode\u003eno\u003c/code\u003e，不解析 DNS\u003c/p\u003e","title":"DNS 引发的 Oracle 数据库监听故障解决"},{"content":"查看内存使用情况 在终端执行 free -h，可以查询系统内存的具体使用情况，可以看到我这里 cached 占用了17G的内存。\n1 2 3 4 5 $ free -h total used free shared buffers cached Mem: 62G 18G 43G 14G 284M 17G -/+ buffers/cache: 1.1G 61G Swap: 31G 0B 31G 释放 cached 为了安全起见，首先使用 sync 命令将系统 buffer 中的数据强制写入硬盘中，然后再执行内存释放命令，其中有3种释放方式，可以根据下方备注选择相应的方式。\n1 2 3 4 5 6 7 8 9 10 11 # 释放 pagecache $ sync $ echo 1 \u0026gt; /proc/sys/vm/drop_caches # 释放 dentries and inodes $ sync $ echo 2 \u0026gt; /proc/sys/vm/drop_caches # 释放 pagecache, dentries and inodes $ sync $ echo 3 \u0026gt; /proc/sys/vm/drop_caches 还原系统默认配置 释放内存后，再将内存释放方式还原成默认。\n1 $ echo 0 \u0026gt; /proc/sys/vm/drop_caches ","permalink":"https://varkai.com/posts/4badafaa/","summary":"\u003ch2 id=\"查看内存使用情况\"\u003e查看内存使用情况\u003c/h2\u003e\n\u003cp\u003e在终端执行 \u003ccode\u003efree -h\u003c/code\u003e，可以查询系统内存的具体使用情况，可以看到我这里 \u003ccode\u003ecached\u003c/code\u003e 占用了17G的内存。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ free -h\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             total       used       free     shared    buffers     cached\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMem:           62G        18G        43G        14G       284M        17G\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-/+ buffers/cache:       1.1G        61G\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSwap:          31G         0B        31G\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"释放-cached\"\u003e释放 cached\u003c/h2\u003e\n\u003cp\u003e为了安全起见，首先使用 \u003ccode\u003esync\u003c/code\u003e 命令将系统 \u003ccode\u003ebuffer\u003c/code\u003e 中的数据强制写入硬盘中，然后再执行内存释放命令，其中有3种释放方式，可以根据下方备注选择相应的方式。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 释放 pagecache\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sync\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u0026gt; /proc/sys/vm/drop_caches\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 释放 dentries and inodes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sync\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u0026gt; /proc/sys/vm/drop_caches\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 释放 pagecache, dentries and inodes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sync\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u0026gt; /proc/sys/vm/drop_caches\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"还原系统默认配置\"\u003e还原系统默认配置\u003c/h2\u003e\n\u003cp\u003e释放内存后，再将内存释放方式还原成默认。\u003c/p\u003e","title":"Linux 系统释放 Cached 内存"}]