Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL embedded / 21 сообщений из 21, страница 1 из 1
14.01.2016, 08:28
    #39146940
Ucali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
здраствуйте, возникла проблема.
дело в том что в проекте используется встроенный 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
14.01.2016, 09:41
    #39146978
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
Ucali,

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

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

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


-1 тут зачем?А, понял. Что бы последний NULL не читался. Правда, его можно было бы убрать.
...
Рейтинг: 0 / 0
14.01.2016, 14:38
    #39147359
Ucali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
что же это может быть? Может не правильно параметры прописаны в 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
14.01.2016, 14:46
    #39147379
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
UcaliC:\\testа зачем двойные слэши?
...
Рейтинг: 0 / 0
14.01.2016, 16:02
    #39147457
Ucali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
Это указано в документации
...
Рейтинг: 0 / 0
14.01.2016, 16:11
    #39147468
Ucali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
в любом случае со слэшами все впорядке (C:\\ и C:/)
...
Рейтинг: 0 / 0
15.01.2016, 01:36
    #39147838
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
Ucali,

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

или как там точнее в Си....
и здесь:
авторdatadir=C:\\test\dataвсе таки одинаковые слэши поставить.... (вперемешку одинар и двойной)
...
Рейтинг: 0 / 0
15.01.2016, 11:50
    #39148089
Ucali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
Код: 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
15.01.2016, 14:53
    #39148285
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
Ucaliне выполнится, после
Так поставь её перед .
...
Рейтинг: 0 / 0
15.01.2016, 15:05
    #39148296
Ucali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
нет смысла ставить ее перед .
проблема с функцией mysql_library_init() , она возвращает значение отличное от 0, т.е это ошибка (в чем она заключает не ясно).
mysql_error() взаимодействует с переменной mysql которая инициализируется обьектом функцией mysql_init() .
написание mysql_error() перед mysql_init() ничего не сделает - переменная mysql еще не инициализирована.
описал mysql_error() перед mysql_init() - ничего не выводит (возвращается пустая строка).
может не правильно понимаю.
...
Рейтинг: 0 / 0
15.01.2016, 17:30
    #39148401
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
хорошо, тогда смотрите лог MySQL, ведь какой-то файл HostNamePC.err должен же быть в каталоге базы как и лог-файл
если его нет, то добавьте в файл ини опцию явно
База же пытается "стартануть", раз вы говорите, что при первом запуске Innodb файлы создаются.
Вообще, для начала уберите опции InnoDB из My.ini пусть для проверки все будет по дефолту
Думаю, что это все таки из-за параметров инициализации
можно посмотреть СИшную ошибку
printf("error = ", stderr); опять же не знаю что она подскажет
...
Рейтинг: 0 / 0
15.01.2016, 21:31
    #39148539
Ucali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
отлично, отображение лог-файла включено. после запуска в лог-файл записались различные ошибки.
причина была в параметрах которые не были добавлены в .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
15.01.2016, 21:32
    #39148542
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
Ucaliтеперь код продолжает работу.А в логе-то что? Ошибки все исчезли?
...
Рейтинг: 0 / 0
15.01.2016, 21:52
    #39148550
Ucali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
осталось только одна ошибка:

Код: plaintext
1.
mysql_embedded: Unknown error 1146
...
Рейтинг: 0 / 0
16.01.2016, 11:54
    #39148708
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
это похоже опять ошибка InnoDB
удалите опять все файлы с /data/
пусть база создастся заново
и покажИте текст лог файла, miksoft уже просил у вас
проще будет, если вы проверку параметров сделаете на обычной базе и "устаканите" их
...
Рейтинг: 0 / 0
16.01.2016, 16:19
    #39148785
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
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
05.12.2016, 13:54
    #39360462
antoshib
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
Привет, что-нибудь получилось?
Сейчас тоже пытаюсь запустить приложение со встроенным 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
06.12.2016, 10:17
    #39361028
antoshib
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL embedded
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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL embedded / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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