# 检查MySQL连接 check_mysql_connection() { local host=$1 local user=$2 local password=$3 local port=$4 log"检查MySQL连接: $host:$port" if mysql -h $host -P $port -u $user -p$password -e "SELECT 1;" > /dev/null 2>&1; then log"MySQL连接正常: $host:$port" return 0 else log"MySQL连接失败: $host:$port" return 1 fi }
# 检查MySQL配置 check_mysql_config() { local host=$1 local user=$2 local password=$3 local port=$4 log"检查MySQL配置: $host:$port" # 检查关键配置参数 mysql -h $host -P $port -u $user -p$password -e " SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW VARIABLES LIKE 'max_connections'; SHOW VARIABLES LIKE 'innodb_log_file_size'; SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit'; SHOW VARIABLES LIKE 'sync_binlog'; " 2>/dev/null }
# 检查数据库大小 check_database_size() { local host=$1 local user=$2 local password=$3 local port=$4 log"检查数据库大小: $host:$port" mysql -h $host -P $port -u $user -p$password -e " SELECT table_schema AS 'Database', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)' FROM information_schema.tables GROUP BY table_schema ORDER BY SUM(data_length + index_length) DESC; " 2>/dev/null }
# 检查表结构 check_table_structure() { local host=$1 local user=$2 local password=$3 local port=$4 local database=$5 log"检查表结构: $host:$port - $database" mysql -h $host -P $port -u $user -p$password -e " USE $database; SHOW TABLES; " 2>/dev/null }
# 主函数 main() { log"开始MySQL配置检查..." # 检查源MySQL if check_mysql_connection $SOURCE_HOST$SOURCE_USER$SOURCE_PASSWORD$SOURCE_PORT; then check_mysql_config $SOURCE_HOST$SOURCE_USER$SOURCE_PASSWORD$SOURCE_PORT check_database_size $SOURCE_HOST$SOURCE_USER$SOURCE_PASSWORD$SOURCE_PORT fi # 检查目标MySQL if check_mysql_connection $TARGET_HOST$TARGET_USER$TARGET_PASSWORD$TARGET_PORT; then check_mysql_config $TARGET_HOST$TARGET_USER$TARGET_PASSWORD$TARGET_PORT check_database_size $TARGET_HOST$TARGET_USER$TARGET_PASSWORD$TARGET_PORT fi log"MySQL配置检查完成" }
# 复制二进制日志文件 copy_binary_logs() { log"复制二进制日志文件..." # 获取需要复制的二进制日志文件列表 BINLOG_FILES=$(mysql -h $SOURCE_HOST -P $SOURCE_PORT -u $SOURCE_USER -p$SOURCE_PASSWORD -e "SHOW BINARY LOGS;" | grep -v "Log_name" | awk '{print $1}') for binlog_file in$BINLOG_FILES; do # 跳过当前正在使用的二进制日志文件 if [ "$binlog_file" != "$CURRENT_BINLOG" ]; then log"复制二进制日志文件: $binlog_file" # 复制二进制日志文件 cp$BINLOG_DIR/$binlog_file$BACKUP_PATH/ if [ $? -eq 0 ]; then log"二进制日志文件复制成功: $binlog_file" else log"二进制日志文件复制失败: $binlog_file" fi fi done }
# 压缩二进制日志文件 compress_binary_logs() { log"压缩二进制日志文件..." cd$BACKUP_PATH for binlog_file in *.bin; do if [ -f "$binlog_file" ]; then log"压缩二进制日志文件: $binlog_file" gzip $binlog_file if [ $? -eq 0 ]; then log"二进制日志文件压缩成功: $binlog_file" else log"二进制日志文件压缩失败: $binlog_file" fi fi done }
# 清理二进制日志文件 cleanup_binary_logs() { log"清理二进制日志文件..." # 清理已备份的二进制日志文件 mysql -h $SOURCE_HOST -P $SOURCE_PORT -u $SOURCE_USER -p$SOURCE_PASSWORD -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);" if [ $? -eq 0 ]; then log"二进制日志文件清理完成" else log"二进制日志文件清理失败" fi }
# 日志函数 log() { echo"[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE }
# 分析MySQL性能 analyze_performance() { log"分析MySQL性能..." # 获取性能指标 mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e " SHOW STATUS LIKE 'Connections'; SHOW STATUS LIKE 'Uptime'; SHOW STATUS LIKE 'Questions'; SHOW STATUS LIKE 'Slow_queries'; SHOW STATUS LIKE 'Qcache_hits'; SHOW STATUS LIKE 'Innodb_buffer_pool_hit_rate'; " 2>/dev/null }
# 优化InnoDB配置 optimize_innodb() { log"优化InnoDB配置..." # 获取当前InnoDB配置 mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e " SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW VARIABLES LIKE 'innodb_log_file_size'; SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit'; SHOW VARIABLES LIKE 'innodb_flush_method'; " 2>/dev/null # 优化InnoDB配置 mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e " SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB SET GLOBAL innodb_log_file_size = 268435456; -- 256MB SET GLOBAL innodb_flush_log_at_trx_commit = 2; SET GLOBAL innodb_flush_method = O_DIRECT; " 2>/dev/null log"InnoDB配置优化完成" }
# 优化查询缓存 optimize_query_cache() { log"优化查询缓存..." # 获取当前查询缓存配置 mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e " SHOW VARIABLES LIKE 'query_cache_type'; SHOW VARIABLES LIKE 'query_cache_size'; SHOW VARIABLES LIKE 'query_cache_limit'; " 2>/dev/null # 优化查询缓存配置 mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e " SET GLOBAL query_cache_type = 1; SET GLOBAL query_cache_size = 134217728; -- 128MB SET GLOBAL query_cache_limit = 1048576; -- 1MB " 2>/dev/null log"查询缓存配置优化完成" }
# 优化连接配置 optimize_connections() { log"优化连接配置..." # 获取当前连接配置 mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e " SHOW VARIABLES LIKE 'max_connections'; SHOW VARIABLES LIKE 'max_connect_errors'; SHOW VARIABLES LIKE 'connect_timeout'; " 2>/dev/null # 优化连接配置 mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e " SET GLOBAL max_connections = 1000; SET GLOBAL max_connect_errors = 100000; SET GLOBAL connect_timeout = 10; " 2>/dev/null log"连接配置优化完成" }
# 优化慢查询日志 optimize_slow_query_log() { log"优化慢查询日志..." # 启用慢查询日志 mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e " SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 2; SET GLOBAL log_queries_not_using_indexes = 1; " 2>/dev/null log"慢查询日志配置完成" }
# 分析慢查询 analyze_slow_queries() { log"分析慢查询..." # 使用pt-query-digest分析慢查询日志 ifcommand -v pt-query-digest > /dev/null 2>&1; then SLOW_LOG_FILE="/var/log/mysql/slow.log" if [ -f "$SLOW_LOG_FILE" ]; then pt-query-digest $SLOW_LOG_FILE > /tmp/slow_query_analysis.txt log"慢查询分析完成: /tmp/slow_query_analysis.txt" else log"慢查询日志文件不存在: $SLOW_LOG_FILE" fi else log"pt-query-digest工具未安装" fi }