Sziasztok!
Adott egy nagyon szar db, a feladataink koze tartozik, hogy azt ujratervezzuk. Ez megtortent, most irni kellene egy scriptet, amivel at tudjuk huzni egyik db-bol a masikba az adatokat.
Arra jutottam, hogy az lenne a legegyszerubb/leghatekonyabb, ha modulonkent irnank egy-egy stored procedure-t, amiben egy kurzorral vegigszaladnank az erintett tablakon es beraknank az adatokat a sajatjainkban.
A problema az, hogy rengeteg oszlopunk van, es Google csak abban tudott segiteni, hogy "FETCH column INTO variable"-vel egyesevel dolgozzam fel a dolgokat, majd azokat inserteljem be. Tud esetleg valaki olyan megoldast, amivel ezt meg tudnam kerulni es egy tablaba rakjak bele mindig egy sort, amit aztan fel tudok dolgozni INSERT INTO `users` (`username`, ...) VALUES (`original`.`username`, ...); modszerrel?
- 1547 megtekintés
Hozzászólások
INSERT INTO table SELECT.... ha egyezik az oszlopszám. Ha nem egyezik, akkor sem sokkal bonyolultabb. :)
Ha összetetteb variálások kellenek, akkor mindenképp egy perl, php stb scriptet javaslok a bűvészkedésre.
- A hozzászóláshoz be kell jelentkezni
ön nyert
- A hozzászóláshoz be kell jelentkezni
ezt igy kurzor nelkul, vagy hogyan?
- A hozzászóláshoz be kell jelentkezni
Ez egy INSERT parancs, ehhez miért kéne kurzor?
- A hozzászóláshoz be kell jelentkezni
insert into new_user.new_table
select t1.colkell1, t1.colkell2, t2.colkell33
from
old_user.old_table1 t1,
old_user.old_table2 t2,
...
where t1.colx = t2.colx
a kapcsolatokat, céloszlopokat te tudod.
szerk.:
kurzor nélkül.
- A hozzászóláshoz be kell jelentkezni
ok, leesett, ezt igy siman.
a gond ezzel az, hogy van, ahova statikusan kell berakni adatot, tehat values is kellene, meg van, hogy a regiben egy dolog eldonti, hogy melyik lehetoseg, az ujban viszont tobbet lehet megadni neki, szoval egy fieldtol fuggoen kell valamelyik oszlopban a true-t becheckelni. Azt is meg lehet igy csinalni?
- A hozzászóláshoz be kell jelentkezni
Vannak függvények, kifejezések is, olyat is lehet a select-be írni. Az eredmény az adott kifejezés/függvény eredménye lesz.
- A hozzászóláshoz be kell jelentkezni
Meg tudod írni azt a selectet, ami kell az új táblába? Ha igen, akkor eléírsz egy INSERT INTO foo -t és nyomsz egy enter-t/rákattintasz az execute-ra/stb.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Ez eddig ok, csak kellene olyan is bele, hogy valami statikus, bar ezt meg tudom oldani azzal is, hogy kihagyom a valuesbol, aztan utana vegigupdatelem a tablat where feltetel nelkul.
A masik gond az, hogy van olyan, hogy user type, ami a regiben egy varchar volt, es bele volt irva, hogy milyen tipusu a user. Az ujban viszont azt kertek, hogy egy usernek tobb tipusa is lehessen, szoval most a tipusok fel vannak sorolva kulon TINYINT(1) oszlopokban. Erre kellene valami otlet, valamint arra, hogy ha legyartom a user_profilet, utana bele kellene rakni a usernek a profile_id oszlopaba a linkelt profilet. Kurzorral ez egy LAST_INSERT_ID() volt, most viszont nem tudom, hogy lehetne, ha egymas utan fut le a ket query a ket kulon tablara.
Eddig ennyi jutott eszembe, valakinek otlet? :)
- A hozzászóláshoz be kell jelentkezni
csak kellene olyan is bele, hogy valami statikus,
A
select col1, 'string', col2 from tab
megvan?
Az ujban viszont azt kertek, hogy egy usernek tobb tipusa is lehessen, szoval most a tipusok fel vannak sorolva kulon TINYINT(1) oszlopokban.
http://dev.mysql.com/doc/refman/5.1/en/control-flow-functions.html#func…
Erre kellene valami otlet, valamint arra, hogy ha legyartom a user_profilet, utana bele kellene rakni a usernek a profile_id oszlopaba a linkelt profilet.
most viszont nem tudom, hogy lehetne, ha egymas utan fut le a ket query a ket kulon tablara.
Először legyártod a profile táblát, mégpedig az eredeti adatbázisban szereplő ID-ket használva (azaz változatlan ID-kkel kell berakni az új adatbázisba).
Innen szerintem megoldod magadtól is :)
- A hozzászóláshoz be kell jelentkezni
Az a-t es c-t tokeletesen megvalaszoltad, ez igy jol lesz :) A b-vel viszont az a problemam, hogy a CASE-nek kellene eldontenie, melyik oszlopba kell true-t raknom.
- A hozzászóláshoz be kell jelentkezni
IF(col='x','true','false'),IF(col='y','true','false'),IF(col='z','true','false')
tényleg ennyire késő van?
- A hozzászóláshoz be kell jelentkezni
Ugy tunik... reggel 7-kor keltem, fel 8-kor ertem haza melobol, azota megneztem egy How I Met Your Mothert meg egy Houset (ezek jottek ki ma), nagyobbreszt meg ezen gondolkodtam. Lehet, hogy mar nem fog ugy az agyam :D
- A hozzászóláshoz be kell jelentkezni
Filmnézés után már nem melózunk, ez alap. Utána már csak vegetatív műveleteket végzünk :D
- A hozzászóláshoz be kell jelentkezni
Mondjuk szerintem többet szivatod magad a live migrationnal, mintha készítenél valami scriptet/programot, ami elfogadható időn belül legenerálja a régi adatbázisból az újat vagy akár SQL script formájában.
Vagy ha tényleg ennyire élet-halál kérdése a 24/7/365 órás működés (gondolom 1-2 óra azért belefér), akkor szerintem van arra is pénz, hogy átmigráljátok és a régi rendszerbe belefejlesszétek, hogy egy migrációs rétegen keresztül kommunikáljon mindkét adatbázisba vagy valami egyéb megoldást találjatok ki rá.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
nem live migration kell, az kell, hogy egy ejszakara leall a site egy maintanance mode-al, es akkor kicsereljuk az egesz site-ot ugy, ahogy van. Adatokat nem igazan menthetjuk le elotte, mert ha megy a site, akkor kozben ugy valtoznak. A migracios reteg pedig kurva nagy szopas lenne, foleg, hogy a regi site kodjahoz nem ferunk hozza, mert azt mas ceg irta.
- A hozzászóláshoz be kell jelentkezni
Adatokat nem igazan menthetjuk le elotte, mert ha megy a site, akkor kozben ugy valtoznak.
De. Van olyan, hogy először menet közben átmásoltok mindent, majd leállás alatt már csak azt, ami idő közben megváltozott. Lehet többször iterálni a leállás előtt, hogy minél rövidebb legyen a leállási idő.
- A hozzászóláshoz be kell jelentkezni
Es hol jegyzi meg az SQL, hogy hol alltam meg a regi db-vel? A tablak nincsenek indexelve, nincs autoincrement, es update is lehet kozben. Vagy van erre valami cheat, amivel tudom szinkronizalni?
- A hozzászóláshoz be kell jelentkezni
Ezt nem tudom(oracle elvileg tudja, snapshot).
Viszont ha lehet, akkor válaszd kétfelé:
nem változó adat, változó adat.
Van olyan, hogy ROWID? Erre elég gyors
selectet lehetne írni, és a különbség gondolom nem lenne jelentős.
Az is megoldás, hogy táblánként eltárolod az utsó ROWID-et és
akár dinamikusan, akár insert into new_table select from old_table where not exists formával áttöltöd
a változást(tablanev, last_rowid lennének az oszlopok).
- A hozzászóláshoz be kell jelentkezni
ezt majd meg megnezem :)
- A hozzászóláshoz be kell jelentkezni
Oracle is, mysql is tud olyat, hogy egy oszlopba timestampet tesz automatikusan, ha módosítod.
http://dev.mysql.com/doc/refman/5.0/en/timestamp.html
In a CREATE TABLE statement, the first TIMESTAMP column can be declared in any of the following ways:
With both DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses, the column has the current timestamp for its default value, and is automatically updated.
- A hozzászóláshoz be kell jelentkezni
Ha az eredeti táblákon van timestamp, akkor jó.
- A hozzászóláshoz be kell jelentkezni
Ha nincs, akkor kell rá tenni. Nem olyan bonyolult.
- A hozzászóláshoz be kell jelentkezni
Igen, ezt en is tudom, de az eredeti tablakon nincs ilyesmi, es abba nem tudunk irni.
- A hozzászóláshoz be kell jelentkezni
Miért nem tudtok bele rakni?
- A hozzászóláshoz be kell jelentkezni
Én nem tenném rá működés közben.
- A hozzászóláshoz be kell jelentkezni
mert a regi site-ot egy masik ceg csinalta, akit arrol is nehez volt meggyozni, hogy adjak oda a db-t. Az lesz, hogy site leall, megkapjuk a db-t, es vegigszaladunk rajta.
- A hozzászóláshoz be kell jelentkezni
Hát akkor így jártatok. Tetszettek volna forradalmat csinálni. :D
- A hozzászóláshoz be kell jelentkezni
Szervusz !
a forrás adatbázis-kezelő és a cél adatbázis- kezelő nincs megnevezve.
PHP + MySQL-ben listázás és kreáláshoz szükséges script képernyőre kiírása:
<?php
# adattábla listázó
$host = "127.0.0.1";
$juzer = "juzer";
$jelszo="jelszo";
$kapcsolat = mysql_connect($host, $juzer, $jelszo);
mysql_select_db("information_schema", $kapcsolat);
$sql = "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA=adatbazis_nev' ";
# print $sql."
";
$eredmeny = mysql_query($sql, $kapcsolat) or die(mysql_error());
# print "
- A hozzászóláshoz be kell jelentkezni
nem azzal van baj, hanem azzal, hogy adatokat kellene transferelni egyik db-bol a masikba. egyebkent mindketto mysql.
- A hozzászóláshoz be kell jelentkezni
egyik db select->php feldolgozás->insert masikdb
ami ehhez kell azt mindet leírták már.
$result = mysql_query($sqlstr, $kapcsolat);
a $kapcsolat változóval tudod meghatározni melyik db-n hajtódik végre a query.
- A hozzászóláshoz be kell jelentkezni
egyebkent ennyire n00b azert nem vagyok, php-t vagom, azt nem kell magyarazni :) a gond ott van, hogy szeretnenk a php-t elkerulni, es mysql-ben megoldani az egeszet, mert nagyon gyorsnak kell lenni meg ilyesmi.
- A hozzászóláshoz be kell jelentkezni
Ezt olvastad már?
- A hozzászóláshoz be kell jelentkezni
most atfutottam, de nekem nem az a problemam, hogy portolni kellene, hanem az, hogy teljesen atalakitani. gondoltam ra, hogy atcsinalom az sql file szerkezetet, de aztan rajottem, hogy az megnagyobb szopas lenne. Foleg, hogy a users tabla 380 MB-s volt kitomorites utan.
- A hozzászóláshoz be kell jelentkezni
Csinálhatod úgy, ha bizonyos táblák azonosak, akkor azokat egy az egybe átmented, a többit meg kiexportálod mondjuk csv fájlba és azt eteted meg az új adatbázissal, de szvsz ilyen méreteknél inkább, mint feljebb is javasolták a php script a legegyszerűbb/leggyorsabb.
- A hozzászóláshoz be kell jelentkezni
Bocsi nem sértésnek szántam, csak nem derült ki előtte, mi a bajod a php-vel. Az elején is lemaradt mekkora a db és hogy nem igazán állhat le (gondolom ezért kell gyorsnak lennie).
- A hozzászóláshoz be kell jelentkezni
igen, valahogy mindig elfelejtek kozolni par relevans infot, ezt mar megfigyeltem :D egyebkent igen, egy ejszaka alatt kellene atallnunk rohadtgyorsan az egesz site-al. A db ugy 9 GB, szoval nem vagyok biztos benne, hogy ez lehetseges. Majd meglatjuk, milyen vasuk van :) De a kurzoros megoldas is ugrott, pedig azt mar sikerult megoldanom, csak tul lassu volt :D
- A hozzászóláshoz be kell jelentkezni
"feladataink koze tartozik, hogy azt ujratervezzuk. Ez megtortent, most irni kellene egy scriptet"
Gondolom a legcélszerűbb az lenne, hogy az csinálja a migrálást aki az új adatbázist tervezte.
- A hozzászóláshoz be kell jelentkezni
az uj db-t 8-an terveztuk, a migralast is 8-an fogjuk, csak en kezdem most eppen, igazabol nem tudom, miert :D
- A hozzászóláshoz be kell jelentkezni
/o\
Tyrael
- A hozzászóláshoz be kell jelentkezni