Dies ist eine alte Version des Dokuments!
Im Klassenlisten etc. neu zu sortieren, kann man SQL-interne Variablen nutzen.
Beispiel:
SET @t1=0; UPDATE `qf_classlist` SET person_number=(@t1:=@t1+1) WHERE `jobnumber` = 1237 AND `class` = 'nichtda' ORDER by remark DESC, name LIMIT 53
Wenn wir schon dabei sind: Bei Aufträgen allen zugewiesenen Bildern sagen, dass sie den gleichen Klassennamen haben sollen wie die Klassenliste:
UPDATE `qf_pictures` AS p INNER JOIN qf_picture_relation as r ON (p.id=r.picture_id) INNER JOIN qf_classlist as c ON (c.id=r.classlist_id) SET p.classname = c.class WHERE p.jobnumber = [jobnumber] AND p.classname!=c.class
Mysql: Passwort vergeben (Root hat noch keins!) mysql -u root
Geben Sie die folgenden Statements im MySQL-Client ein (ersetzen Sie dabei „IhrNeues Passwort“ mit dem von Ihnen gewählten Passwort!):
mysql> UPDATE mysql.user SET Password=PASSWORD('IhrNeuesPasswort') -> WHERE User='root'; mysql> FLUSH PRIVILEGES; PASSWORD('neues Passwort') ist eine Funktion und muss auch so eingegeben werden
Problem: Debian nutzt einen mysql-User namens 'debian-sys-maint'. Der wurde bei meiner Portierung von DB-Dump anscheinend überschrieben und nach einem Neustart (vorher ging es!) konnte sich niemand mehr in mysql einloggen. Habe versucht:
apt-get remove mysql-common mysql-server mysql-client mv /etc/mysql /etc/mysql.old apt-get install mysql-common mysql-server mysql-client
Half nichts. Dann:
apt-get install mysqladmin mysqladmin -u root password 'HIER_PASSWORD_REINSCHREIBEN'
Half auch nichts. Nochmal: Folgendes umbenannt:
/usr/share/mysql/ /etc/init.d/mysql /etc/mysql /etc/mysql/mysqlaccess.conf /etc/mysql/my.cnf /etc/logrotate.d/mysql /var/db/pkg/dev-db/mysql* /var/lib/mysql (lassen, da hier die DBs sind und ohne mag er nicht starten.)
Da SQL nicht starten kann, kann ich den Dämon manuell starten (vorher wieder alle Dateien umbenennen) - ohne Privilegien-Tabelle!: mysqld –skip-grant-tables dann.
select host,user from user;
hier sieht man das Problem: Es gibt 4(!) roots. 2 davon vom 'printserver' Dort ein beherztes:
DELETE FROM mysql.user WHERE host != 'localhost';
es geht! - bis zum Neustart. Dann das Problem: mysql startet nicht. Nochmal: Wenn dort bei root nicht der Host localhost steht, musste den mit dem GRANT-Befehl setzen. Weitere Informationen zum GRANT-Befehl findest du in der MySQL-Referenz. Es ging dann… Kleines Problem: der user 'debian-sys-maint' kann sich beim systemstart nicht anmelden. Lösung: Passwort steht in /etc/mysql/debian.conf Merken(kopieren), dann Einloggen in mysql (als root).
UPDATE mysql.user SET password=PASSWORD('gemerktesPasswort') WHERE User='debian-sys-maint';FLUSH PRIVILEGES;
Hatte die Meldung nach Start: Checke Tables, etc. Problem komtm wohl vom mysl-Versionswechel.
mysqlcheck --check-upgrade --all-databases --auto-repair --password=[pw] mysql_fix_privilege_tables --password=[pw]
SB exportieren (aus alten Server):
scp -P 22 backup/qunit1.sql root@192.168.123.196:/root/ Dann halt: mysql -u root -p qunit1 < qunit1.sql
http://dev.mysql.com/doc/refman/5.1/de/create-trigger.html
BEISPIEL encrypt: http://stackoverflow.com/questions/4275882/how-to-encrypt-a-specific-column-in-a-mysql-table
Quelle1)
This example uses a backup to rename a database in a MySQL instance.
It takes only 5 easy steps:
First copy the schema (db1) with mysqldump:
% mysqldump db1 > db1.sql
Create the a new schema (db2):
% mysqladmin CREATE db2
Insert the backup into the new schema:
% mysql db2 < db1.sql
Drop the old schema:
% mysqladmin drop db1
Now update the user rights:
mysql> UPDATE db SET Db = 'db2' WHERE Db = 'db1'; mysql> UPDATE tables_priv SET Db = 'db2' WHERE Db = 'db1'; mysql> UPDATE columns_priv SET Db = 'db2' WHERE Db = 'db1'; mysql> UPDATE host SET Db = 'db2' WHERE Db = 'db1';
Done! That was easy wasn’t it?
Beispiel: In der DB steht: Berlin 12455, es soll aber stehen: 12455 Berlin (im Feld address1)
Test:
SELECT id, class, name, address1, address2, CONCAT (SUBSTRING_INDEX( `address1` , ' ', -1 ), ' ', SUBSTRING_INDEX( `address1` , ' ', 1 )) FROM `qf_classlist` WHERE `jobnumber` = 2061 AND `address1` LIKE '%Berlin%' AND address1 != ''
UPDATE `qf_classlist` SET address1 = CONCAT (SUBSTRING_INDEX( `address1` , ' ', -1 ), ' ', SUBSTRING_INDEX( `address1` , ' ', 1 )) WHERE `jobnumber` = 2061 AND `address1` LIKE '%Berlin%' AND address1 != ''
Beispiel: Im Feld code steht 45, soll aber 0000045
UPDATE `qf_classlist` SET code = CONCAT((REPEAT("0",(7-LENGTH(code)))), code) WHERE `jobnumber` = 2127 AND LENGTH(code) != 7
Beispiel: Meier, Chris, Meier, Chris statt Meier, Chris
UPDATE `qf_classlist` SET name = SUBSTRING_INDEX(name, ',', 2) WHERE `jobnumber` = [jobnumber] AND class=[class]
Beispiel: Bei Auftrag 2303 soll ein gewisser Status [status] entfernt werden. Aber nur bei Personenbildern.
UPDATE `qf_pictures` SET status = (status - [status]) WHERE `jobnumber` = 2303 AND (status | [status]) = status AND (content = 1 OR content = 2 OR content = 4 OR content = 2097152)
ZB: Bit 3 ( = 4 = PICSTATUS_COLORPROOFED) entfernen:
UPDATE `qf_pictures` SET status = (status - 4) WHERE `jobnumber` = 2358 AND (status | 4) = status AND (content = 1 OR content = 2 OR content = 4 OR content = 2097152)
Beispiel: Bei Auftrag 2363 ist die Klassenliste falsch, sie soll gelöscht werden. Es wurden aber schon NB-Nummern reserviert. Die sollen auch weg, weil die Nummern sonst unnütz verschwendet werden
1. NB-Nummern löschen:
DELETE ro.* FROM qf_reorder AS ro INNER JOIN qf_picture_relation AS r ON (ro.id=r.reorder_id) INNER JOIN `qf_classlist` as c ON (c.id=r.classlist_id) WHERE c.jobnumber = 2363
2. Dann die Relations:
DELETE r.* FROM qf_picture_relation AS r INNER JOIN `qf_classlist` as c ON (c.id=r.classlist_id) WHERE c.jobnumber = 2363
3. Schliesslich die KL selbst:
DELETE c.* FROM `qf_classlist` as c WHERE c.jobnumber = 2363
Besonderes Problem: Nachbestellnummern sind schon erstellt (ohne Bilder), ohne dass Bilder da sin. - weil den Schülern die Nummer schon mitgeteilt wurde.
Schauen, welche neuen (jetzt falschen) Relations erstellt wurden: Die erkennt man daran, dass sie noch keine Reorder-Nummer haben:
SELECT * FROM qf_picture_relation AS r INNER JOIN `qf_classlist` as c ON (c.id=r.classlist_id) WHERE c.jobnumber = 123 AND picture_id>0
1. Die neu erstellten Relations löschen (sind jetzt überflüssig):
DELETE r.* FROM qf_picture_relation AS r INNER JOIN `qf_classlist` as c ON (c.id=r.classlist_id) WHERE c.jobnumber = 123 AND r.picture_id>0 AND r.reorder_id=0
2. Jetzt die Relations, die schon eine Picture-ID haben wieder auf 0 setzen:
UPDATE qf_picture_relation AS r INNER JOIN `qf_classlist` as c ON (c.id=r.classlist_id) SET r.picture_id=0 WHERE c.jobnumber = 123 AND r.picture_id>0
3. Schliesslich die DB-Einträge der Bilder löschen:
DELETE * FROM qf_pictures WHERE jobnumber = 123
und die Bilder im Archive löschen:
rm /var/archive/123/*