Oracle数据库有时需要批量收集数据库的统计信息,如在大量数据迁移或大量数据更新以后,但是收集的时间可能会较长,为了避免网络中断等意外情况可能引起的麻烦,今天调试了这个小脚本,可以分用户批量执行,同时记录执行时间等日志信息,比较实用。
执行方式:
sh /tmp/gather_schema_stats.sh syspasswd ip port service "schema1 schema2" degree&
详见以下代码:
cat > /tmp/gather_schema_stats.sh << EOF2
#!/bin/bash
# Usage:
# sh /tmp/gather_schema_stats.sh syspasswd ip port service "schema1 schema2" degree&
gather_schema_stats() {
date
sqlplus /nolog << EOF
connect sys/\$1@\$2:\$3/\$4 as sysdba
set timing on
exec dbms_stats.gather_schema_stats(ownname=>'\$5',options=>'GATHER AUTO',estimate_percent=>dbms_stats.auto_sample_size,method_opt=>'for all columns size auto',degree=>\$6,cascade=>TRUE);
exit
EOF
date
}
for SCHEMAS in \${5}
do
TIMESTAMP=\date "+%Y%m%d"\;LOG_FILE=/tmp/gather_schema_stats_\${TIMESTAMP}_\${SCHEMAS}.log
gather_schema_stats \${1} \${2} \${3} \${4} \${SCHEMAS} \$6 > \${LOG_FILE} 2>&1
done
EOF2
最后生成的脚本及日志如下所示:
ll /tmp
total 36
-rw-r----- 1 oracle oinstall 409 Dec 15 19:17 gather_schema_stats_20211215_CM.log
-rw-r----- 1 oracle oinstall 409 Dec 15 19:17 gather_schema_stats_20211215_CUSTCARE.log
-rw-r----- 1 oracle oinstall 409 Dec 15 19:18 gather_schema_stats_20211215_DW_TOTALCC.log
-rw-r----- 1 oracle oinstall 409 Dec 15 19:18 gather_schema_stats_20211215_OTHER_USER.log
-rw-r----- 1 oracle oinstall 409 Dec 15 19:18 gather_schema_stats_20211215_REPORT.log
-rw-r----- 1 oracle oinstall 409 Dec 15 19:18 gather_schema_stats_20211215_SXGIS.log
-rw-r----- 1 oracle oinstall 409 Dec 15 19:18 gather_schema_stats_20211215_TOTALCC_FC.log
-rw-r----- 1 oracle oinstall 600 Dec 15 19:17 gather_schema_stats.sh
值得注意的是,gather_schema_stats收集统计信息的各个参数配置,采用了最佳实践配置,可以放心参考使用。