(created_at 列によると) 10 日よりも「古い」レコードを削除する必要がある大きなテーブル (約 1,000 万行) があります。これを行うために実行するpythonスクリプトがあります。created_at は varchar(255) であり、次のような値を持ちます1594267202000
import mysql.connector
import sys
from mysql.connector import Error
table = sys.argv[1]
deleteDays = sys.argv[2]
sql_select_query = """SELECT COUNT(*) FROM {} WHERE created_at / 1000 < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL %s DAY))""".format(table)
sql_delete_query = """DELETE FROM {} WHERE created_at / 1000 < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL %s DAY)) LIMIT 100""".format(table)
try:
connection = mysql.connector.connect(host=localhost,
database=myDatabase,
user=admin123,
password=password123)
cursor = connection.cursor()
#initial count of rows before deletion
cursor.execute(sql_select_query, (deleteDays,))
records = cursor.fetchone()[0]
while records >= 1:
# stuck at following below line and time out happens....
cursor.execute(sql_delete_query, (deleteDays,))
connection.commit()
cursor.execute(sql_select_query, (deleteDays,))
records = cursor.fetchone()[0]
#final count of rows after deletion
cursor.execute(sql_select_query, (deleteDays,))
records = cursor.fetchone()[0]
if records == 0:
print("\nRows deleted")
else:
print("\nRows NOT deleted")
except mysql.connector.Error as error:
print("Failed to delete: {}".format(error))
finally:
if (connection.is_connected()):
cursor.close()
connection.close()
print("MySQL connection is closed")
このスクリプトを実行すると、DELETE QUERY が実行されますが、次の理由で失敗します。
削除に失敗しました: 1205 (HY000): ロック待機タイムアウトを超えました。トランザクションを再開してみてください
innodb_lock_wait_timeoutが現在 50 秒に設定されていることはわかっていますが、この問題を解決するためにそれを増やすことができますが、タイムアウトには触れたくないので...基本的にチャンクで削除したいですか? 私のコードを例として使用して、ここでそれを行う方法を知っている人はいますか?