初衷: 有时候我们想从另外一台数据库中同步某一个表到本地数据库中.
1,MySQL login-path
MySQL 在脚本中直接登录会报 shell warning
Warning:Using a password on the command line interface can be insecure.
这么做确实是不安全. 明文暴露了 MySQL 的账号密码. 由此, 我们使用 login-path
login-path 是 MySQL5.6 开始支持的新特性. 通过借助 mysql_config_editor 工具将登陆 MySQL 服务的认证信息加密保存在. mylogin.cnf 文件 (默认位于用户主目录) . 之后, MySQL 客户端工具可通过读取该加密文件连接 MySQL, 避免重复输入登录信息, 避免敏感信息暴露.
mysql_config_editor 使用帮助:
配置:
mysql_config_editor set --login-path=test --user=test_user --host=127.0.0.1 --port=3306 --password
示例:
- Vagrant@Homestead:~/code$ mysql_config_editor set --login-path=xxx --host=127.0.0.1 --port=3306 --user=xxx --password
- Enter password:
输入密码即可. 会加密保存在. mylogin.cnf 文件 (默认位于用户主目录)
其中可配置项
-h,-host=name 添加 host 到登陆文件中
-G,-login-path=name
在登录文件中为 login path 添加名字 (默认为 client)
-p,-password 在登陆文件中添加密码 (该密码会被 mysql_config_editor 自动加密)
-u,-user 添加用户名到登陆文件中
-S,-socket=name 添加 sock 文件路径到登陆文件中
-P,-port=name 添加登陆端口到登陆文件中
显示配置:
- mysql_config_editor print --login-path=test
- # 显示执行的 login-path 配置
- mysql_config_editor print --all
- # 显示所有的 login-path 信息
删除配置:
mysql_config_editor remove --login-path=test
其中可删除项
-h,-host=name 添加 host 到登陆文件中
-G,-login-path=name
在登录文件中为 login path 添加名字 (默认为 client)
-p,-password 在登陆文件中添加密码 (该密码会被 mysql_config_editor 自动加密)
-u,-user 添加用户名到登陆文件中
-S,-socket=name 添加 sock 文件路径到登陆文件中
-P,-port=name 添加登陆端口到登陆文件中
重置配置:
mysql_config_editor reset --login-path=test
使用 login-path 登录:
shell>MySQL --login-path=test
若要登录其他主机, 其他端口, 或者添加其他额外参数, 直接在上述命令后添加即可.
- shell>MySQL --login-path=test -h host1 -P port1 #登录 host1:poet1 上的 MySQL
- shell>MySQL --login-path=test -h host1 -P port1 test_db #登录 host1:poet1 上的 MySQL 中的 test_db 库
2,shell 脚本
- # !/bin/bash
- #Synchronize from the source database to the target database.
- db_src=xxx //source database
- db_tar=xxx //target database
- table_name=xxx //table
- #
- # cache directory config
- cach_dump=/home/Vagrant/
- # cache file
- cache_file=$table_name.txt
- # log
- log_dir=/var/log/syncSql/
- log_file=syncSql_$(date +"%Y-%m-%d").log
- #
- if [ ! -e $log_dir$log_file ]
- then if [ ! -d $log_dir ]; then
- sudo mkdir $log_dir;
- else
- exit && echo -e "\n------------Created ${log_dir} Failed. ------------\n"
- fi
- if [ ! -d $log_file ]; then
- cd $log_dir && sudo touch $log_file;
- else
- exit && echo -e "\n------------Created ${log_file} Failed. ------------\n"
- fi
- sudo chown -R Vagrant:Vagrant $log_dir
- fi
- #
- # define execute sql function
- sqlrun_src(){
- MySQL --login-path=src <<EOF
- $1
- EOF
- }
- sqlrun_tar(){
- MySQL --login-path=tar <<EOF
- $1
- EOF
- }
- #
- #
- # do synchronize
- tar_run="SELECT MAX(id) AS id FROM ${db_tar}.${table_name};"
- if id_ori=$(sqlrun_tar "${tar_run}") && id=${id_ori#id}
- then
- if [ ${id} = NULL ]
- then id=0
- fi
- echo "$(date +"%Y-%m-%d %H:%M:%S") Get ${table_name} Max id ${id}.">> $log_dir$log_file
- else
- exit && echo "$(date +"%Y-%m-%d %H:%M:%S") Get ${table_name} Max id Failed.">> $log_dir$log_file
- fi
- #
- src_run="SELECT * FROM ${db_src}.${table_name} WHERE id> ${id};"
- if sqlrun_src "${src_run}"> ${cach_dump}${cache_file}
- then echo "$(date +"%Y-%m-%d %H:%M:%S") Write ${table_name} data OK.">> $log_dir$log_file
- else
- exit && echo "$(date +"%Y-%m-%d %H:%M:%S") Write ${table_name} data Failed.">> $log_dir$log_file
- fi
- #
- if sed -i '1, $s/NULL/\\N/g' ${cach_dump}${cache_file} && /usr/bin/mysqlimport --login-path=tar --ignore-lines=1 --local ${db_tar} ${cach_dump}${cache_file}>> $log_dir$log_file
- then echo "$(date +"%Y-%m-%d %H:%M:%S") Import ${table_name} data OK.">> $log_dir$log_file
- else
- exit && echo "$(date +"%Y-%m-%d %H:%M:%S") Write ${table_name} data Failed.">> $log_dir$log_file
- fi
- #
- #
3,crontab 任务调度
结合 Linux 的 contab 自动任务自动同步.
基本格式 :
* * * * * command
分 时 日 月 周 命令
第 1 列表示分钟 1~59 每分钟用或者 /1 表示
第 2 列表示小时 1~23(0 表示 0 点)
第 3 列表示日期 1~31
第 4 列表示月份 1~12
第 5 列标识号星期 0~6(0 表示星期天)
第 6 列要运行的命令
假设我想让同步数据脚本每 2 分钟同步一次
*/2 * * * */home/Vagrant/syncSql.sh
配置方法:
Ubuntu 下配置计划任务有两种方法,
1, 直接在
/var/spool/cron/crontabs/
目录下新建一个用户文件, 在该文件中配置计划任务;
2, 直接使用 crontab -e 命令编辑当前用户的计划任务.
以 root 用户为例, 两种方法设置的计划任务都是 /var/spool/cron/crontabs/root 文件, 格式也一样, 区别就是直接编辑文件后, 需要调用 crontab /var/spool/cron/crontabs/root 才能使配置生效, 而使用 crontab -e 编辑后,(使用 VIM) 保存退出后, 直接生效.
可用 crontab -l 查看计划任务.
如果发现未执行, 检查是否已经开启 cron
- sudo service cron status
- #cron start/running, process 23719
重启服务 cron
sudo service cron restart
再则可以查看 /var/log/cron.log 日志文件 , 默认 log 是没有开启的.
开启方法:
sudo VIM /etc/rsyslog.d/50-default.conf
找到 cron.log 相关行, 将前面注释符 # 去掉, 保存退出, 重启 rsyslog:
sudo service rsyslog restart
来源: https://segmentfault.com/a/1190000015274929