Задавайте вопросы, мы ответим
Вы не зашли.
Здравстуйте! Возможно, вопрос немного странный, но я не нашел пока тривиального ответа на него.
Можно ли сделать так, чтобы MySQL embedded, встаиваясь в приложение, работала исключительно с файлом БД, используемым в приложении и лежащим в папке с приложением, как SQLite. Грубо говоря, чтобы приложение не лезло в таблицы привилегии, леащие в /var/... и не зависело от глобальных настроек в системе (устанавливаемых в mysql-admin) и, соответсвенно не трогало системный my.cnf.
Если можно, то как? Задача под Linux.
Неактивен
Можно запустить mysql-сервер так, чтобы он читал другой конфигурационный файл (не обязательно /etc/my.cnf). Встроить в приложение открыто распространяемую версию MySQL Community нельзя.
Неактивен
Есть библиотека libmysqld.a, которая и есть MySQL embedded, входит в MySQL Community Server. Если линковать с ней, то мы и получаем встроенный сервер. Запускается это через
mysql_server_init(mydb,0,0,0);
или, как в моем случае, через драйвер qt-mysql. Таким образом, вопрос присоединения MySQL сервера решен (или я допустил здесь принципиальную ошибку, тогда прошу пояснить, какую). Единственное но: запуск этого сервера исползует общий /etc/my.cnf и полностью согласуется с базами MySQL, доступными из MySQL Administrator (соответсвенно, и с пользователями тоже, и любые изменения настроек через mysql-admin влияют на этот встроенный сервер). Мне же нужно сделать так, чтобы мой сервер никак не был согласован с централизованным сервером.
Итого 3 вопроса:
1. Правильно ли я понял, что именно это в Community версии сделать нельзя и получается, что при переносе на другую машину даже с прилинкованным libmysqld.a mysql работать не будет? Если все же желаемое осуществимо, то как это сделать?
2. Как именно в embedded-версии (в не embedded это понятно) подключить другой конфигурационный файл?
3. Есть ли какие-либо альтернативы SQLite с более широкой поддержкой стандарта SQL. Единственное, почему не устраивает SQLite - это отсутствие поддержки некоторых конструкций SQL (например, TRIGGER)
Неактивен
Конфиг-файл надо написать свой (вопросы 1 и 2):
http://dev.mysql.com/doc/refman/5.5/en/ … tions.html
Триггеры в sqlite (вопрос 3):
http://www.sqlite.org/lang_createtrigger.html
Что касается MySQL embedded — Вы обязаны распространять приложение,
слинкованное бинарно с библиотекой GPL2 по лицензии GPL2 или выше.
Неактивен
Нашел замечательную статью, где разжевано все про начало работы с MySQL Embedded.
http://dev.mysql.com/tech-resources/articles/embedding-mysql-server.html
Исправил все согласно этой статье. Теперь что мы имеем:
Неактивен
А в конфиге у Вас написано?
Неактивен
в конфиге:
# my.cnf
[libmysqd_server]
datadir = ./data
language = ./english
skip-innodb
[libmysqld_client]
language = ./english
Папки data и english существуют, english скопирована из /usr/share/mysql.
По совету людей удалил весь mysql подчистую, предварительно поместив libmysqld в папку с программой, указав линковщику, где библиотеку искать. Скомпилил, запустил. теперь mysql_library_init возвращает 1, а mysql_init нулевой указатель.
Похоже, косяк где-то в libmysqld.a. Ставил версию из репозиториев (5.1). Известно ли что-нибудь на этот счет?
Неактивен
А ошибку не возвращает?
Неактивен
Из документации по mysql_init:
Errors
In case of insufficient memory, NULL is returned.
Чтобы посмотреть текст ошибки, должен быть создан mysql объект, т.е. mysql_init должен завершится успешно. Однако этого не происходит, и все падает, т.е. нельзе посмотреть текст ошибки, т.к. объект mysql банально не создается при отсутствии установленного mysql
Неактивен
Что-то Вы делаете страшное и ужасное.
Неактивен
Спасибо за пример! В точности его скопировал, переустановил заново, под чистую mysql, скомпилировал пример, и встретил уже знакомые ошибки. mysql_library_init требует файл привилегий, выдает 1, после чего mysql_init возвращает NULL. Если запускать из-под рута, то:
Неактивен
Воо, Вам не хватило прав подсоединиться к базе. Нужно выдать права,
чтобы root@localhost мог присоединиться без пароля. Можете схитрить
и прописать user и password в раздел libmysqld_client my.cnf. Ну или
подсунуть таки базу mysql с правильными грантами, записанными внутри.
Под sudo запускать не нужно! Скорее всего, в my.cnf Вы указали плохой
путь к базе. В идеале путь должен быть абсолютным. Может быть ./data,
но просто data быть не может. И у текущего пользователя должны быть
права для записи в этот каталог и все файлы, разумеется.
Неактивен