아래 스크립트를 참고해주세요.
#!/usr/bin/bash
#scirpt to connect with db
master_db_user=''
master_db_passwd=''
master_db_port='3306'
master_db_host=''
master_db_name='uppcldashboard'
Now=$(date +"%d-%m-%Y")
date=$(date +"%F")
#Preparing script
#SQL_Query='select * from test_table;'
#MySql Command to connect to a database
#mysql -u$master_db_user -p$master_db_passwd -D$master_db_name -e "select * from uppcl_amount_details into outfile '/created_files/uppcl.csv' fields terminated by ',' lines terminated by '\n';"
mysql -u$master_db_user -p$master_db_passwd -D$master_db_name -e "select *,IFNULL(ref_4,0),IFNULL(ref_3,0),IFNULL(ref_7,0),IFNULL(ref_8,0),date_format(posting_date,'%Y-%m-%d') from uppcl_amount_details where posting_date>=CURDATE() into outfile '/created_files/uppcl.csv' fields terminated by ',' lines terminated by '\n';"
mv /created_files/uppcl.csv /created_files/offline_collection$Now.csv
sed -i "1i id","Cashier_id","Cheque_no","collection_amount","collection_type","Posting_date","Discom","Division_Code","Division_Name","Head_cashier_id","ref_3","ref_4","ref_5","ref_6","ref_7","ref_8","Tran_Date","Status","Posting_Updated_Date" /created_files/offline_collection$Now.csv
echo "End of the Script"
좋습니다. 이 스크립트는 기본적으로 MySQL 서버에서 현재 날짜의 데이터를 가져옵니다. 따라서 이 스크립트를 정렬하여 현재 날짜의 데이터를 가져오도록 해야 합니다. 그런데 여기서 문제가 있는데, 데이터가 연속적으로 들어오기 때문에 오전 2시 이전에 MySQL 서버에 데이터가 입력되기 때문에 그냥 오전 2시에 예약할 수는 없기 때문에 두 가지 해결책을 생각해 보았습니다. 오늘 첫 번째 날짜의 데이터는 2020년 4월 16일이므로 오늘 오전 2시에 스크립트를 실행하면 2020년 4월 15일의 데이터를 가져옵니다.
또는
나는 이 스크립트를 하루가 끝날 무렵, 예를 들어 오후 11시 58분 정도가 되도록 일정을 잡습니다.
이것이 최선의 방법이라고 생각하시나요? 오후 11시 58분에 cronjob을 알려주실 수 있나요?
이전 날짜에 대한 데이터를 가져오는 것을 고려한다면 해당 데이터를 가져오도록 변경해야 합니다.
감사와 안부 인사, Sagar Mandal
답변1
귀하의 경우에는 쿼리가 언제 시작되든 특정 날짜의 기록을 얻을 수 있도록 쿼리를 확실히 제한하겠습니다. 이렇게 하면 오전 2시 또는 언제든지 시작할 수 있습니다. 이렇게 하면 스크립트가 실행되어야 할 때 문제가 발생하는 경우 나중에 수동으로 실행할 수 있습니다.
스크립트의 where 조건을 다음과 같이 변경하세요.
where DATE(posting_date) = DATE(DATE_ADD(CURDATE(), INTERVAL -1 DAY))
이렇게 하면 어제 날짜의 레코드만 얻을 수 있습니다.
이를 위해 bash 변수를 사용하려면 MySql에 적합한 형식으로 현재 날짜를 가져옵니다.
date=$(date --rfc-3339=date)
출력은 $date
MySql에서 인식되는 형식입니다.
2020-04-16
그런 다음 다음과 같이 where 조건을 설정합니다.
where DATE(posting_date) = DATE(DATE_ADD('$date', INTERVAL -1 DAY))
변경되면 interval -1 day
언제든지 데이터를 얻을 수 있습니다.
그리고 하나 더. 스크립트에서 MySql에 사용자 이름과 비밀번호를 제공하지 마십시오. 이런 식으로 비밀번호가 유출되고 조만간 후회하게 될 것입니다. 사용 mysql_config_editor
(https://dev.mysql.com/doc/refman/8.0/en/mysql-config-editor.html) 자격 증명을 저장하고 나중에 귀하와 같은 스크립트에서 사용합니다.