powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL embedded
21 сообщений из 21, страница 1 из 1
MySQL embedded
    #39146940
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здраствуйте, возникла проблема.
дело в том что в проекте используется встроенный Mysql, и подключение выполняется через libmysqld.
само подключение файлов настроено как нужно (наверное), при запуске клиентской программы код которой инициализирует библиотечный файл libmysqld, программа создает нужные файлы в указанном каталоге (ibdata1, ib_logfile0 и т.д). но как только код доходит до строчки "mysql = mysql_ini(NULL)", дальше он не двигается и консольное приложение просто закрывается. В чем может быть проблема?

Пример:

Код: plaintext
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.
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <winsock.h>
#include "mysql.h"

using namespace std;

MYSQL* mysql;
MYSQL_RES *results;
MYSQL_ROW record;

static char *server_options[] = {"NULL", "--defaults-file=my.ini", NULL};
static char *server_groups[] = { "client", NULL };
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;

int main()
{
	// инициализация библиотеки MySQL
	mysql_library_init(num_elements, server_options, server_groups);
	cout << "Выше код отработал";

	mysql = mysql_init(NULL);
	cout << "Это сообщение не будет отображено";

	mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "client");
	mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);
	
	mysql_real_connect(mysql, NULL, NULL, NULL, NULL, 0, NULL, 0)
	mysql_query(mysql, "CREATE TABLE food (id int, name varchar(10))");

	mysql_close(mysql);
	mysql_library_end();

	_getch();
	return 0;
}
...
Рейтинг: 0 / 0
MySQL embedded
    #39146978
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ucali,

Нужно проверять значение, возвращаемое функцией mysql_library_init. Вероятно, она завершается неуспешно.
...
Рейтинг: 0 / 0
MySQL embedded
    #39147260
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возвращает некорректное значение отличное от нуля.
Аргументы передаются верные. Или нет? Может не те параметры заданы в передаваемых функции аргументах?
...
Рейтинг: 0 / 0
MySQL embedded
    #39147283
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UcaliВозвращает некорректное значение отличное от нуля.Значит происходит ошибка.

Ucali
Код: plaintext
1.
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;

-1 тут зачем?
...
Рейтинг: 0 / 0
MySQL embedded
    #39147302
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftUcali
Код: plaintext
1.
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;


-1 тут зачем?А, понял. Что бы последний NULL не читался. Правда, его можно было бы убрать.
...
Рейтинг: 0 / 0
MySQL embedded
    #39147359
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что же это может быть? Может не правильно параметры прописаны в my.ini? Или какого-то параметра нужного там нет.
Он выглядит так:

[client]
basedir=C:\\test
datadir=C:\\test\data

innodb_buffer_poll_size=256M
innodb_additional_mem_poll_size=10M
innodb_log_file_size=5M
innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1

или дело вовсе не в нем.
...
Рейтинг: 0 / 0
MySQL embedded
    #39147379
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UcaliC:\\testа зачем двойные слэши?
...
Рейтинг: 0 / 0
MySQL embedded
    #39147457
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это указано в документации
...
Рейтинг: 0 / 0
MySQL embedded
    #39147468
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в любом случае со слэшами все впорядке (C:\\ и C:/)
...
Рейтинг: 0 / 0
MySQL embedded
    #39147838
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ucali,

так добавьте что-то типа
Код: sql
1.
2.
3.
4.
.....
mysql = mysql_init(NULL);
printf("error = ", mysql_error(mysql));
.......

или как там точнее в Си....
и здесь:
авторdatadir=C:\\test\dataвсе таки одинаковые слэши поставить.... (вперемешку одинар и двойной)
...
Рейтинг: 0 / 0
MySQL embedded
    #39148089
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
mysql = mysql_init(NULL);
printf("error = ", mysql_error(mysql));


да, только строка
Код: plaintext
1.
printf("error = ", mysql_error(mysql));


не выполнится, после
Код: plaintext
1.
mysql = mysql_init(NULL); 


после это кода вообще ничего не выполняется, в этом и проблема.
...
Рейтинг: 0 / 0
MySQL embedded
    #39148285
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ucaliне выполнится, после
Так поставь её перед .
...
Рейтинг: 0 / 0
MySQL embedded
    #39148296
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет смысла ставить ее перед .
проблема с функцией mysql_library_init() , она возвращает значение отличное от 0, т.е это ошибка (в чем она заключает не ясно).
mysql_error() взаимодействует с переменной mysql которая инициализируется обьектом функцией mysql_init() .
написание mysql_error() перед mysql_init() ничего не сделает - переменная mysql еще не инициализирована.
описал mysql_error() перед mysql_init() - ничего не выводит (возвращается пустая строка).
может не правильно понимаю.
...
Рейтинг: 0 / 0
MySQL embedded
    #39148401
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо, тогда смотрите лог MySQL, ведь какой-то файл HostNamePC.err должен же быть в каталоге базы как и лог-файл
если его нет, то добавьте в файл ини опцию явно
База же пытается "стартануть", раз вы говорите, что при первом запуске Innodb файлы создаются.
Вообще, для начала уберите опции InnoDB из My.ini пусть для проверки все будет по дефолту
Думаю, что это все таки из-за параметров инициализации
можно посмотреть СИшную ошибку
printf("error = ", stderr); опять же не знаю что она подскажет
...
Рейтинг: 0 / 0
MySQL embedded
    #39148539
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
отлично, отображение лог-файла включено. после запуска в лог-файл записались различные ошибки.
причина была в параметрах которые не были добавлены в .ini (innodb_data_home_dir=C:\\test\\data и innodb_data_file_path=ibdata1) и в содержимом каталога data, оно должно быть таким как mysql\data\*.
теперь код продолжает работу.
функция mysql_library_init() по прежднему возвращает отличное значение от 0.
использовал функцию mysql_errno() - возвращает код ошибки 2000 (неизвестная ошибка mysql).
по прежднему что-то не инициализировано в my.ini или в передаваемых аргументах функции mysql_library_init().
...
Рейтинг: 0 / 0
MySQL embedded
    #39148542
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ucaliтеперь код продолжает работу.А в логе-то что? Ошибки все исчезли?
...
Рейтинг: 0 / 0
MySQL embedded
    #39148550
Ucali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
осталось только одна ошибка:

Код: plaintext
1.
mysql_embedded: Unknown error 1146
...
Рейтинг: 0 / 0
MySQL embedded
    #39148708
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это похоже опять ошибка InnoDB
удалите опять все файлы с /data/
пусть база создастся заново
и покажИте текст лог файла, miksoft уже просил у вас
проще будет, если вы проверку параметров сделаете на обычной базе и "устаканите" их
...
Рейтинг: 0 / 0
MySQL embedded
    #39148785
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ucaliотлично, отображение лог-файла включено. после запуска в лог-файл записались различные ошибки.
причина была в параметрах которые не были добавлены в .ini (innodb_data_home_dir=C:\\test\\data и innodb_data_file_path=ibdata1) и в содержимом каталога data, оно должно быть таким как mysql\data\*.
теперь код продолжает работу.
функция mysql_library_init() по прежднему возвращает отличное значение от 0.
использовал функцию mysql_errno() - возвращает код ошибки 2000 (неизвестная ошибка mysql).
по прежднему что-то не инициализировано в my.ini или в передаваемых аргументах функции mysql_library_init().
нормальное добавление параметра
innodb_data_file_path = ibdata1:10M:autoextend
приводите полный точный my.ini во избежание доп вопросов
лучше взять любой my*.ini из любого скачанного MySQL-server-noinstall
и скопировать параметры оттуда, этот файл не "любит" ошибок (т.е. сервер MySQL )
...
Рейтинг: 0 / 0
MySQL embedded
    #39360462
antoshib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, что-нибудь получилось?
Сейчас тоже пытаюсь запустить приложение со встроенным MySQL, но оно рушится.
MySQL 5.5.30 собирал из исходников под виндой с MS VS-express 2010, сам сервер пробовал - запускается и работает нормально, а мое приложение на основе собранной libmysqld ломается. В логах выдаёт следующее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
161202 18:30:39 InnoDB: !!!!!!!! UNIV_DEBUG switched on !!!!!!!!!
161202 18:30:39 InnoDB: The InnoDB memory heap is disabled
161202 18:30:39 InnoDB: Mutexes and rw_locks use Windows interlocked functions
161202 18:30:39 InnoDB: Compressed tables use zlib 1.2.3
161202 18:30:39 InnoDB: Initializing buffer pool, size = 128.0M
161202 18:30:39 InnoDB: Completed initialization of buffer pool
161202 18:30:39 InnoDB: highest supported file format is Barracuda.
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
161202 18:30:39  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
161202 18:30:40  InnoDB: Waiting for the background threads to start



Кусок сбойного исходника:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    MYSQL *mysql;
    mysql_library_init(0, NULL, NULL);
    mysql = mysql_init(NULL);

    mysql_options(mysql, MYSQL_READ_DEFAULT_FILE,   "my.ini");
    mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP,  "mysqld");
    mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);

    mysql_real_connect(mysql, NULL,NULL,NULL, "database1", 0, NULL, 0 );



Такое ощущение, что файл my.ini игнорируется, поскольку в нём
указано одно расположение папки с данными data, а логи создаются в папке data
рядом с exe-шником. При этом обращение к my.ini все таки происходит в момент запуска
приложения, это я проверил программой stat.

Код: sql
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.
[client]
port=4406

[mysql]
default-character-set=utf8

[mysqld]
port=4406

basedir="C:/mysql/sql/"
datadir="C:/mysql/sql/data/"

character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=0
table_cache=256
tmp_table_size=18M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=35M
key_buffer_size=8M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=92M
innodb_log_file_size=46M
innodb_thread_concurrency=8
...
Рейтинг: 0 / 0
MySQL embedded
    #39361028
antoshib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antoshib,

подправил кое-что, сейчас заработало.
Код: plaintext
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.
MYSQL       *mysql;

static char *server_options[]= { "mysql_test", "--defaults-file=my.ini", NULL };
int             num_elements = (sizeof(server_options) / sizeof(char *)) - 1;
static char *server_groups[] = { "client", "mysqld" "mysql", NULL };

int main(void)
{
//....

    mysql_library_init(num_elements, server_options, server_groups);
    mysql = mysql_init(NULL);
    
    mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP,  "client");
    mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);

    if (mysql != mysql_real_connect( mysql, NULL,NULL,NULL, "mysql", 0, NULL, 0 )){
        qDebug() << "Warning! mysql_real_connect faulted!";
        return;
    }

//...

    if (!mysql) return;

    mysql_close(mysql);
    mysql_library_end();

}



Вроде как my.ini зачитывается и без него программа ломается, но настройки, указанные
в секции mysqld (пути basedir и datadir) не воспринимаются и происходит обращение к папке data
из текущего каталога приложения. Можно забить на это, но хотелось бы ситуацию прояснить.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL embedded
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]