目录
一.主要内容概述
1.备份内容
- 统计表中的数据单元格数目
- 备份全部数据库数据
- 只备份数据结构
- 只备份数据
2.检查内容
- 检查数据库服务器的状态
- 过滤数据库启动时间
- 过滤数据库列表
- 查询MYSQL最大并发连接数
- 查看SELECT指令被执行数
- 查看UPDATE指令被执行次数
- 查看DELETE指令被查看的次数
- 查看INSERT指令被查看的次数
- 查看COMMIT指令被查看的次数
- 查看ROLLBACK指令被查看的次数
- 查看服务器总指令数
- 查看慢查询数
- 数据库QPS
- 数据库TPS
二.脚本
1.检查脚本
#!/bin/bash # 定义数据库相关的变量 MYSQL_USER=root MYSQL_PASS=mysql_P@s5 # 密码 MYSQL_PORT=3306 # 端口 MYSQL_HOST=localhost # 数据库ip MYSQL_ADMIN="mysqladmin -u$MYSQL_USER -p$MYSQL_PASS -P$MYSQL_PORT -h$MYSQL_HOST" MYSQL_COMM="mysql -u$MYSQL_USER -p$MYSQL_PASS -P$MYSQL_PORT -h$MYSQL_HOST -e" # 定义变量:显示颜色属性 SUCCESS="echo -en \\033[1;32m" # 绿色 FAILURE="echo -en \\033[1;31m" # 红色 WARNING="echo -en \\033[1;33m" # 黄色 NORMAL="echo -en \\033[0;39m" # 黑色 # 检查数据库服务器的状态 $MYSQL_ADMIN ping &> /dev/null if [ $? -ne 0 ];then $FAILURE echo "无法连接数据库服务器" $NORMAL exit else echo -n "数据库状态:" $SUCCESS echo "[OK]" $NORMAL fi mysql_test(){ # 过滤数据库启动时间 RUN_TIME=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'uptime'" | awk '/Uptime/{print $2}') echo -n "数据库已运行时间(秒):" $SUCCESS echo $RUN_TIME $NORMAL # 过滤数据库列表 DB_LIST=$($MYSQL_COMM "SHOW DATABASES") DB_COUNT=$($MYSQL_COMM "SHOW DATABASES" | awk 'NR>=2&&/^[^+]/{db_count++} END{print db_count}') echo -n "数据库有$DB_COUNT个数据库,分别为:" $SUCCESS echo $DB_LIST $NORMAL # 查询MYSQL最大并发连接数 MAX_CON=$($MYSQL_COMM "SHOW VARIABLES LIKE 'max_connections'" | awk '/max/{print $2}') echo -n "MYSQL最大并发连接数:" $SUCCESS echo $MAX_CON $NORMAL # 查看SELECT指令被执行数 NUM_SELECT=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'com_select'" | awk '/Com_select/{print $2}') echo -n "SELECT指令被执行数:" $SUCCESS echo $NUM_SELECT $NORMAL # 查看UPDATE指令被执行次数 NUM_UPDATE=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'com_update'" | awk '/Com_update/{print $2}') $SUCCESS echo -n "UPDATE指令被执行次数:" echo $NUM_UPDATE $NORMAL # 查看DELETE指令被查看的次数 NUM_DELETE=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'com_delete'" | awk '/Com_delete/{print $2}') $SUCCESS echo -n "DELETE指令被查看的次数:" echo $NUM_DELETE $NORMAL # 查看INSERT指令被查看的次数 NUM_INSERT=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'com_insert'" | awk '/Com_insert/{print $2}') $SUCCESS echo -n "INSERT指令被查看的次数:" echo $NUM_INSERT $NORMAL # 查看COMMIT指令被查看的次数 NUM_COMMIT=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'com_commit'" | awk '/Com_commit/{print $2}') $SUCCESS echo -n "COMMIT指令被查看的次数:" echo $NUM_COMMIT $NORMAL # 查看ROLLBACK指令被查看的次数 NUM_ROLLBACK=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'com_rollback'" | awk '/Com_rollback/{print $2}') $SUCCESS echo -n "ROLLBACK指令被查看的次数:" echo $NUM_ROLLBACK $NORMAL # 查看服务器总指令数 NUM_QUESTION=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'Questions'" | awk '/Questions/{print $2}') $SUCCESS echo -n "QUESTION服务器总指令次数:" echo $NUM_QUESTION $NORMAL # 查看慢查询数 NUM_SLOW_QUERY=$($MYSQL_COMM "SHOW GLOBAL STATUS LIKE 'slow_queries'" | awk '/Slow_queries/{print $2}') $SUCCESS echo -n "SLOW_QUERY慢查询数:" echo $NUM_SLOW_QUERY $NORMAL # 数据库QPS echo -n "数据库QPS:" $SUCCESS awk 'BEGIN{print '"$NUM_QUESTION/$RUN_TIME"'}' $NORMAL # 数据库TPS echo -n "数据库TPS:" $SUCCESS awk 'BEGIN{print '"($NUM_COMMIT+$NUM_ROLLBACK)/$RUN_TIME"'}' $NORMAL } mysql_test 2>/dev/null
2.数据备份脚本
#!/bin/bash ## 基本配置变量 USER="root" # 输入用户 PORT=3306 # 端口 PASSWORD="xxx" # 密码 HOST="xxx.xxx.xxx.xxx" # 数据库ip DB_md=`mysql -u${USER} -p"${PASSWORD}" -h${HOST} -P${PORT} --default-character-set=utf8mb4 -e "show databases"|grep -Ev "^(Database|mysql|performance_schema|information_schema|sys)$"|xargs` # 所有库名 TB="show tables" # 查看表名 back (){ ## 准备数据备份目录 if [ -d /data/sql-back ];then echo "" else mkdir -p /data/sql-back ALL_LOG=/data/sql-back # 备份目录 fi if [ -d /data/sql-back/data ];then echo "" else mkdir -p /data/sql-back/data DATA_LOG=/data/sql-back/data # 备份数据sql目录 fi if [ -d /data/sql-back/structure ];then echo "" else mkdir -p /data/sql-back/structure ST_LOG=/data/sql-back/structure # 备份数据sql表结构目录 fi ## 准备哈希值 if [ -e ${ALL_LOG}/count_sum.txt ];then touch count_sum.txt else rm -rf ${ALL_LOG}/count_sum.txt && touch ${ALL_LOG}/count_sum.txt fi # 所有库名 for i in ${DB_md} do # 所有表名 for j in `mysql -u$USER -p$PASSWORD -P$PORT -h$HOST -D $i --skip-column-names -e "$TB" ` do # 统计表中的数据单元格数目 su=`mysql -u$USER -p$PASSWORD -P$PORT -h$HOST -D $i --skip-column-names -e "select count(*) from $j"` echo -e ${i}:${j}:${su} >> ${ALL_LOG}/count_sum.txt done echo -e "\n++++++++++++++++++++++++++++++++" >> ${ALL_LOG}/count_sum.txt done # 备份全部数据库数据 echo "备份全部数据库数据" /usr/local/mysql/bin/mysqldump -u${USER} -p${PASSWORD} --default-character-set=utf8 --single-transaction --master-data=2 --all-databases > /data/sql-back/all.sql ## 只备份数据结构 echo "只备份数据结构" for s in ${DB_md} do /usr/local/mysql/bin/mysqldump -u${USER} -p${PASSWORD} --default-character-set=utf8 --set-gtid-purged=OFF --hex-blob --no-data --skip-lock-tables --complete-insert --skip-tz-utc --compact --databases ${s} > $ST_LOG/$s.sql done ## 只备份数据 echo "只备份数据" for d in ${DB_md} do /usr/local/mysql/bin/mysqldump -u${USER} -p${PASSWORD} --default-character-set=utf8 --set-gtid-purged=OFF --hex-blob --no-create-info --skip-lock-tables --complete-insert --skip-tz-utc --compact --databases ${d} > $DATA_LOG/$d.sql done } back 2> /dev/null
三.备份参数概述
1.设置导出字符集
如果不指定,mysqldump默认使用UTF8字符集进行导出。
选项名称 | 默认值 | 可选值 | 作用 |
---|---|---|---|
-- default-character-set | UTF8 | 实例支持的字符集 | 设置导出的字符集 |
2.GTID特性介绍
MySQL 5.6引入了GTID特性,因此5.6版本的mysqldump工具增加了set-gtid-purged选项。
说明
ON:在mysqldump输出中包含SET @@GLOBAL.GTID_PURGED语句。
OFF:在mysqldump输出中不包含 SET @@GLOBAL.GTID_PURGED 语句。
AUTO:默认值。对于启用了GTID的实例,会输出 SET @@GLOBAL.GTID_PURGED语句;对于没有启动或者不支持GTID的实例,不输出任何GTID相关信息。
因此对于使用MySQL 5.6及以上版本自带的mysqldump工具导出RDS MySQL 5.5版本实例数据时,需要设置set-gtid-purged为OFF,否则会报以下错误:
Error: Server has GTIDs disabled. 或者 mysqldump: Couldn’t execute ‘SELECT @@GTID_MODE’: Unknown system variable ‘GTID_MODE’ <1193>
3.其他导出时需要注意的选项
选项名称 | 默认值 | 可选值 | 作用 |
---|---|---|---|
no-data | FALSE | TRUE|FALSE | 不导出数据。 |
hex-blob | FALSE | TRUE|FALSE | 以16进制导出Binary、VarBinary、BLOB类型数据。如果跨版本迁移数据,建议增加该选项。 |
complete-insert | FALSE | TRUE|FALSE | 生成一个完整的列值映射关系 |
compact | FALSE | TRUE|FALSE | 启用skip-add-drop-table、skip-add-locks、skip-comments、skip-disable-keys、skip-set-charset 选项。 |
skip-tz-utc | FALSE | TRUE|FALSE | 导出数据时,不使用格林威治时间,而使用当前 mysql 服务器的时区进行导出 |
no-create-info | FALSE | TRUE|FALSE | 含义是只导出数据,而不添加CREATE TABLE语句 |
force | FALSE | TRUE|FALSE | 当出现错误时仍然继续备份操作 |
databases | FALSE | TRUE|FALSE | 完整导出指定的数据库 ; 包括建库语句、表结构、数据 |
quick, -q | True | TRUE|FALSE | 不缓冲查询,直接导出到标准输出。默认为打开状态,使用--skip-quick取消该选项 |
master-data=2 | FALSE | TRUE|FALSE | 会将change master 语句写入dump文件中,只不过会被注释掉 |
insert-ignore | FALSE | TRUE|FALSE | 在插入行时使用INSERT IGNORE语句 |
skip-column-name | FALSE | TRUE|FALSE | 输出结果无列名 |
-D | True | TRUE|FALSE | 指定库名 |
4.避免表级锁等待
选项名称 | 默认值 | 可选值 | 作用 |
---|---|---|---|
lock-tables | TRUE | TRUE|FALSE | 导出期间在导出表上设置表级锁。默认开启。可以通过指定 skip-lock-tables选项来关闭。 |