当前位置: 首页 > Linux

shell脚本:同步mysql数据库中的某张表

时间:2023-04-06 20:02:43 Linux

初衷:有时候我们想把另外一个数据库中的某张表同步到本地数据库中。1.mysqllogin-pathmysql如果在脚本中直接登录,会报shellwarning警告:在命令行界面使用密码可能不安全。这样做确实不安全。明文暴露mysql账号密码。因此,我们使用login-pathlogin-path是MySQL5.6支持的新特性。使用mysql_config_editor工具将登录MySQL服务的认证信息加密保存在.mylogin.cnf文件中(默认位于用户家目录下)。之后MySQL客户端工具可以读取加密文件连接MySQL,避免重复输入登录信息和敏感信息外泄。mysql_config_editor使用帮助:配置:mysql_config_editorset--login-path=test--user=test_user--host=127.0.0.1--port=3306--password例子:vagrant@homestead:~/code$mysql_config_editorset--login-path=xxx--host=127.0.0.1--port=3306--user=xxx--password输入密码:输入密码即可。它将被加密并保存在.mylogin.cnf文件中(默认位于用户的主目录中)。可配置项-h,--host=name在登录文件中添加host-G,--login-path=name在登录文件中添加登录路径name(默认为client)-p,--password在登录文件中添加密码登录文件(密码会被mysql_config_editor自动加密)-u,--user将用户名添加到登录文件中-S,--socket=name将sock文件路径添加到登录文件中-P,--port=name添加登录端口到登录文件显示配置:mysql_config_editorprint--login-path=test#显示执行的登录路径配置mysql_config_editorprint--all#显示所有登录路径信息删除配置:mysql_config_editorremove--login-path=test可以删除项目-h,--host=name添加主机到登录文件-G,--login-path=name添加登录文件中登录路径的名称(默认是client)-p,--password添加一个密码到登录文件(密码会被mysql_config_editor自动加密)-u,--user将用户名添加到登录文件-S,--socket=name将sock文件路径添加到登录文件-P,--port=name在登录文件中添加登录端口重置配置:mysql_config_editorreset--login-path=test使用login-path登录:shell>mysql--login-path=test登录其他主机和其他端口,或者添加其他附加参数,直接在上述命令后添加即可。shell>mysql--login-path=test-hhost1-Pport1#登录host1:poet1上的MySQLshell>mysql--login-path=test-hhost1-Pport1test_db#登录host1:poet1上的MySQL中的test_db库2、shell脚本#!/bin/bash#从源数据库同步到目标数据库.db_src=xxx//源数据库db_tar=xxx//目标数据库table_name=xxx//table##缓存目录configcach_dump=/home/vagrant/#缓存文件cache_file=$table_name.txt#loglog_dir=/var/log/syncSql/log_file=syncSql_$(date+"%Y-%m-%d").log#if[!-e$log_dir$log_file]然后如果[!-d$log_dir];然后sudomkdir$log_dir;elseexit&&echo-e"\n------------创建${log_dir}失败。------------\n"fiif[!-d$日志文件];然后cd$log_dir&&sudotouch$log_file;elseexit&&echo-e"\n------------创建${log_file}失败。------------\n"fisudochown-Rvagrant:vagrant$log_dirfi##定义执行sql函数sqlrun_src(){mysql--login-path=src<>$log_dir$log_fileelseexit&&echo"$(date+"%Y-%m-%d%H:%M:%S")获取${table_name}最大ID失败。">>$log_dir$log_filefi#src_run="SELECT*FROM${db_src}.${table_name}WHEREid>${id};"ifsqlrun_src"${src_run}">${cach_dump}${cache_file}thenecho"$(date+"%Y-%m-%d%H:%M:%S")写入${table_name}数据OK。">>$log_dir$log_fileelseexit&&echo"$(date+"%Y-%m-%d%H:%M:%S")写入${table_name}数据失败d.">>$log_dir$log_filefi#ifsed-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然后echo"$(date+"%Y-%m-%d%H:%M:%S")导入${table_name}数据OK.">>$log_dir$log_fileelseexit&&echo"$(date+"%Y-%m-%d%H:%M:%S")写入${table_name}dataFailed.">>$log_dir$log_filefi##3.crontab任务调度结合linux的contab自动任务自动同步基本格式:*  *  *  *  *  命令分 时 日 月 周 命令第一列表示分钟1~59每分钟或/1表示第二列表示小时1~23(0表示0o'clock)第三列代表日期1~31第四列代表月份1~12第五列代表星期0~6(0代表星期日)第六列要运行的命令假设我要同步每2分钟同步一次的数据脚本*/2****/home/vagrant/syncSql.sh配置方法:Ubuntu下有两种配置定时任务的方式,1.直接在/var/spool中新建一个用户文件/cron/crontabs/目录,并在Configurescheduledtasks文件中新建用户文件;2、直接使用crontab-e命令编辑当前用户的计划任务。以root用户为例,两种方式设置的定时任务都是/var/spool/cron/crontabs/root文件,格式相同。不同的是,直接编辑文件后,需要调用crontab/var/spool/cron/crontabs/只有root才能使配置生效,而用crontab-e编辑后,(用vim)保存退出后,它会直接生效。使用crontab-l查看定时任务。如果没有执行,查看是否cronsudoservicecronstatus#cronstart/running,process23719restartsservicecronsudoservicecronrestart然后可以查看/var/log/cron.log日志文件,默认日志没有开启.打开方法:sudovim/etc/rsyslog.d/50-default.conf找到cron.log相关行,去掉前面的注释#,保存退出,重启rsyslog:sudoservicersyslogrestart