Krzysztof Bielecki

Krzysztof Bielecki Jestem smutny i
nudny

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Mam od jakiegoś czasu kopię bazy na dysku swojego komputera.
Nie jestem informatykiem, a swoją stronę prowadzę hobbystycznie. Dzięki pomocy osób z tego forum udało mi się skopiować bazę danych na dysk MySQL Administratorem.

Teraz próbuję wgrać ją na nowy serwer, jednak nie udaje mi się wgrać kilku tabel, tych, które zajmują najwięcej. Z mniejszymi MySQL Administrator radzi sobie bez problemu.

Cóż radzicie w tej sytuacji? W jaki sposób można zmusić MySQL Administratora do poradzenia sobie z przesyłaniem dużych tabel, które zajmują kilkadziesiąt albo i kilkaset MB. Czy trzeba ustawić coś w programie, żeby podzielił je sobie na mniejsze porcje?

A może trzeba rozwiązać to w jeszcze inny sposób? Będę wdzięczny za pomoc :)

Poniżej podaję przykładowy error, jaki dostaję:

Error while executing this query:INSERT INTO `xforum_search_wordlist` (`word_text`,`word_id`,`word_common`) VALUES
(0x706FC2BFC2B164616E6961,207262,0),
(0x706FC2BFC2B1646C6977796D,207263,0),
(0x70726F776F6B756AC2B1636F,207264,0),
(0x70726F776F6B756AC2B16379,207265,0),
(0x70727A6563686F647AC2B16379,207266,0),
(tu bardzo dużo innych liczb)
(...)
The server has returned this error message:Duplicate entry 'adresata' for key 1
MySQL Error.Krzysztof Bielecki edytował(a) ten post dnia 16.08.09 o godzinie 11:47
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

A pokaż CREATE TABLE dla tabeli. Masz zduplikowaną wartość dla unikalnego indeksu, dlatego dostajesz błąd.
Krzysztof Bielecki

Krzysztof Bielecki Jestem smutny i
nudny

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Witaj, dzięki za odpowiedź. Chętnie podam dodatkowe informacje, tylko potrzebuję nieco bardziej łopatologicznych wytycznych, bo kompletnie się na tym nie znam. Gdzie mogę znaleźć informację, o którą pytasz? Moją bazę danych mam w postaci nieco ponad 100 MB pliku. Ponadto MySQL Administrator pozwala mi na podgląd tabel, które składają się na bazę, ale ich zawartości już nie widzę.

Swoją drogą sprawa wydaje mi się o tyle dziwna, że nic z tymi plikami nie robiłem. Po prostu pobrałem MySQL Administratorem bazę danych z jednego serwera, a następnie zdecydowałem się ją wgrać na drugi. Problem występuje w przypadku trzech tabel.Krzysztof Bielecki edytował(a) ten post dnia 16.08.09 o godzinie 10:17
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

W pliku z backupem znajdź

CREATE TABLE `forum_search_wordlist` ...

Skopiuj i wklej tutaj wszystko od CREATE aż do średnika;
Krzysztof Bielecki

Krzysztof Bielecki Jestem smutny i
nudny

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Oto tekst, który udało mi się wygrzebać. Wkleiłem nieco więcej.

--
-- Definition of table `xforum_search_wordlist`
--

DROP TABLE IF EXISTS `xforum_search_wordlist`;
CREATE TABLE `xforum_search_wordlist` (
`word_text` varchar(50) character set latin1 collate latin1_bin NOT NULL default '',
`word_id` mediumint(8) unsigned NOT NULL auto_increment,
`word_common` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`word_text`),
KEY `word_id` (`word_id`)
) ENGINE=MyISAM AUTO_INCREMENT=238815 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `xforum_search_wordlist`
--

/*!40000 ALTER TABLE `xforum_search_wordlist` DISABLE KEYS */;
INSERT INTO `xforum_search_wordlist` (`word_text`,`word_id`,`word_common`) VALUES
(0x6578616D706C65,1,0),
(0x706F7374,2,0),
(0x7068706262,3,0),
(0x696E7374616C6C6174696F6E,4,0),
(0x64656C657465,5,0),
(0x746F706963,6,0),
(...)
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

PRIMARY KEY (`word_text`)

To oznacza, że na kolumnie `word_text` zdefiniowany tzw. klucz podstawowy. W takiej kolumnie mogą znajdować się tylko unikalne wartości. Tymczasem najwyraźniej w Twoim backupie jakimś cudem dwukrotnie znalazła się w tej kolumnie wartość 'adresata'.

'adresata' w szesnastkowym to: 0x6164726573617461

(tu masz narzędzie do zamiany http://home2.paulschou.net/tools/xlate/)

No i teraz najciekawsze: co z tym zrobić?
Nie wiem czemu służy ta tabela, ale ja bym spróbował tak:
1. Zrobić sobie kopię pliku z backupem ;)
2. Z definicji tabeli usunąć
PRIMARY KEY (`word_text`),
3. Spróbować wgrać dane.
4. Jeśli się uda, to po wgraniu usunąć duplikaty z kolumny `word_text` i przywrócić klucz podstawowy w tej kolumnie (to już możesz zrobić z poziomu phpMyAdmin albo MySQL Query Browser)
Krzysztof Bielecki

Krzysztof Bielecki Jestem smutny i
nudny

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Dzięki! Coś idzie do przodu.

Usunąłem PRIMARY KEY (`word_text`) z treści backupu i tym razem dane wgrały się bez problemów.

Rozumiem, że teraz czas na punkt 4, który opisałeś w następujący sposób:

"Jeśli się uda, to po wgraniu usunąć duplikaty z kolumny `word_text` i przywrócić klucz podstawowy w tej kolumnie (to już możesz zrobić z poziomu phpMyAdmin albo MySQL Query Browser)"

W jaki sposób powinienem to zrobić?
Czy wystarczy, że w phpMyAdminie wpiszę i uruchomię polecenie PRIMARY KEY (`word_text`)?
A cóż z usuwaniem duplikatów i czy ich usuwanie jest konieczne? W końcu z jakiegoś powodu były w starej bazie, więc może warto je tam zostawić i wystarczy dodać tylko primary key, a duplikatów nie usuwać?

Pozdr!

Ps. W całej tej sprawie najbardziej zastanawia mnie to, że te błędy się pojawiły. Myślałem, że MySQL Administrator po prostu skopiuje treść bazy i wgra ją w nowe miejsce.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Nie uda Ci się dodać PRIMARY KEY, jeżeli w kolumnie są duplikaty. Skąd one się tam wzięły, to zaiste zagadka. MySQL Administrator ich raczej nie dodał.

Możesz spróbować uruchomić taki SQL

ALTER IGNORE TABLE xforum_search_wordlist ADD PRIMARY KEY (`word_text`);

To powinno załatwić usunięcie duplikatów i wstawienie klucza za jednym zamachem.Michał Jarosz edytował(a) ten post dnia 16.08.09 o godzinie 12:52
Krzysztof Bielecki

Krzysztof Bielecki Jestem smutny i
nudny

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Michał Jarosz:
Nie uda Ci się dodać PRIMARY KEY, jeżeli w kolumnie są duplikaty. Skąd one się tam wzięły, to zaiste zagadka. MySQL Administrator ich raczej nie dodał.

Moje bazy danych to forum w phpBB. Na przestrzeni kilku lat dodawałem tam różne modyfikacje i aktualizacje. Możliwe, że któraś z nieoficjalnych modyfikacji albo moja nieuwaga przy dokonywaniu ręcznej aktualizacji spowodowała jedną z poniższych sytuacji:
- primary key pojawił się tam, gdzie nie trzeba
- duplikaty pojawiły się tam, gdzie nie trzeba
- coś innego pojawiło się tam, gdzie nie trzeba, doprowadzając do obecnej sytuacji
Mam jeszcze dostęp do starego serwera, więc jakby co mogę coś tam sprawdzić, np. istnienie duplikatów, jeśli będzie to konieczne dla pomyślnego rozwiązania mojego problemu.
Możesz spróbować uruchomić taki SQL
ALTER IGNORE TABLE xforum_search_wordlist ADD PRIMARY KEY (`word_text`);
To powinno załatwić usunięcie duplikatów i wstawienie klucza za jednym zamachem.

Cały czas boję się tylko jednej rzeczy, a mianowicie takiej, że może te duplikaty jednak powinny tam istnieć. Mam pewne obawy (aczkolwiek jedynie intuicyjne, bo nie mam wiedzy merytorycznej), że usunięcie duplikatów doprowadzi do nowych błędów, bo przecież skoro wcześniej one były w tej bazie i forum działało tak jak trzeba, to ich brak może zaowocować niespodziankami w przyszłości. Czy moje obawy są na wyrost? Póki co wgrywam pozostałe dwie problemowe tabele w taki sposób, w jaki wgrałem tę pierwszą. Zajmują blisko 100 MB, więc trochę mi to zajmie i do czasu ich wgrania wstrzymam się z tym ALT IGNORE TABLE, a jeśli będziesz miał jakieś pomysły odnośnie tej kwestii, to chętnie się z nimi zapoznam.Krzysztof Bielecki edytował(a) ten post dnia 16.08.09 o godzinie 13:06
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Spróbuj może zapytać na jakimś forum poświęconym phpBB, o co tutaj może chodzić i czy usunięcie duplikatów w tych tabelach może mieć jakieś negatywne skutki.

Moim zdaniem nic złego nie powinno się stać, ale bez znajomości samego skryptu na 100% nie mogę być pewny... zresztą zawsze masz backup :P
Krzysztof Bielecki

Krzysztof Bielecki Jestem smutny i
nudny

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Wygląda na to, że xforum_search_wordlist wraz z pozostałymi tabelami "search" tworzy indeks wyszukiwarki wiadomości na forum. Bez danych z tych tabel nie będzie możliwe przeszukiwanie postów, które już zostały napisane. Ponoć istnieją skrypty, które są w stanie przeanalizować zawartość forum i wygenerować plik z nową wersją tych tabel, więc wygląda na to, że dopóki samo forum działa, to te tabele są odtwarzalne. Ponoć część ludzi celowo pomija je podczas backupu, bo zajmują bardzo dużo miejsca.

Teraz wygrywam ostatnią problemową tabelę. Ma blisko 100 MB i zapisane są w niej treści wszystkich postów, jakie zostały napisane na forum. O ile w przypadku wyszukiwarki utrata duplikatów nie byłaby aż tak dużą tragedią, to tu wydaje się to być szczególnie ważne, bo po prostu obawiam się, że podczas eliminowania duplikatów utracone zostaną np. posty, w których padło to samo słowo albo posty, które były w pewnym stopniu podobne tudzież ich fragmenty (nie wiem w jaki sposób działa plik i czy duplikaty to całe wiadomości czy pojedyncze słowa).

Niestety phpbb2 nie jest już supportowane, ludzie poprzerzucali się na phpbb3, więc na forach o phpbb2 powitała mnie blokada pisania nowych wiadomości i zachęta do przejścia na phpbb3.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

A w tabeli z treścią też miałeś duplikaty na kluczu głównym?
Krzysztof Bielecki

Krzysztof Bielecki Jestem smutny i
nudny

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

W tabeli z treścią też mi wyskoczył jakiś error, jednak wtedy go nie zanotowałem. Teraz wygrywam tabelę z treścią jeszcze raz, jak błąd wyskoczy mi ponownie, to wtedy potwierdzę, czy tam problem jest identyczny.

W międzyczasie udało mi się znaleźć w sieci kogoś, kto miał podobny problem z tabelą wyszukiwarki. Otrzymał następującą odpowiedź:
"Probably you have a different "collation" setting on the old and new databases, so accented characters are getting converted to the unaccented equivalent, making some of the words in the search tables appear the same."
Nie do konca rozumiem zdanie o "collation", ale jeśli dobrze pojmuję całą resztę, to duplikaty mogły powstać w wyniku tego, że ze słów zniknęły akcenty i np. ze słowa "żółw" zrobiło się "zolw", ktore stalo sie duplikatem dla juz istniejacego slowa "zolw".
Krzysztof Bielecki

Krzysztof Bielecki Jestem smutny i
nudny

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Hm, dziwne. Podczas wgrywania tabeli z treścią nie wyskoczył żaden błąd. Dla pewności ponownie zgrałem backup bazy i porównałem wielkości obu plików. Oba mają około 116 MB, ale ten nowszy nie wiedzieć czemu ma o 250 kb więcej, co mnie dziwi, bo przecież nie powinno przybywać danych podczas odtwarzania backupu.

Teraz nie wiem czy oczyszczać te duplikaty czy nie. Myślę, że skoro dotyczy to tylko wyszukiwarki, to nie będę już nic zmieniał, no chyba, że stworzenie klucza głównego jest niezbędne dla działania wyszukiwarki.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wgranie dużej bazy za pomocą MySQL Administrator

Bez indeksu na tej kolumnie wyszukiwarka prawdopodobnie będzie sporo wolniejsza.

Następna dyskusja:

Jak dostac sie do bazy MySQL




Wyślij zaproszenie do