Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
NapalmRain
42 / 42 / 6
Регистрация: 18.05.2010
Сообщений: 671
1

MySQL и SQLite бекап баз данных

04.07.2014, 14:56. Просмотров 1305. Ответов 6
Метки нет (Все метки)

Доброго всем времени суток!

Есть серверное приложение, которое работает одновременно с MySQL и SQLite. C разной периодичностью в процессе работы необходимо делать бекапы обеих баз.
В конструкторах классов по работе с БД запускаю таймер и вызываю им функцию бекапа:
C#
1
2
3
4
Timer udbTimer = new Timer();
            udbTimer.Elapsed += new ElapsedEventHandler(SetBackup);
            udbTimer.Interval = 43200000; // делать бекап раз в 12 часов
            udbTimer.Start();
Но сама функция SetBackup на данный момент времени ничего не делает.
Вот тут возникает вопрос: каким образом грамотнее делать бекапы?
Если в SQLite в принципе можно попробовать просто скопировать файл бд в нужное место, то у MySQL такая ситуация не прокатит. В MySQL нужно делать дамп, но как его сделать непосредственно из приложения, не очень представляю. Разве что запрашивать список таблиц, а потом считывать их содержимое...
Да и со SQLite не всё так прозрачно, так как не совсем понятно, будет ли копироваться файл, если к нему в данный момент установлено подключение... Тоже делать дамп?
В общем очень нужен совет в этом направлении.

Заранее благодарю за любую подсказку!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2014, 14:56
Ответы с готовыми решениями:

Объединение баз данных, одного формата (Mysql)
Может кто подскажет литературу, которая поможет в решении моего вопроса. Суть задачи такова, нужно...

Изменить базу данных с MySQL на SQLite в проекте с Entity Framework code first
Добрый день, подскажите пожалуйста: Имеется проект C# приложение windows form с entity framework...

Переделать код с MySQL на SQLite
Вот есть метод, который изменяет данные в БД: public void updateStudent(object sender, int...

Замена полей баз данных в целях защиты данных
Zdrastvujte! Zadanije vopshem interesnoje. Jest baza danih,tablici. Nekotorije pola tablici nado...

Взаимодействие PHP с сервером баз данных SQLite
1. Опишите класс Eshop, в нем определите свойство $db для хранения объекта БД 2. В конструкторе...

6
NapalmRain
42 / 42 / 6
Регистрация: 18.05.2010
Сообщений: 671
07.07.2014, 10:22  [ТС] 2
Очень прошу помочь разобраться хотя бы со SQLite. C MySQL как нибудь расквитаюсь.
В официальной документации нашёл раздел по online backup api, но, честно признаться, так и не понял, в какую сторону плясать.
Нужно авторитетное мнение, вообще, как лучше поступать: делать дамп или полноценный бекап файла?
0
XIST
1145 / 855 / 118
Регистрация: 01.10.2009
Сообщений: 2,569
Записей в блоге: 1
07.07.2014, 10:55 3
По Мускулу, использовать родной дамп
MySQL
1
mysqldump -u root -pmypassword --default-character-set=cp1251 mydatabase > \tmp\mydump
а уже батником по расписанию или из приложения вызывать как команду, Ваш выбор
0
lemeserg
34 / 23 / 12
Регистрация: 08.04.2013
Сообщений: 266
Завершенные тесты: 1
07.07.2014, 10:56 4
Я буду делать копирование файла с таймштампом. Но соединение по-любому надо закрывать перед операцией.
0
NapalmRain
42 / 42 / 6
Регистрация: 18.05.2010
Сообщений: 671
07.07.2014, 10:59  [ТС] 5
Цитата Сообщение от lemeserg Посмотреть сообщение
Но соединение по-любому надо закрывать перед операцией.
Отсюда и вопрос. Очень не хотелось бы закрывать соединение. Потому и пытался копать вариант online backup.
Ну или выгружать DUMP, тогда закрывать соединение не придётся уж точно.
0
lemeserg
34 / 23 / 12
Регистрация: 08.04.2013
Сообщений: 266
Завершенные тесты: 1
07.07.2014, 11:10 6
имхо выгрузить дамп операция намного дольше, чем закрыть соединение, скопировать файл и открыть соединение.
Ну или сделай по закрытию копирование.
0
NapalmRain
42 / 42 / 6
Регистрация: 18.05.2010
Сообщений: 671
09.07.2014, 15:46  [ТС] 7
В общем я всё таки решил пойти по пути создания дампа без отключения от базы.
Может кому-нибудь пригодится, простенький дампер для SQLite:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
public void CreateMDump() {
            string tableListCommand = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;";
            SQLiteCommand command = new SQLiteCommand(tableListCommand, sqliteConnection);
            SQLiteDataReader reader = command.ExecuteReader();
            string tmpStr = "";
            StreamWriter write_text;
            string filename = "Backup\\" + DateTime.Now.Date.ToString("yyyy_MM_dd") + "_sqlite_dump.SQL";
            FileInfo file = new FileInfo(filename);
            write_text = file.AppendText();
            foreach (DbDataRecord record in reader) {
                string tableName = record["name"].ToString();
                tmpStr += "DROP TABLE IF EXISTS "+tableName+";\n";
                SQLiteCommand subCommand = new SQLiteCommand("SELECT * FROM " + tableName, sqliteConnection);
                SQLiteDataReader subReader = subCommand.ExecuteReader();
                subReader.Read();
                int rowCount = (int)subReader.FieldCount;
                Console.WriteLine(rowCount.ToString());
                subReader.Close();
                string tableStructCommand = "PRAGMA table_info (" + tableName + ")";
                subCommand = new SQLiteCommand(tableStructCommand, sqliteConnection);
                subReader = subCommand.ExecuteReader();
                tmpStr += "CREATE TABLE " + tableName + " (\n";
                int curRow = 1;
                while (subReader.Read()) {
                    tmpStr += "'" + subReader.GetValue(1).ToString() + "' " + subReader.GetValue(2).ToString();
                    if (int.Parse(subReader.GetValue(3).ToString()) == 1) {
                        tmpStr += " NOT NULL";
                    }
                    if (subReader.GetValue(4)!=null) {
                        tmpStr += " DEFAULT '" + subReader.GetValue(4).ToString() + "'";
                    }
                    if (int.Parse(subReader.GetValue(5).ToString()) == 1) {
                        tmpStr += " PRIMARY KEY AUTOINCREMENT";
                    }
                    if (curRow < rowCount) {
                        tmpStr += ",\n";
                    } else {
                        tmpStr += "\n";
                    }
                    curRow++;
                }
                subReader.Close();
                subCommand.Dispose();
                subCommand = new SQLiteCommand("SELECT COUNT(*) FROM " + tableName, sqliteConnection);
                subReader = subCommand.ExecuteReader();
                subReader.Read();
                rowCount = int.Parse(subReader.GetValue(0).ToString());
                subReader.Close();
                subCommand = new SQLiteCommand("SELECT * FROM " + tableName + ";", sqliteConnection);
                if (rowCount > 0) {
                    subReader = subCommand.ExecuteReader();
                    tmpStr += "\nINSERT INTO " + tableName + " VALUES ";
                    int insCount = 1;
                    while (subReader.Read()) {
                        string tmpstr2 = "";
                        string feild;
                        for (int i = 0; i < subReader.FieldCount; i++) {
                            if (subReader.GetValue(i) == null) {
                                feild = "NULL";
                            } else {
                                feild = subReader.GetValue(i).ToString();
                            }
                            if (tmpstr2 == "") {
                                tmpstr2 = "'" + feild + "'";
                            } else {
                                tmpstr2 += ", " + "'" + feild + "'";
                            }
                        }
                        if (insCount > 50) {
                            tmpStr += ";\nINSERT INTO `" + reader.GetString(0) + "` VALUES ";
                            insCount = 1;
                        }
                        if (insCount == 1) {
                            tmpstr2 = "(" + tmpstr2 + ")";
                        } else {
                            tmpstr2 = ",(" + tmpstr2 + ")";
                        }
                        tmpStr += tmpstr2;
                        insCount++;
                    }
                    tmpStr += ";\n";
                }
                tmpStr += ");\n";
            }
            write_text.WriteLine(tmpStr);
            write_text.Close();
        }
Добавлено через 5 минут
В принципе, точно такой же дампер можно сделать и для MySQL, только там гораздо проще со структурой таблицы, достаточно сделать запрос
SQL
1
SHOW CREATE TABLE `tableName`
Но это уже если кому-то нужно.
0
09.07.2014, 15:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2014, 15:46

Оптимизация баз данных MySQL
Есть какая-нибудь хорошая литература по этому вопросу?

Не отвечает функция баз данных MySQL
Вообщем сделал чтобы можно было ввести логин и пароль но при вводе и нажатие &quot;вход&quot; выводить...

Создание нескольких баз данных mysql
Здраствуйте подскажите пожалуйсто как мне создать несколько баз данных mysql


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru