
Bitte beachten Sie das unten stehende Skript.
#!/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"
Okay, dieses Skript ruft also grundsätzlich Daten des aktuellen Datums von einem MySQL-Server ab, und ich muss dieses Skript so planen, dass es Daten des aktuellen Datums abruft. Dabei besteht jedoch das Problem, dass die Daten kontinuierlich eingehen, sodass ich es nicht einfach für 2 Uhr morgens planen kann, da bis 2 Uhr morgens Daten in den MySQL-Server eingegeben werden. Daher habe ich mir zwei Workarounds überlegt: Entweder ich rufe Daten des vorherigen Datums ab, z. B. heute ist der 16.04.2020. Wenn das Skript also heute um 2 Uhr morgens ausgeführt wird, ruft es Daten vom 15.04.2020 ab.
oder
Ich plane dieses Skript etwa am Ende des Tages, etwa um 23:58 Uhr oder so.
Was ist Ihrer Meinung nach der beste Weg? Können Sie mir auch den Cronjob für 23:58 Uhr nennen?
Wenn ich beispielsweise Daten des vorherigen Datums abrufen möchte, müssen entsprechende Änderungen vorgenommen werden.
Vielen Dank und Grüße, Sagar Mandal
Antwort1
Ich würde in deinem Fall die Abfrage definitiv so einschränken, dass du Datensätze von einem Tag erhältst, egal wann die Abfrage gestartet wird. Auf diese Weise kannst du sie um 2 Uhr morgens oder wann auch immer starten. Auf diese Weise kannst du das Skript später manuell ausführen, wenn zu dem Zeitpunkt, als es ausgeführt werden sollte, etwas schief gelaufen ist.
Ändern Sie in Ihrem Skript die Where-Bedingung etwa so:
where DATE(posting_date) = DATE(DATE_ADD(CURDATE(), INTERVAL -1 DAY))
Auf diese Weise erhalten Sie nur Datensätze, deren Datum von gestern ist.
Wenn Sie dies mit Bash-Variablen tun möchten, erhalten Sie das aktuelle Datum in einem für MySql geeigneten Format:
date=$(date --rfc-3339=date)
Die Ausgabe dafür $date
hat die für MySql erkennbare Form:
2020-04-16
Erstellen Sie dann eine Where-Bedingung, etwa wie folgt:
where DATE(posting_date) = DATE(DATE_ADD('$date', INTERVAL -1 DAY))
Wenn Sie die ändern interval -1 day
, können Sie die Daten für jeden gewünschten Tag abrufen.
Und noch etwas. Geben Sie MySql keine Benutzernamen und Passwörter aus Skripten. Auf diese Weise werden Passwörter preisgegeben und früher oder später werden Sie das bereuen. Verwenden Sie mysql_config_editor
(https://dev.mysql.com/doc/refman/8.0/en/mysql-config-editor.html), um Anmeldeinformationen zu speichern und sie später in einem Skript wie Ihrem zu verwenden.