Adatbázis: SQL, XML DB

[megoldva] MYSQL - utf-8 karakter íródott latin2-es adatbázisba

Probléma:

Adott egy latin2-es adatbázis, a netkapcsolat a szerver és a desktop közt megszakad, az addig latin2 kapcsolat helyett a továbbiakban utf-8-ban kommunikál (programozó állítása szerint, lehet nem utf8, de nem latin2-ben), és az ő-ű karakterek helyén valami szemét lesz. Adatbáziskezelő ?-nek jelzi.

(A desktop program nem az enyém, nekem kinyernem kell adatokat innen, egy webes felületen. A desktop program módosítása "nem lehetséges". A fenti állításokat nem volt még eszközöm ellenőrizni, a problémát nem tudom reprodukálni, csak az adatbázisokhoz van hozzáférésem, desktop programom nincs.)

1. kérdés:

A fenti esetben, az adatbázisba ténylegesen "?" kerül be, vagy a nem-latin2-es karakter jelenik meg így, és ott van az adat?

(Nem értek a karakterkódolásokhoz, és a MYSQL működéséhez hibakezelés ügyben.)

2. kérdés: (feltételes, csak akkor aktuális ha előzőre az a válasz, hogy "nem ? kerül be ténylegesen")

Van-e mód ezen karaktert tartalmazó sorok MYSQL lekérdezésben való lekérésére, tehát SQL szinten tudok-e rá szűrni?

Oracle db downtime minimalizálása

Sziasztok!

Adott egy adatbázis, 150 Gb méretű, néhány ias szerver meg kb. 100 user akaszkodik rá. A megoldandó feladat az esetleges downtime minimalizálása. A fő probléma a jelenlegi (***r) megoldással, hogy hw hiba esetén a tartalék szerver+db felépítés plusz a mentések visszatöltése több órás folyamat lenne, ami nem igazán megengedhető.

A megoldás keresésénél a következők a főbb prioritások:

1. Majdnem zero downtime
2. A jelenlegi performancia (SAS diszk alrendszer) megtartása vagy a hatékonyság növelése
3. A komponensek illetve megoldások ára, support stb.

Én első körben egy aktív meg egy passzív gépből álló megoldásra gondoltam, ami egy shared storage-ot ér el (ami esetleg redundáns vagy közel real time replikál egy másik ugyanolyan storage-ra). (FreeNAS zfs-el pl.).
Ha az aktív node kiesik, akkor a passzív felcsatolja a db-t és megy az élet tovább, ahonnan az aktív abbahagyta.
Esetleg mindezt vmware alapokon.

Félelmeim között szerepel a lehetséges gyatra IOPS pl. egy iSCSI megoldással, de fixme pls.
Egyelőre ötleteket gyűjtök, hogy ki hogy csinálná illetve van e hasonló problémára működő megoldása.
Oracle RAC nem az elsők között lenne, de nyilván szóba jöhet.
Köszönöm előre is!

postgresql 8.4 sérült adat visszaállítása sikerdíjért, sos

Filerendszer sérülés miatti adatvesztést kellene helyreállítanom, sérült tábla fileok vannak, amiket a recovery visszaállított. Nem kell az egész adatbázis, csak egykét tábla. Van hibátlan változat, ami nem elég friss, és a bináris fileok bemásolása nem segített (zero page on, index off beállítással sem). A pgfsck progi 8.2 és 8.3 as nem működnek erre, a tábla fileban viszont szemlátomást vannak helyes adatok, ha nem is teljes, nagyon jó lenne kinyerni.

A miért nem volt naprakész backup, miért nem volt replikálás, miért 8.4 stb. kérdéseket ugorjuk át, a recoveryért sikerdíjat tudunk fizetni, úgyhogy ha valaki csinált ilyet, postgres fejlesztő, vagy lát rá esélyt, az keressen meg. A dolog sürgős, és még mi is dolgozunk rajta, de eddig nem sikerült megoldani.

E-mail címem: postgres@dblaci.hu :)

OEP jelentés szűrése

Sziasztok!
A fenti címben jelölt adatbázisból szeretnék szűrni, az alábbiak szerint:
Ezek a fontosabb adatok:
Taj szám Eleje Vége
123456789 2010.01.01
123456789 2010.01.01 2010.02.28
123456789 2010.05.01
Szeretném, ha a select utasítás végén csak a harmadik sor látszódna. Az első sor a jogviszony kezdetét jelzi, második a végét (tehát hogy le lett zárva a jogviszony), a harmadik azt hogy meg lett kezdve egy új. Természetesen az első kettőből bármennyi lehet.
Paradox adatbázis, úgyhogy valami nagyon egyszerű sql lekérdezés kéne.
Ötlet?

Can't reopen mysql temporary table

Üdv minenkinek,

Sajnos nem vagyok expert sql szakértő ezért egy kis segítséget szeretnék kérni.

Egy tárolt eljárás készít egy ideiglenes táblát amiből többek között egy lekérdezéssel szeretnék készíteni egy listát.

Ideiglenes tábla szerkezete:


CREATE TEMPORARY TABLE tmptree (
	node BIGINT UNSIGNED,
	xpos INT UNSIGNED,
	ypos INT UNSIGNED
);

A listát gyártó lekérdezés:


SELECT
	node AS n,
	xpos AS x1,
	ypos AS y1,
	( SELECT xpos FROM tmptree WHERE node = FLOOR(n/2) ) AS x2,
	( SELECT ypos FROM tmptree WHERE node = FLOOR(n/2) ) AS y2,
FROM tmptree ORDER BY y1 DESC;

Ha a lekérdezést lefuttatom akkor a követlező hibaüzenetet kapom:

SQLSTATE[HY000]: General error: 1137 Can't reopen table: 'tmptree'

A dokumentáció szerint azért mert egy lekérdezésen belül nem lehet több hivatkozás ugyanarra az ideiglenes táblára.

http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html

Azt szeretném kérdezni, hogy át lehet valahogy fogalmazni ezt a lekérdezést úgy, hogy ne legyen több hivatkozás a táblára (a két sub-select ne szerepeljen benne)?

A válaszokat előre is köszönöm.

open source adatbazis absztrakcios reteg c-hez, esetleg c++-hoz prepared statement kepessegekkel

Jo dolog, ha az ember a felhasznalo kezebe adja a dontest, hogy milyen db-ben tartsa az adatokat. Az viszont nem jo dolog, ha az adatbazist matato kodot annyiszor duplikalni kell, ahany fele db-t tamogatni akarunk. Ez ugy oldhato meg szepen, ha egy absztrakcios reteget hasznalunk c-ben, ami majd tudja mikent kell beszelgetni az eppen hasznalt db-vel.

Szoval egy olyat keresek elsosorban Linuxra, ami

#1: ismeri legalabb a mysql-t es a pgsql-t
#2: tamogatja a prepared statement-eket
#3: nyilt forrasu
#4: egyszeru, tiszta api-ja van

Eddig a libdbi-t talaltam meg, de az #2-n elverzik, es mivel kivulrol szarmazo, megbizhatatlan inputtal kell dolgozni, igy nem szivesen raknam ossze karakterlanckent az sql query-t. Lattam tobb c++ megvalositast, de azok mind fizetos termekek, ami egy picit alavagna a nyilt forrasu termeknek, amiben hasznalnek egy ilyet...

Mysql bináris fa ábrázolás

Üdv mindenkinek,

Egy hobby projekt keretén belül szeretnék többek között bináris fa ábrázolására megoldást keresni.

Mivel elég nagy fák is lehetnek és a fa nem szabályos (pár száz csomópont esetén is lehet nagyon magas a fa) ezért a mysql rekurzió
nem használható mert az maximum 255 ménységig működik. Így rekurzió helyett iteratív algoritmussal próbálkozok.

Ott tart a dolog, hogy iteratív inorder fa bejárással megkapom az X pozícióját a csomópontoknak de közben szeretném az Y pozíciót is
megállapítani ami a csomópont magassága a fában.

Elakadtam mert nem tudom, hogyan lehetne megállapítni az Y pozíciót (magasság a fában).
Ha esetleg van itt olyan aki érti a témát kérem mutasson utat mi lehet a megoldás.

A segítséget előre is köszönöm.


/* 
FA 
CREATE TABLE `tree` (`id` BIGINT UNSIGNED, `lchild` BIGINT UBSIGNED, `rchild` BIGINT UNSIGNED);

EREDMENY FA
CREATE TEMPORARY TABLE `tmptree` (`node` BIGINT UNSIGNED, `xpos` INT UNSIGNED, `ypos` INT UNSIGNED);
*/


DROP PROCEDURE IF EXISTS `subtree`;
DELIMITER //
CREATE PROCEDURE `subtree` (
        IN `node` BIGINT UNSIGNED)
        BEGIN

                DECLARE `x` INT UNSIGNED DEFAULT 0;
                DECLARE `y` INT UNSIGNED DEFAULT 0;

                CREATE TEMPORARY TABLE `stack` (`i` INT UNSIGNED AUTO_INCREMENT, `n` INT UNSIGNED, PRIMARY KEY (`i`));

                WHILE ((SELECT COUNT(*) FROM `stack`) OR (`node` IS NOT NULL)) DO

                        IF `node` IS NOT NULL THEN
                                INSERT INTO `stack` (`n`) VALUES (`node`); /* verem - PUSH */
                                SELECT `lchild` FROM `tree` WHERE `id`=`node` INTO `node`; /* bal gyerek */
                        ELSE
                                SELECT `n` FROM `stack` ORDER BY `i` DESC LIMIT 1 INTO `node`; /* verem - POP */
                                DELETE FROM `stack` WHERE `n`=`node`; /* verem - POP */
                                SET `x`=`x`+1; /* következő x pozício */

                                INSERT INTO `tmptree` VALUES (`node`,`x`,`y`); /* csomópont kiírása */

                                SELECT `rchild` FROM `tree` WHERE `id`=`node` INTO `node`; /* jobb gyerek */
                        END IF;

                END WHILE;
                DROP TABLE `stack`;
        END //
DELIMITER ;

[MEGOLDVA] postgresql dump és a setlocale problem

Frissítettem egy szerveren a glibc-t mert régi volt. Gentoo amúgy.
Utána ezt kapom ha pgsql-t vagy pg_dump-ot futtatni akarom. A locale le van generálva tehát nem értem miért mondja ezt. Ha ssh-val átdobom a portot egy másik serverre akkor is ezt mondja. postgres verzió 9.0. Php-s weblodal használja az működik továbbra is.

psql: FATAL: database locale is incompatible with operating system
DETAIL: The database was initialized with LC_COLLATE "hu_HU.UTF-8", which is not recognized by setlocale().
HINT: Recreate the database with another locale or install the missing locale.

Találkozott már valaki ilyennel?

megoldás: glibc frissités után újra kellett indítani postgres servert :)

[Lezárva] MYSQL tárolt eljárás, ami mindig egy rekordot ad vissza.

Sziaszok!

Adott egy egyszerű MySQL lekérdezés, amit tárolt eljárásban kéne használnom a továbbiakban
Pl.: SELET * FROM tabla WHERE szulo=2;

A problémát az okozza,hogy ezt több táblára használnom jeleneg a mostani programomban ezért a tábla nevét, mint paramétert kéne kezelni, itt kezdődnek a gondok. Az alábbi kód megcsinálja, amit szeretnék, viszont csak egyetlen rekorddal tér vissza! Nekem az összes rekord kéne, ami az adott feltételnek megfelel.

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetMenuChild`(IN `vszulo` BIGINT(20), IN `tname` VARCHAR(25))
BEGIN
SET @sql = CONCAT('SELECT * FROM ',tname,' WHERE szulo=?;');
PREPARE s1 from @sql;
SET @paramA = vszulo;
EXECUTE s1 USING @paramA;
SELECT * FROM s1;
END#

Ha valakinek van ötlete azt szívesen venném, mert már órák óta keresgélek a neten, de nem igazán találok megoldást.