功能:实现不同类型的数据库逻辑备份、备份集清理、归档清理、基本信息收集、备份导入数据库等工作。
1. 脚本构成说明 ¶
1.1. logic_backup_manager.sh ¶
主脚本文件,解析配置文件,执行备份、清理等工作。
logic_backup_manager.sh位于bin目录下。
1.2. logic_backup_manager.conf ¶
主配置文件,全局参数:
常规参数,比如ip/port/dbname/dbuser/passwd等
路径参数,比如日志路径、备份路径、job路径等
日志参数,比如日志级别等
logic_backup_manager.conf位于share目录下。
1.3. .job文件 ¶
每个.job文件代表了一个备份任务,暂支持以下类型任务:
sys_dump备份指定模式,可多个
sys_dump备份指定表,可多个,可正则表达
sys_dump备份全库,排除指定模式、指定表
copy指定库的指定模式的指定表
sys_dump备份全库
备份打包指定目录下N天前的旧文件并删除旧文件
2. 脚本使用说明 ¶
配置 logic_backup_manager.conf 主配置文件(优先使用和 logic_backup_manager.sh 同目录下的配置文件,若同目录下不存在则去加载使用 ../share/logic_backup_manager.conf 配置文件),添加.job备份任务文件(文件由用户创建,该文件配置参数可参考手册内相应参数)后,执行下述命令:
logic_backup_manager.sh backup [all] # 执行所有.job备份任务
logic_backup_manager.sh backup myschema.job # 执行myschema.job备份任务
logic_backup_manager.sh restore [all] #执行所有备份还原任务
logic_backup_manager.sh restore starttime-endtime #执行指定时间备份还原任务,时间格式为yyyymmdd
logic_backup_manager.sh clean [all] # 清理逻辑备份内容
logic_backup_manager.sh clean myschema.job # 清理myschema.job备份任务的备份内容
logic_backup_manager.sh clean archived-wal # 清理wal文件
logic_backup_manager.sh show-auto # 输出自动备份清理的crontab内容
logic_backup_manager.sh backup-clean "a.job b.job" # 清理归档,执行job备份和清除
logic_backup_manager.sh collect-info # 收集数据库和OS信息
3. 定时任务设置 ¶
配置好 logic_backup_manager.conf 文件,设置好job文件,验证job备份任务没有问题后可使用 show-auto 命令输出定时任务的设置,手动添加到 crontab 列表中即可。
3.1. 凝思HA的定时任务设置 ¶
凝思HA是多台机器共享一份存储的解决方案,一个时刻只能有一台机器挂载存储对外提供数据库服务,当机器A故障后支持自动启用另一台机器B对外提供服务,这时机器B挂载了存储。鉴于共享存储的这种特性,凝思HA备份清理定时任务的设置如下:
将本脚本需要拷贝到共享存储上,并且配置文件也要和本脚本在同一目录下
做好 logic_backup_manager.conf 文件配置,设置好job文件
在挂载了共享存储的机器上执行 show-auto 命令,并手动设置crontab定时任务
手动切换机器,在挂载了共享存储的新机器上执行 show-auto 命令,并手动设置crontab定时任务
再次切换机器,直至在所有节点上都设置了crontab定时任务
注:不对外提供服务(或故障)的机器虽然也会跑定时任务,但因为缺少共享存储,是无法真正执行定时备份清理任务的
4. 基本原理介绍 ¶
备份原理:sys_dump、copy
清理原理:每次执行备份任务都会在相应的 .job.record 文件追加本次备份内容所在的独立的目录,依据保留次数清除旧的目录
免密原理:依据配置参数设置 ${HOME}/.encpwd 实现
清理wal原理:SQL查询 archive_command 若包含sys_rman则不执行清理;find查找 mtime+${_archived_wal_age} 文件并排序,找到一个 ${_archived_wal_age} 天前的最新的wal文件(作为锚点,该文件不会被删除),然后调用 sys_archivecleanup 清理wal归档
还原原理:执行ksql命令导入相应的sql文件
5. 约束 ¶
脚本会依据配置往 ${HOME}/.encpwd 免密配置文件内追加配置,若配置了错误的密码,备份检查就会报错失败,此时需要手工删除 ${HOME}/.encpwd 免密配置文件内错误的那行信息,并且修改 logic_backup_manager.conf 全局配置文件或者 .job 任务配置文件。
脚本功能按照日期还原需要依赖文件目录中的日期(如2022/10/10),如果修改``logic_backup_manager.conf`` 全局配置文件中相关参数,会影响该功能的正常使用。
6. job说明 ¶
为了满足不同客户现场的不同的逻辑备份任务,同时统一规范管理这些任务,因此将它们划分为不同的类型,现在支持 job1、job2、job3、job4、job5、job6六种类型的任务。
每种类型的 job 有两类参数:
该类型 job 专用的配置参数,不可与其他类型 job 的专用配置参数重复
适用于所有类型 job 的私有通用参数,往往是全局配置参数的覆盖,比如“默认保留的备份数量 _keep_count ”,全局配置为30,该任务备份的数据特别重要那么可设置其私有通用参数( _my_keep_count )为365,作用域仅限当前 job
新增备份任务时,需要判断是哪种类型的 job,然后使用该类型 job 的参数做配置,并将这些内容写入到一个独立的新的 .job 文件(配置参数不可重复)中。
6.1. 专用配置参数说明 ¶
每种类型的 job 都有其特有的专用配置参数,不可重复,每个 .job 文件必须存在某种类型的专用配置参数。
6.2. 私有通用参数说明 ¶
_my_* 参数用于设置某个 .job 文件代表的任务的私有属性,不设置则默认使用 logic_backup_manager.conf 内的全局配置参数。
全局配置名 | 私有通用参数名 | 说明 |
_keep_count | _my_keep_count | 保留的备份数量,比如默认保留30份,某job任务保留365份 |
_crontab_prefix | _my_crontab_prefix | 自动运行的设置,比如默认每周运行,某job任务每天运行 |
_kdb_script_log_file | _my_kdb_script_log_file | 脚本日志文件设置,比如默认使用A文件写日志,某job任务使用B文件写日志(注:在加载主配置文件 logic_backup_manager.conf 之前警告出错信息输出到屏幕,加载主配置文件之后这些信息会写到 ${_kdb_script_log_file} 文件,加载 .job 文件后若有私有的日志文件设置,后续日志会写到该私有日志文件中) |
_kdb_user | _my_kdb_user | 数据库用户名 |
_kdb_pass | _my_kdb_pass | 数据库用户的密码(注: _my_kdb_pass 只有在 _my_kdb_user 存在的情况下才会生效) |
_kdb_dbname | _my_kdb_dbname | 数据库名 |
_older_files_age | _my_older_files_age | 旧文件保留天数 |
6.3. job1 类型说明 ¶
6.3.1. 作用 ¶
备份指定模式,可使用英文逗号为间隔添加多个模式,可使用正则表达。
6.3.2. 原理 ¶
sys_dump -n -Fc导出指定模式的所有内容
sys_dump -n -Fp -s 导出指定模式的定义信息
tar打包
6.3.3. 专用配置参数 ¶
_dump_schemas
6.3.4. 举例说明 ¶
# cat jobs/valid_job1.job
_dump_schemas="public,schema1"
6.3.5. 示例备份存储位置 ¶
# ls -A kdb_backup/databackup/kdb_daily_dump/2022/07/26/valid_job1.job/
test_public_schema1_20220726_201741.dmp.tar.gz
test_public_schema1_stru_20220726_201741.sql.tar.gz
6.4. job2 类型说明 ¶
6.4.1. 作用 ¶
备份指定表,可使用英文逗号为间隔添加多个表,可使用正则表达(注:必须是“模式名.表”的形式)。
6.4.2. 原理 ¶
sys_dump -t -Fc导出指定表的所有内容
sys_dump -t -Fp -s 导出指定表的定义信息
tar打包
6.4.3. 专用配置参数 ¶
_dump_tables
6.4.4. 举例说明 ¶
# cat jobs/valid_job2.job
_dump_tables="public.t1,schema1.t1"
6.4.5. 示例备份存储位置 ¶
# ls -A kdb_backup/databackup/kdb_daily_dump/2022/07/26/valid_job2.job/
test_public.t1_schema1.t1_20220726_202143.dmp.tar.gz
test_public.t1_schema1.t1_stru_20220726_202143.sql.tar.gz
6.5. job3 类型说明 ¶
6.5.1. 作用 ¶
备份全库,排除指定模式或指定表,可使用英文逗号为间隔添加多个表或模式,可使用正则表达(注:排除指定表参数值必须是“模式名.表”的形式)。
6.5.2. 原理 ¶
sys_dump -N -T -Fc导出指定表的所有内容
sys_dump -N -T -Fp -s 导出指定表的定义信息
tar打包
6.5.3. 专用配置参数 ¶
_dump_all_exclude_schemas _dump_all_exclude_tables
6.5.4. 举例说明 ¶
# cat jobs/valid_extbs.job
_dump_all_exclude_tables="public.t1,public.t2"
#cat jobs/valid_job3.job
_dump_all_exclude_schemas="pub*,schd*"
_dump_all_exclude_tables="hisdb.yc_*,hisdb.yc,hisdb.yc_ddd"
6.5.5. 示例备份存储位置 ¶
# ls -A kdb_backup/databackup/kdb_daily_dump/2022/07/26/valid_job3.job/
test_pub*,schd*hisdb._20220726_202238.dmp.tar.gz
test_pub*,schd*hisdb._stru_20220726_202238.sql.tar.gz
6.6. job4 类型说明 ¶
6.6.1. 作用 ¶
备份指定表。
6.6.2. 原理 ¶
若脚本所在机器与数据库服务器不在同一机器,中断该任务,因为copy不支持远程写文件
select relname from sys_class where RELNAMESPACE=(select oid from sys_namespace where nspname='${schema_name}') and relname like '${tables_prefix}' and relkind='r' 查询出要备份的表列表
sys_dump -t -s -Fp 备份表定义信息
构造 delete 语句和用于恢复的 copy from 语句
构造 copy to 语句备份每个表: copy (select * from ${schema_name}.${one_table} ${where_condition}) to ${file}
6.6.3. 专用配置参数 ¶
_copy_tables_to :只能配置一个,格式为 dbname!schema!tablename ,其中英文叹号!为分隔符,tablename可使用%,t%表示t开头的该库该模式下所有的表,注意 _my_kdb_dbname 变量不会生效,以配置内的 dbname 为准;优先使用 _my_kdb_user (若未配置则使用 _kdb_user ), _my_kdb_pass (若未配置则使用 _kdb_pass ),和 dbname 构造免密字符串写到 ~/.encpwd 文件中
_copy_tables_stru :是否备份表结构,1代表是,0或者不配该参数则为否
_copy_tables_where_condition : 备份表的部分内容
6.6.4. 举例说明 ¶
# cat jobs/valid_copy_job4.job
_copy_tables_to="test!public!t%"
_my_keep_count="2"
# cat jobs/valid_copy_where_job4.job
_copy_tables_to="test!public!t1"
_copy_tables_where_condition="where id > 1000"
# 备份表的增量数据时,可以这样设置 .job 文件达到目的,若有多个不同的表需要增量备份,可以设置多个类似的 .job 文件:
# cat jobs/valid_time.job
_copy_tables_to="hello!public!alarm_model_%" # 备份hello数据库的public模式下的alarm_model_%表
_copy_tables_where_condition="where occur_time between '`date '+%Y-%m-%d' -d '-1 days'`' and '`date '+%Y-%m-%d'`'" # 限定只备份前一天的数据
_my_crontab_prefix="30 00 * * * " # 设置每天0:30执行本备份任务
_my_kdb_user="hello" # hello数据库需要不同于全局配置的一个用户名去链接
_my_kdb_pass="MTIzNDU2" # base64后的该用户的密码
6.6.5. 示例备份存储位置 ¶
# ls -A kdb_backup/databackup/kdb_daily_copy/2022/07/26/valid_copy_job4.job/t_20220726_202408/
copy_from copy_to data
# ls -A kdb_backup/databackup/kdb_daily_copy/2022/07/26/valid_copy_job4.job/t_20220726_202408/copy_from/
test_public_t1_20220726_202408_.sql test_public_t2_20220726_202408_.sql
# ls -A kdb_backup/databackup/kdb_daily_copy/2022/07/26/valid_copy_job4.job/t_20220726_202408/copy_to/
test_public_t1_20220726_202408_.sql test_public_t2_20220726_202408_.sql
# ls -A kdb_backup/databackup/kdb_daily_copy/2022/07/26/valid_copy_job4.job/t_20220726_202408/data/
test_public_t1_20220726_202408_.txt test_public_t2_20220726_202408_.txt
6.7. job5 类型说明 ¶
6.7.1. 作用 ¶
备份整个数据库。
6.7.2. 原理 ¶
sys_dump -n -Fc导出所有内容
sys_dump -n -Fp -s 导出定义信息
tar打包
6.7.3. 专用配置参数 ¶
_dump_all :注意只能设置为yes
6.7.4. 举例说明 ¶
# cat jobs/valid_job5.job
_dump_all="yes"
6.7.5. 示例备份存储位置 ¶
# ls -A kdb_backup/databackup/kdb_daily_dump/2022/07/27/valid_job5.job/
test_all_20220727_203445.dmp.tar.gz test_all_stru_20220727_203445.sql.tar.gz
6.8. job6 类型说明 ¶
6.8.1. 作用 ¶
备份打包指定目录下N天前的旧文件并删除旧文件,可用于清理sys_log目录或者脚本日志目录。
6.8.2. 原理 ¶
find ${_tar_del_older_files_in_the_dir} -mtime +${target_older_files_age} -type f -printf '%P ' | xargs tar --remove-files -C ${_tar_del_older_files_in_the_dir} -cvzf ${tar_filename} 找到旧文件打包,并把旧文件删除
删除天数N和_older_files_age参数有关
6.8.3. 专用配置参数 ¶
_tar_del_older_files_in_the_dir
6.8.4. 举例说明 ¶
# cat kdb_backup/jobs/valid_bklog1.job
_tar_del_older_files_in_the_dir="/128G/shell-script/kdb_backup/databackup/log/"
6.8.5. 示例备份存储位置 ¶
# ls -A kdb_backup/databackup/older_files/valid_bklog1.job
20220805_235848.tar.gz
6.9. 还原备份功能说明 ¶
6.9.1. 作用 ¶
还原通过job4备份的sql文件,可按照时间进行选择。
6.9.2. 使用限制 ¶
按时间选择是根据目录中的时间选择如2022/10/10。如果修改配置文件中相关配置,可能导致该功能失效。
6.9.3. 原理 ¶
查找目录kdb_daily_copy下所有符合条件的sql文件,如果是按照时间选择还原,则通过 echo ${file} | awk -F"_" '{print $4} 得到文件创建日期,通过时间戳 date -d "$var" +%s 获得符合条件的文件
通过 ksql –f xxx.sql 导入到数据库中
6.9.4. 专用配置参数 ¶
_kdb_daily_restore_path
6.9.5. 举例说明 ¶
# cat logic_backup_manager.conf
_kdb_daily_restore_path="${_kdb_backup_data_path}/kdb_daily_copy"
使用示例:
./logic_backup_manager.sh restore 20220909-20220910
6.9.6. 示例备份存储位置 ¶
# ls -A kdb_backup/databackup/kdb_daily_copy
2021 2022 2023
7. 全局配置参数说明 ¶
全局配置名 | 说明 |
_log_level | 脚本日志级别:debug:0, info:1, warn:2, error:3 (error除了写日志外还输出到屏幕) |
_kdb_home | KES bin/lib/share目录的上级目录 |
_kdb_bin_path | sys_dump、ksql所在的目录 |
_kdb_port | 端口 |
_kdb_host | 数据库的ip或hostname |
_kdb_connect_timeout | 链接数据库超时秒数设置,必须为纯数字,0或负数是永不超时,2是最小超时秒数,设为1实质为2s超时 |
_kdb_user | 数据库用户名 |
_kdb_pass | _kdb_user用户名的base64后的密码 |
_kdb_dbname | 数据库名 |
_ld_library_path | Lib目录 |
_kdb_backup_jobs_path | .job文件所在的目录 |
_keep_count | 保留的备份数量 |
_os_ip_cmd | ip命令 |
_os_rm_cmd | rm命令 |
_os_sed_cmd | sed命令 |
_os_grep_cmd | grep命令 |
_kdb_backup_path | 备份所在根目录 |
_kdb_backup_data_path | 备份目录 |
_date_ymd | 年月日的字符串 |
_date_y | 年的字符串 |
_date_m | 月的字符串 |
_date_d | 日的字符串 |
_date_path | 按年、月、日划分的目录的字符串 |
_kdb_backup_data_tmp_path | 备份使用的临时目录 |
_kdb_backup_job_record_path | 备份任务的记录文件所在的目录 |
_kdb_daily_dump_path | sys_dump任务的数据目录 |
_kdb_daily_copy_path | copy任务的数据目录 |
_kdb_backup_log_path | 日志目录 |
_kdb_script_log_file | 日志文件名 |
_copy_data | copy数据的目录 |
_copy_to | copy to SQL文件所在的目录 |
_copy_from | copy from SQL文件所在的目录 |
_archived_wal_age | 归档wal日志保留天数 |
_archived_wal_path | 归档wal日志所在的目录 |
_crontab_prefix | crontab自动执行的前缀 |
_older_files_age | 旧文件保留天数 |
_kdb_backup_older_files_path | 旧文件打包备份路径 |
_collect_info_path | 信息收集目录 |
_collect_locks_file | locks路径和名称 |
_collect_lac_file | lac路径和名称 |
_collect_iostat_file | iostat路径和名称 |
_collect_top_file | top路径和名称 |
_collect_sys_stat_file | sys_stat路径和名称 |
_collect_vmstat_file | vmstat路径和名称 |
_collect_lx_file | lx路径和名称 |
_collect_client_file | client路径和名称 |
_collect_crontab_prefix | 信息收集功能crontab的前缀 |