셸 스 크 립 트 는 my sqldump 를 이용 하여 지정 표 데이터 파일 을 자동화 내 보 냅 니 다.

3871 단어 shell
설명: 앞에서 블 로 그 는 into outfile 과 load data 를 이용 하여 데이터 시트 데 이 터 를 업데이트 하 는 방법 을 썼 습 니 다. 어떤 친구 들 은 저 에 게 본 고 에서 말 한 my sqldump 와 이전의 into outfile 과 load data 의 차 이 를 물 었 습 니 다. 여기 서도 간단하게 말씀 드 리 겠 습 니 다.
my sqldump 는 전체 데이터 베 이 스 를 내 보 내 거나 데이터 베 이 스 를 내 보 낼 표 에 적응 하고 데이터 베이스 에 있 는 표 의 이름 이 변 하지 않 으 며 다른 데이터 베 이 스 를 다시 가 져 오 는 상황 에 적응 합 니 다.이전 블 로그 에 서 는 my sqldump 내 보 내기 데이터베이스 시트 구조 나 표 데이터 에 대한 간단 한 실현 명령 을 말씀 드 렸 으 니 참고 하 시기 바 랍 니 다.https://blog.csdn.net/u013946356/article/details/84990671
앞서 말 했 듯 이 into outfile 과 load data 를 사용 한 데이터 업데이트 방식 은 표 의 일부 필드 나 조건 에 맞 는 기록 을 내 보 내 려 면 내 보 낸 데 이 터 는 스스로 형식 을 정할 수 있 고 순수한 데 이 터 를 내 보 낼 수 있 으 며 표 작성 정보 가 존재 하지 않 으 므 로 다른 데이터 베 이 스 를 직접 가 져 올 수 있다 는 것 이 장점 이다.my sqldump 에 비해 유연 합 니 다.구체 적 인 실현 방법 은 이전에 내 가 쓴 블 로 그 를 참고 할 수 있다.https://blog.csdn.net/u013946356/article/details/84960273
본 고 는 my sqldump 를 이용 하여 자동화 업데이트 지정 where 조건 지정 표 데이터 파일 (표 구조 에 대한 내 보 내기 작업 이 없 음) 을 중심 으로 데이터 증분 업데이트 업무 에 도 적응 하고 있다.며칠 전 만 료 된 파일 을 정기 적 으로 삭제 하 는 논 리 를 썼 다.
자세 한 스 크 립 트 와 설명 은 다음 과 같 습 니 다.
#! /bin/sh
dest_dir=/home/data  #导出文件所放目录
log_path=/home/data.log  #日志文件目录

back_date=`date "+%Y-%m-%d"`  #定义当前时间变量,时间格式例如2018-12-13
back_time=$((3*24*60*60))  #定义3天秒数(这个是为了删除3天前生成的文件,只保留近三天产出的文件)
ntime=$(date +%s -d $back_date)   #获取当前日期秒数

source_mysql_host=ipdaar  #数据库地址
source_mysql_database=dbname  #数据库名称
source_mysql_user=user  #用户名
source_mysql_password=userpwd  #用户名密码
source_mysql_port=port   #数据库端口号

source_mysql_cmd=`which mysqldump`" -u$source_mysql_user -p$source_mysql_password -P$source_mysql_port -h$source_mysql_host --single-transaction "  #定义执行指令 
#--single-transaction会将隔离级别设置为:REPEATABLE READ。并且随后再执行一条START TRANSACTION语句,让整个数据在dump过程中保证数据的一致性,这个选项对InnoDB的数据表很有用,且不会锁表。但是这个不能保证MyISAM表和MEMORY表的数据一致性。

function delefile(){  #循环遍历删除过期文件(这里定义为3天)
	 echo `date "+%Y-%m-%d %H:%M:%S"` "Start delefile Data" >> $log_path  #打印开始删除日期追加到日志文件里
        if [ $? eq 0 ]  #检验上一指令是否执行成功
        then
        for fname in `ls $dest_dir`   #循环遍历产出文件所在目录
        do
        fileday=`echo $fname|cut -d . -f 2`   #截取文件产出日期
        filetime=$(date +%s -d $fileday)   #将文件产出日期转成秒
        if [ $? eq 0 ]  #若上一指令执行成功
        then
                stime=$(($ntime-$filetime))   #当前日期秒数减去产出文件日期秒数
                if [ $stime -gt $back_time ]  #若差值大于三天的秒数,则删除该文件,即删除前三天的文件
                then
                        rm -rf $dest_dir/$fname  #删除文件指令
                fi
        fi
        done
        fi
}

function copy_database(){   #定义导出文件函数
     
	echo `date "+%Y-%m-%d %H:%M:%S"` >> $log_path   #记录追加到日志文件里

	echo `date "+%Y-%m-%d %H:%M:%S"` "Start Copy Data" >> $log_path
        
    echo `date "+%Y-%m-%d %H:%M:%S"` "start dump $source_mysql_database to $dest_dir/filename.$back_date " >> $log_path
       
	$source_mysql_cmd --replace -t $source_mysql_database table_name1 --skip-tz-utc --where="table_name1.id > 100" > $dest_dir/filename.$back_date \   #将table_name1表数据导出filename.$back_date文件中
	&& $source_mysql_cmd --replace -t $source_mysql_database table_name2 --skip-tz-utc --where="table_name2.id > 100" >> $dest_dir/filename.$back_date \  #将table_name2表数据追加到filename.$back_date文件中
	

	echo `date "+%Y-%m-%d %H:%M:%S"` "import complete $?" >> $log_path  #将导出完成时间记录到日志文件里

        echo `date "+%Y-%m-%d %H:%M:%S"` "Copy Data End" >> $log_path  #
	echo `date "+%Y-%m-%d %H:%M:%S"` "Start delefile Data" >> $log_path  #进行文件删除
        delefile    #调用删除文件函数

	echo `date "+%Y-%m-%d %H:%M:%S"` >> $log_path   #完成时间

}
copy_database   #调用copy_database函数

 2. crontab - e 를 입력 하여 crontab 를 열 어 정시 설정
30 09 * * * sh /home/copy_file_run.sh

 
 

좋은 웹페이지 즐겨찾기