#python #cratedb
Вопрос:
Мне было поручено проверить восстановление баз данных crate из одного региона AWS в другой. Резервное копирование и восстановление уже выполняются, но у нас нет возможности проверить, успешно ли выполняется восстановление, не копаясь в каждом задании восстановления по отдельности. Метод, который мы выбрали для проверки восстановления, состоит в том, чтобы получить csv-файл, содержащий список каждой таблицы в базе данных и связанное с ней количество строк перед резервным копированием в первом регионе, скопировать его в S3, а затем создать аналогичный файл после восстановления во втором регионе, а затем сравнить два файла. Однако crate не определяет «имя таблицы» в INFORMATION_SCHEMA.tables, поэтому этот запрос:
SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES where table_schema IN ('doc', 'app');
не сработает. Я понял, как это сделать в bash следующим образом:
/apps/crate/crash -c "SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES where table_schema IN ('doc', 'app');" --format csv | grep -v ^' | dos2unix gt; crate_tables for x in $(cat crate_tables) ; do /apps/crate/crash -c "select count(1) from ${x};" --format csv | egrep -v "^$|^count"; done | dos2unix gt; crate_row_count paste -d ',' crate_tables crate_row_count gt; crate_table_row_count.csv
но мне сказали сделать это на python. У меня есть начало сценария, но я не знаю, как использовать выходные данные первого запроса в качестве входных данных для второго запроса:
#!/usr/bin/env python3 from crate import client connection = client.connect('10.30.76.251:4200') cursor = connection.cursor() cursor.execute(""" SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES where table_schema IN ('doc', 'shn')""") TableList = cursor.fetchall() for TableName in TableList: print(TableName) cursor.execute(""" SELECT COUNT(*) from (SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES where table_schema IN ('doc', 'shn'))""") RowCount = cursor.fetchone() print(RowCount) # print(Table_List) cursor.close() connection.close()
Любая помощь будет весьма признательна.
Ответ №1:
Возможно, альтернативный (более простой) подход заключается в использовании sys.shards
таблицы
SELECT schema_name || '.' || table_name as fqn, sum(num_docs) as total_records FROM sys."shards" WHERE schema_name IN ('doc', 'shn') AND "primary" GROUP BY fqn;
#!/usr/bin/env python3 from crate import client import csv connection = client.connect('10.30.76.251:4200') cursor = connection.cursor() cursor.execute(""" SELECT schema_name || '.' || table_name as fqn, sum(num_docs) as total_records FROM sys."shards" WHERE schema_name IN ('doc', 'shn') AND "primary" GROUP BY fqn;""") TableList = cursor.fetchall() with open('path/to/csv_file', 'w', encoding='UTF8') as f: writer = csv.writer(f) for TableName in TableList: writer.writerow(TableName)
Комментарии:
1. Если вы просто хотите сравнить количество строк для первичных сегментов (исключая количество строк реплик), добавьте в запрос предложение where
primary = true