Для нас ответ DELETE WHERE %s ORDER BY %s LIMIT %d
не был возможен, потому что критерии WHERE были медленными (неиндексированный столбец) и могли привести к главному.
ВЫБРАТЬ из реплики для чтения список первичных ключей, которые вы хотите удалить. Экспорт в таком формате:
00669163-4514-4B50-B6E9-50BA232CA5EB
00679DE5-7659-4CD4-A919-6426A2831F35
Используйте следующий скрипт bash, чтобы получить этот ввод и разделить его на операторы DELETE [требуется bash ≥ 4 из-за mapfile
встроенного ]:
sql-chunker.sh
(не забудьте chmod +x
me и измените shebang так, чтобы он указывал на ваш исполняемый файл bash 4) :
#!/usr/local/Cellar/bash/4.4.12/bin/bash
# Expected input format:
: <<!
00669163-4514-4B50-B6E9-50BA232CA5EB
00669DE5-7659-4CD4-A919-6426A2831F35
!
if [ -z "$1" ]
then
echo "No chunk size supplied. Invoke: ./sql-chunker.sh 1000 ids.txt"
fi
if [ -z "$2" ]
then
echo "No file supplied. Invoke: ./sql-chunker.sh 1000 ids.txt"
fi
function join_by {
local d=$1
shift
echo -n "$1"
shift
printf "%s" "${@/#/$d}"
}
while mapfile -t -n "$1" ary && ((${#ary[@]})); do
printf "DELETE FROM my_cool_table WHERE id IN ('%s');\n" `join_by "','" "${ary[@]}"`
done < "$2"
Вызывать так:
./sql-chunker.sh 1000 ids.txt > batch_1000.sql
Это даст вам файл с выводом, отформатированным примерно так (я использовал размер пакета 2):
DELETE FROM my_cool_table WHERE id IN ('006CC671-655A-432E-9164-D3C64191EDCE','006CD163-794A-4C3E-8206-D05D1A5EE01E');
DELETE FROM my_cool_table WHERE id IN ('006CD837-F1AD-4CCA-82A4-74356580CEBC','006CDA35-F132-4F2C-8054-0F1D6709388A');
Затем выполните операторы так:
mysql --login-path=master billing < batch_1000.sql
Для тех, кто не знаком с login-path
, это просто ярлык для входа без ввода пароля в командной строке.