Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Тема имхо избитая, но увы не могу перекодировать базу. Вот вроде моя проблема описана (http://sqlinfo.ru/articles/info/5.html ) но видимо какие то модули php не стоят и recode недоступна (пускал php скрипт у хостера) . Пожалуста помогите советом или помогите переконверить
Одна из баз IPB около 50 метров, вторая мелка от Mambo. Ну как всегда хотелось бы срочно (ибо сайт уже вторую неделю лежит, сменил хостера и вот не могу восстановится)
Заранее спасибо.
ЗЫ: header базы:
-- MySQL dump 10.9
--
-- Host: localhost Database: vnedrog_main
-- ------------------------------------------------------
-- Server version 4.1.20
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
Неактивен
Пришлите несколько содержательных строк из дампа: одну CREATE TABLE полностью (несколько строк) и несколько содержательных - с русским текстом.
recode в упомянутой статье - не расширешие PHP, а команда UNIX-shell, в WINDOWS есть аналоги, типа Shtirlitz. Перед тем, как что-либо перекодировать, сделайте копию дампа.
Неактивен
Спасибо за ответ!
Увы, первое что я попробовал это ввести команду recode в Linuxe, но он ее так же не знает. Потом уже нашел про пхп.
Вот строчки.
CREATE TABLE `mos_bannerclient` (
`cid` int(11) NOT NULL auto_increment,
`name` varchar(60) NOT NULL default '',
`contact` varchar(60) NOT NULL default '',
`email` varchar(60) NOT NULL default '',
`extrainfo` text NOT NULL,
`checked_out` tinyint(1) NOT NULL default '0',
`checked_out_time` time default NULL,
`editor` varchar(50) default NULL,
PRIMARY KEY (`cid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
"Русский"
/*!40000 ALTER TABLE `mos_weblinks` DISABLE KEYS */;
LOCK TABLES `mos_weblinks` WRITE;
INSERT INTO `mos_weblinks` VALUES (18,35,0,'www.nivaclub.ru','http://www.nivaclub.ru/','Íèâà êëóá','2005-12-18 14:00:12',164,1,0,'0000-00-00 00:00:00',13,0,1,'target=1'),(17,35,0,'www.monsters.4wd.ru','http://www.monsters.4wd.ru/','Ïîðòà ë ëþáèòåëåé ýêñòðåìà ëüГîãî áåçäîðîæüÿ','2005-12-18 13:59:01',198,1,0,'0000-00-00 00:00:00',14,0,1,'target=1'),(16,35,0,'www.club4x4.ru','http://www.club4x4.ru/club/','4x4 Club','2005-12-18 13:57:41',224,1,0,'0000-00-00 00:00:00',15,0,1,'target=1'),(15,35,0,'www.shatoon.ru','http://www.shatoon.ru/','Âëà äèâîñòîêñêèé off-road êëóá','2005-12-18 13:56:51',182,1,0,'0000-00-00 00:00:00',16,0,1,'target=1'),(6,35,0,'www.offroad.ru','http://www.offroad.ru/','Г‚ГåäîðîæГîå äâèæåГГЁГҐ Гў Ðîññèè','2005-12-18 13:04:50',163,1,0,'0000-00-00 00:00:00',25,0,1,'target=1'),(7,35,0,'www.dorogi.net','http://www.dorogi.net/','
.........
и так далее
Еще раз спасио за помощь - жду ответа.
Алексей.
Неактивен
Насколько я вижу, база у Вас очень адекватная.
Попробуйте изменить в файле все вхождения latin1 на utf8 и
не трогать русские данные. Дамп после этого должен загрузиться
(т.к. у Вас в дампе уже стоит строка SET NAMES utf8 и сами данные
находятся в utf8).
Проблема в том, что сами таблицы создаются в кодировке latin1
(CREATE TABLE) и сервер пытается перекодировать данные на лету
utf8->latin1, что приводит к записи символов "?" вместо русских букв.
Неактивен
Попрjбовал - phpMyAdmin () выдает сообщение:
Ошибка
SQL-запрос:
CREATE TABLE `mos_core_acl_aro` (
`aro_id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`section_value` varchar( 240 ) NOT NULL default '0',
`value` varchar( 240 ) NOT NULL default '',
`order_value` int( 11 ) NOT NULL default '0',
`name` varchar( 255 ) NOT NULL default '',
`hidden` int( 11 ) NOT NULL default '0',
PRIMARY KEY ( `aro_id` ) ,
UNIQUE KEY `section_value_value_aro` ( `section_value` , `value` ) ,
UNIQUE KEY `mos_gacl_section_value_value_aro` ( `section_value` , `value` ) ,
KEY `hidden_aro` ( `hidden` ) ,
KEY `mos_gacl_hidden_aro` ( `hidden` )
) ENGINE = MYISAM DEFAULT CHARSET = utf8;
Ответ MySQL: Документация
#1071 - Specified key was too long; max key length is 1000 bytes
Причем когда восстанавливался из исходной базы то все было ок (не считая ??? вместо рус букв)
latin1 менял на utf8 с помощью sed
#1071 - это что, номер строки? Но там вроде ничего нет. Не пойму где он хочет " max key length is 1000 bytes"?
Неактивен
Хым. Обиделся на длину ключиков. Жалко.
Смысл такой. utf8 занимает 3 байта на каждый символ. Подсчет
идет при создании таблицы, а не при заливке данных. У Вас есть
ключики на section_value + value (кстати, зачем два?)
(240 + 240) * 3 = 1440 > 1000
Тривиальное решение - простить мою любовь к utf8 и поставить
однобайтовую кодировку (например, cp1251) вместо utf8.
Более сложное решение - сделать правильные ключики (а заодно
и избавиться от их дубликатов) по 166 символов на колонку
(тогда (166 + 166) * 3 = 996 < 1000).
Думаю, тривиальное решение Вас устроит больше. Но дубликаты
ключей советую все же убрать.
Неактивен
Спасибо, попробую завтра. Пока изменил на cp1251, но phpMyAdmin отваливается "502 Bad Gateway". Попробую из SSH с помощью mysqldump . Надо ли при этом указывать какие то ключи кодировки для mysqldump-а при восстановлении (или все дефолтово поймет)?
И для "общего развития" - а чем плохи "дупликаторы"? Конкретно у этой базы "перспектив" нет (перехожу на Дрюпал), но вот у ИПБ 50метровой имхо тоже может быть такое же.
Неактивен
Если PhpMyAdmin не отсекает данные, то должен понять. Я не уверен, что он
все делает правильно, но попытка не пытка. В любом случае, проигрывание дампа
в виде mysql <dump.sql должно дать правильный результат.
Дупликаторы - в смысле, двойные ключи одинаковые?
Двойные ключи плохи тем, что перестраивать при изменении данных нужно оба ключа -
Вы замедляете изменения данных. А при выборке используется все равно только один
ключ (т.к. они одинаковые). Ну и занимаемое базой место, конечно, различается
Неактивен
К сожалению пока не победил mysqldump - выдает acess denied. Не могу понять что ему не нравится. Если вдруг знаете подскажите. Пишу так
mysqldump -u имя_юзера_базы -p пароль_базы -B имя_базы_хоста -h имя_хоста < my_base.sql
После этого он запрашивает еще какой то пароль - ввожу ему пароли разные возможные ему пофиг ?!?!
Вопрос конечно скорее к моему хостеру, но вдруг я чтото уже делаю не так. (хостинг rbc виртуальный сервер)
И еще непонятно - почему при кодировке cp1251 сервер виснит (502 Bad Gateway), а например при utf8 или koi8r он ее все таки загружает? (при koi8r вопросики заменяются на вопросики и ?Ж )
Еще раз большое спасибо за ответы.
Неактивен
mysql -uuser -ppassword -hhostname dbname <my_base.sql
Обратите внимание на отсутствие пробела между -p и password. И на название команды.
Про gateway - это проблема на уровне HTTP, ее сможет решить только тот, кто знает, какие
гейтвеи использует сайт с phpmyadmin.
Неактивен
Сорри, про mysqldump опечатка. Мне удалось разобраться как дампать базу у моего нового хостера с помощью mysqldump . Но увы - все тоже самое, те же самые "?" везде
Я в отчаянье Мб вы сможете еще чтото подсказать.
Спасибо.
Неактивен
Не надо ничего дампить Надо правильно восстановить данные из существующего дампа.
Для этого нужно немножко изменить данные Вашего дампа (того, который Вы показывали
раньше). В нем надо заменить latin1->cp1251 (потому что с utf8 не получилось) и пропустить
его через команду mysql.
Если ничто другое не помогает, и если секретных данных нет, можете прислать файлик,
я его перекодирую.
Неактивен
можно на amec0.webew.ru создать временный ftp-аккаунт, чтобы закачать файл (он большой), там команда recode работает
Неактивен
УРА!!! Нашел друга с командой recode (гы-гы-гы), переконвертили базу, вобщем сделал все действия как в статье вверху и все получилось чере phpMyAdmin!!!! УРА!
Но правда это все на мелкой базе. mysqldump как оказалось только делал вид что работал
Дело за малым - разобраться с ключиками для mysqldump-а
Еще раз спасибо за помощь!!!
Удачи!
Отредактированно vnedorog (15.11.2007 00:43:03)
Неактивен
Наберите
mysqldump --help
Вот описание ключей:
http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html
Вообще таким способо можно получить ключи практически для любой текстовой программы от MySQL, включая серверы.
Неактивен
Спасибо, с ключами вроде разобрался, все заливается. Ну если быть точнее то как раз не все
Моя база имеет размер около 49Мб . После того как делаю mydump и смотрю ее через phpMyAdmin что ее размер 29Мб. При этом если я прошу хостера залить базу то phpMyAdmin пишет что она 49 Мб. MySqldump на экран вроде ничего плохого не пишет. Почему так? Я пробовал ключии типа -q не помогает. Как ее заливает хостер он не говорит. Мб есть какие то ограничения на время ссессии для не ROOT юзера или типа того? (но это вопрос наверное к хостеру)
Отредактированно vnedorog (16.11.2007 20:47:32)
Неактивен
Честно говоря, не понял, в чем вопрос. Размер базы в рабочем состоянии,
разумеется, не должен совпадать с размером получаемого дампом SQL-файла.
Неактивен
Не, я не про то. В обоих случаях я смотрю через phpMyAdmin. Если заливаю я то phpMyadmin пишет Размер: 29 Мб, если я прошу залить хостера,то phpMyAdmin про эту же базу пишет Размер: 49.7 Мб
Неактивен
Версии сервера / phpmyadmin одинаковые?
Неактивен
Все, окончательно все победил! Еще раз спасибо за советы!
Базу засовывал по мелким запросам через phpMyAdmin - токо в этом случае она закачивалась в корректной кодировке и полностью (иногда прадва обрываясь с ошибками на отдельных завтпросах) Но все работает.
Правда помимо смены хостреа еще сменил и версию ИПБ. Под новый ИПБ таблицы нужны другие (добавлены доп поля) К сожалению не знал что можно у ИПБ есть upagrae. Пробовал вручную добавить отсутсвующие поля ALTER TABLE ibf_members ADD member_login_key_expire INT( 10 ) NOT NULL DEFAULT '0';
Часть добавилась, но phpMyAdmin отваливается - видимо очень большая таблица
Вопрос: пожалуйста помогите написать запрос к базе чтобы проверить есть ли поле member_login_key_expire и значение для таблицы ibf_members
Огромное вам спасибо за помощь!
Неактивен
Самое простое
SELECT member_login_key_expire from ibf_members limit 1;
или
DESC ibf_members;
или
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ibf_members' AND COLUMN_NAME='member_login_key_expire';
С каждым постом здесь все больше убеждаюсь, что phpmyadmin это зло. Попробуйте использовать MySQL GUI Tools - http://dev.mysql.com/downloads/gui-tools/5.0.html, требуется правда право для пользователя подключаться к базе удаленно, но на хостинге это обычно можно указать в настройках юзера.
Неактивен
Можете также удалить добавленные поля ALTER TABLE ibf_members DROP member_login_key_expire; и воспользоваться обновлением, включенным в движок
Неактивен