shell脚本使用mysqldump+mysql同步线上库和测试库数据

实现同一台服务器不同数据库的单表同步

完整脚本

#!/bin/bash

# 执行方式
# bash demo.sh <table_name>

# 配置数据库账号密码
username='root'
password='123456'

# 配置数据源库 和 数据目标库
source_database='data'
target_database='dev_data'

# 接收参数 表名
table_name=$1

if [ ! $table_name ]; then  
    echo "error: 数据表名称未知"
    echo "执行方式: bash demo.sh <table_name>"
    exit
fi  

echo "开始同步..."
echo "$source_database.$table_name => $target_database.$table_name"

# 2>/dev/null 可以抑制警告信息
mysqldump -u"${username}" -p"${password}"  $source_database $table_name 2>/dev/null \
| mysql -u"${username}" -p"${password}" $target_database 2>/dev/null \
&& echo "同步完成 success"

可以根据需求自行修改

使用方式

$ bash demo.sh <table_name>

遇到的问题及解决

mysqldump: Couldn't execute '
SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')  
FROM information_schema.COLUMN_STATISTICS
WHERE SCHEMA_NAME = 'admin_xlmstore_c' AND TABLE_NAME = 'tb_article';': 
Unknown table 'COLUMN_STATISTICS' in information_schema (1109)

解决方法:

# 添加参数 --column-statistics=0
mysqldump --column-statistics=0 -h ip -u root -p dbname > db.sql;

参考

mysqldump 导出提示Couldn’t execute SELECT COLUMN_NAME…

同步不同主机数据

#!/bin/bash

# 执行方式
# bash sync_data.sh [table_name]

####################################################
# 参数配置
####################################################

# 数据源
source_host='127.0.0.1'
source_port='3306'
source_user='root'
source_password='123456'
source_database='data'

# 数据目标
target_host='127.0.0.1'
target_port='3306'
target_user='root'
target_password='123456'
target_database='data_dev'

# 可选接收参数 表名
table_name=$1

# if [ ! $table_name ]; then
#     echo "error: 数据表名称未知"
#     echo "执行方式: bash demo.sh <table_name>"
#     exit
# fi


####################################################
# 脚本执行
####################################################

echo "开始同步..."
echo "$source_database.$table_name => $target_database.$table_name"

# 2>/dev/null 可以抑制警告信息
mysqldump \
--column-statistics=0 \
--host "${source_host}" \
--port "${source_port}" \
-u"${source_user}" \
-p"${source_password}" \
$source_database \
$table_name \
| mysql \
--host "${target_host}" \
--port "${target_port}" \
-u"${target_user}" \
-p"${target_password}" \
$target_database \
&& echo "同步完成 success"

报错及解决

尝试使用mysqldump导出数据报错:

mysqldump: Error: 'Access denied; 
you need (at least one of) the PROCESS privilege(s) for this operation' 
when trying to dump tablespaces

需要授权

> grant process on *.* to user@'%';

注意:process权限是一个全局权限,所以不可以指定在某一个库上,否则会报错

ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
上一篇:Databricks数据洞察公测实例关闭通知


下一篇:《Excel 职场手册:260招菜鸟变达人》一第 16 招 利用数据验证防止重复录入相同的内容