数据库备份

lishihuan大约 6 分钟

数据库备份

1. windows系统下的数据库备份脚本

image-20240322093812447
image-20240322093812447

windows 脚本需要先确认一下是不是GB2312

MySQL数据库

MySQL_dbbak.bat

Oracle数据库

Oracle_dbback.bat

简单示例:https://blog.csdn.net/liangmengbk/article/details/130353606open in new window

@echo off
REM 获取当前日期和时间并格式化为YYYYMMDDHHmmss
set datetime=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%

REM 设置导出文件名和日志文件名
SET dumpfile=sdt_zhst_expdp_%datetime%.dmp
SET logfile=sdt_zhst_%datetime%.log
 
expdp sdt_zhst/sdt_zhst@127.0.0.1:1521/orcl directory=DPDATA1 dumpfile="%dumpfile%" logfile=%logfile%

REM 删除3天前的备份文件
FORFILES /P D:\temp  /M sdt_zhst_*.dmp /D -3 /C "cmd /c echo %time% deleting..@file.. &del @file"

其中Oracle数据库 最好采用数据泵导出 expdp/impdp ,导出的文件小,而且快

上面的脚本 需要将备份的文件放在 D:\database_backup\Oracle,则需要先创建 逻辑目录 create directory dpdata1 as 'D:\database_backup\Oracle';

--  创建
create directory dpdata1 as 'D:\database_backup\Oracle';
-- 修改
create or replace directory dpdata1 as 'E:\temp';
-- 删除
drop directory dpdata1;
-- 查看
select * from dba_directories;

注: 其中脚本中 WinRAR 命令,是主机安装了WinRAR并且配置了环境变量才能这样用

对于Oracle导出,设置的文件名比如 sdt_zhst_expdp.dmp --> 会被转为SDT_ZHST_EXPDP.DMP 导致后面找不到文件,比如压缩dmp则会以为找不到文件而被终止(Oracle需要注意的是大小写

如果导出失败提示

mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES

# 解决
CREATE USER 'root'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON yjydxj-cloud.* TO 'root'@'%';
FLUSH PRIVILEGES;

windows中bat脚本常用指令

windows脚本

2. Linux系统下的数据库备份脚本

mysql_bak.sh -- 目前没校验过

3. 数据库异地备份【windows传输到linux服务器上】

通过 scp 的方式进行文件传输实现数据库的备份

具体说明: 数据库服务器上先备份数据库文件,然后通过 scp实现文件传输,实现数据的异地备份

scp 命令用于在远程服务器与本地之间进行安全文件传输

scp /path/to/backup/file user@destination_host:/path/to/destination/directory
## 案例 将本机的D:\data\yjydxj-cloud.sql 文件 备份到192.168.110.130主机下的 home/temp目录下
scp -P 22 D:\data\yjydxj-cloud.sql root@192.168.110.130:/home/temp

scp -r /usr/local/redis/redis_backup.conf 192.168.110.231:/usr/local/redis

说明:

  • scp: 是 Secure Copy 的缩写,用于执行安全的文件复制操作。
  • -P 22: 指定远程服务器的端口号,这里是 22。默认情况下,SSH(Secure Shell)使用 22 端口进行连接。
  • D:\data\yjydxj-cloud.sql: 是本地系统上要传输的文件的路径和文件名。
  • root@192.168.110.130:/home/temp: 是远程服务器的用户名、IP 地址和目标路径。其中,root 是远程服务器的用户名,192.168.110.130 是远程服务器的 IP 地址,/home/temp 是远程服务器上的目标目录路径。

因此,该命令的作用是将本地系统上的 D:\data\yjydxj-cloud.sql 文件通过 SSH 连接到远程服务器,并将文件传输到远程服务器的 /home/temp 目录中。请确保本地文件路径和远程服务器的目标路径是正确的,并且您具有足够的权限执行该操作。

需要注意的是,执行此命令时,您需要在本地系统和远程服务器之间已经建立了 SSH 连接,并且具有适当的身份验证(例如,使用用户名和密码或 SSH 密钥)来进行文件传输。

特别说明

在默认情况下,SCP 命令需要提供远程主机的密码进行身份验证。如果您执行 SCP 命令时没有提供密码,它将提示您输入密码。

如果您希望在执行 SCP 命令时不需要手动输入密码,可以考虑使用 SSH 密钥进行身份验证。SSH 密钥由公钥和私钥组成,您可以将公钥添加到远程主机上的授权列表中,从而允许无密码访问。

使用 SSH 密钥进行无密码访问的一般步骤

需要支持 ssh命令,目前不确定是那个软件支持的,可以将windows下的 C:\Windows\System32\OpenSSH 目录拷贝到目标服务器上,并且配置好环境变量(这时应该会报错提示缺少一个dll脚本,一并拷贝到目标服务器即可)

  • windows安装ssh-client(可以从别的windows复制过去)
  • 生成pub公钥文件(ssh-keygen),并将内容复制到目标服务器的~/.ssh/authorized_keys 中
  • 加快sshd服务响应 /etc/ssh/sshd_config 文件中修改
    • DNS关闭改为no
    • GSSAPIAuthentication改为no

具体步骤

目前测试只用到了前2步,并且没有~/.ssh/authorized_keys 文件,通过创建authorized_keys 文件后实现。同时在 /etc/ssh/sshd_config 中修改了配置用来加快传输

  1. 生成 SSH 密钥对:在您的本地计算机上生成 SSH 密钥对。可以使用 ssh-keygen 命令来生成密钥对。例如:

    ssh-keygen -t rsa
    

    这将生成一个 RSA 密钥对,包括公钥和私钥。 C:\Users\lihuan\.ssh\id_rsa.pub 中的内容

  2. 将公钥复制到远程主机:将生成的公钥(通常是 ~/.ssh/id_rsa.pub 文件内容)复制到远程主机的 ~/.ssh/authorized_keys 文件中

    如果在目标主机上找不到 ~/.ssh/authorized_keys 目录或文件,可能有以下几种情况:

    1. 目录不存在:~/.ssh/ 目录是用于存储 SSH 相关文件的默认目录,包括密钥文件和授权文件。如果目录不存在,您可以手动创建它。

      在目标主机上执行以下命令创建 ~/.ssh/ 目录:

      mkdir -p ~/.ssh
      ## 创建authorized_keys 文件
      touch ~/.ssh/authorized_keys 
      ## 进入authorized_keys 文件将 主机生成的 id_rsa.pub内容粘贴到authorized_keys文件中,保存即可
      vi ~/.ssh/authorized_keys
      
    2. 文件权限问题:目标主机上的 ~/.ssh/ 目录及其文件应具有适当的权限才能正常工作。确保 ~/.ssh/ 目录的权限设置为 700,而 ~/.ssh/authorized_keys 文件的权限设置为 600

      在目标主机上执行以下命令更改权限:

      chmod 700 ~/.ssh
      chmod 600 ~/.ssh/authorized_keys
      
    3. SSH 服务器配置问题:如果您仍然找不到 ~/.ssh/authorized_keys 文件,可能存在 SSH 服务器配置问题。请检查目标主机上的 SSH 服务器配置文件(通常位于 /etc/ssh/sshd_config)中的配置项 AuthorizedKeysFile,确保它指向正确的文件路径。

  3. 配置 SSH 代理:在您的本地计算机上启动 SSH 代理,以便在进行 SSH 连接时自动使用密钥进行身份验证。可以使用 ssh-agent 命令来启动代理。例如:

    ssh-agent
    
  4. 添加私钥到 SSH 代理:将生成的私钥添加到 SSH 代理中,以便进行身份验证。可以使用 ssh-add 命令来添加私钥。例如:

    ssh-add ~/.ssh/id_rsa
    

完成上述步骤后,您应该能够在执行 SCP 命令时实现无密码访问。SCP 命令将使用 SSH 密钥进行身份验证,并自动进行文件传输,而无需手动输入密码。

请注意,使用 SSH 密钥进行身份验证可以提高安全性,并方便进行自动化脚本或批处理任务。确保妥善保管私钥,并仅将公钥添加到授权列表中的远程主机上。

检查 linux 上是否有安装 SSH 客户端rpm -qa | grep openssh-clients

4. windows 开启定时任务

  • 创建任务
  • 设置触发器(指定脚本执行时间)
  • 选择执行脚本

win+R 下 打开

  • compmgmt.msc 打开 计算机管理

  • taskschd.msc 打开 任务计划程序

创建任务

新建触发器,指定每天固定时间点执行

选择执行的脚本