Navicat 16 不支持自定义日期格式变量,$DATETIME$仅输出固定格式时间戳(如20240520143022),无法生成“2024-05-20”等可读格式;必须借助外部脚本(如Windows批处理或Linux shell)调用mysqldump/pg_dump,通过系统命令提取日期并拼接文件名,再由Navicat调度该脚本执行。
Navicat 16 的自动化任务不支持原生日期变量
navicat 16 的「自动运行」任务里,备份数据库 操作的文件名输入框只接受静态字符串或预定义变量(如 $db_name$、$datetime$),但 $datetime$ 是固定格式且不可定制——它生成的是类似 20240520143022 的时间戳,无法单独提取“年月日”或按 2024-05-20 格式命名。
用外部脚本 + Navicat 调度绕过限制
真正可行的做法是:关闭 Navicat 内置备份,改用命令行工具(如 mysqldump 或 pg_dump)生成带日期的文件,再让 Navicat 调度该脚本。关键点在于:
- Navicat 自动化任务可执行「外部程序」,路径填你的脚本(如
backup_mysql.bat或backup_postgres.sh) - 脚本内用系统命令生成日期,例如 Windows 下:
set DATESTR=%date:~0,4%%date:~5,2%%date:~8,2%;Linux/macOS 下:DATESTR=$(date +%Y-%m-%d) - 拼接文件名时注意路径分隔符和空格:Windows 推荐用
backup_%DATESTR%.sql,避免中文或冒号(:) - 确保 Navicat 运行账户对目标目录有写权限——常被忽略,导致脚本静默失败
MySQL 备份示例:Windows 批处理 + mysqldump
以下是一个实际可用的 backup_mysql.bat(假设 MySQL bin 目录已加入 PATH):
SET DB_HOST=127.0.0.1 SET DB_PORT=3306 SET DB_NAME=myapp SET DB_USER=root SET DB_PASS=yourpass SET BACKUP_DIR=D:\backups SET DATESTR=%date:~0,4%%date:~5,2%%date:~8,2% mkdir "%BACKUP_DIR%" 2>nul mysqldump -h%DB_HOST% -P%DB_PORT% -u%DB_USER% -p%DB_PASS% %DB_NAME% > "%BACKUP_DIR%\%DB_NAME%_%DATESTR%.sql"
注意:mysqldump 密码明文存在安全风险,生产环境建议改用配置文件(my.cnf)并设权限为 600;另外 %date% 格式依赖系统区域设置,若显示为“2024/05/20”,需调整子串索引(如 %date:~0,4%%date:~5,2%%date:~8,2% 可能失效)
PostgreSQL 备份要额外处理 pg_dump 的日期参数
pg_dump 本身不提供日期占位符,必须靠 shell 脚本生成文件名。Linux 示例:
#!/bin/bash
DB_NAME="myapp"
DATESTR=$(date +%Y-%m-%d)
BACKUP_DIR="/home/user/backups"
pg_dump -h localhost -U postgres $DB_NAME > "$BACKUP_DIR/${DB_NAME}_${DATESTR}.sql"
Navicat 调度时,需确保:pg_dump 在 PATH 中;脚本有执行权限(chmod +x backup_pg.sh);PostgreSQL 用户密码通过 .pgpass 文件提供(否则交互式密码会卡住自动化)
最易出问题的地方不是语法,而是权限和环境上下文:Navicat 后台服务默认以 SYSTEM 用户运行,它看不到你登录时的 PATH、PGPASSWORD 或 .pgpass。解决方法是——要么改用「当前用户」运行自动化任务(在 Navicat 设置里勾选「以当前用户身份运行」),要么把所有路径写绝对路径,把密码写进脚本(仅限测试环境)。











