Mysql

Aus Info-Theke
Zur Navigation springen Zur Suche springen

Links

Debian Anpassungen

Debian prüft die Tabellen beim Booten. Damit das funktioniert, muss ein passender User eingerichtet sein:

  • Siehe /etc/mysql/debian.cnf
mysql -u root -p mysql
grant all on *.* to 'debian-sys-maint'@'localhost' identified by "6QLw8BSKFwzDnoUT" with grant option;
grant all on mydb.* to 'dbadmin'@'192.168.2.%' identified by '6QLw8BSKFwzDnoUT';
grant SELECT,SHOW VIEW,TRIGGER,PROCESS,LOCK TABLES on *.* to 'backup'@'localhost' identified by 'SAVE:alls!4711';
flush privileges;

MariaDB: Es ist für root ein Passwort vergeben. Man kann sich aber als OS-User root ohne Passwort anmelden.

Nachträglich Root-Passwort setzen

Wenn bei der Installation das Passwort nicht gesetzt wurde, kann das nachträglich passieren:

# Set root password:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyN3wP4ssw0rd';

Zugriff ohne Root-Passwort (als Benutzer root):

update user set 
authentication_string='',
plugin='auth_socket'
where user='root';

Datentypen

create table example(
   id int(10) unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT,
   ts TIMESTAMP NULL default NULL,
   dt DATETIME,
   name VARCHAR(100) UNIQUE NOT NULL
);
  • TIMESTAMP ist normalerweise ohne NULL, Default-Wert ist NOW()
  • Datentyp ändern:
alter table configurations modify configuration_id int(10) unsigned;
  • Spaltennamen ändern:
alter table sample change sampleid sample_id int(10) unsigned;

Fremdschlüssel

alter table rolestarters add constraint fk_roles2rolestarter foreign key (role_id)
      references roles (role_id) on delete restrict on update restrict;
alter table rolestarters drop constraint fk_roles2rolestarter;
  • Fremdschlüssel und Primärschlüssel müssen gleichen Datentyp haben.

Index erstellen und abfragen

create index geotestdate on testresult (`geo_bundesland`,`test_immunitaet`,`sample_date`);
# und abfragen:
show index from testresult;

SQL-Tipps

show create table geo;
rename table A to B;
alter table mytable change columnA columnB varchar(20);

DB-Export

mysqldump -u $USR $PWPHRASE $DB >$OUT
# oder nur Tabelle users  mit Bedingung:
mysqldump "--where=name like 'a%'" -u $USR $PWPHRASE $DB users logs >$OUT

CSV-Import

  • Wichtig: CSV-Datei muss wie Tabelle heißen, also geo.csv
mysqlimport --ignore-lines=1 --fields-terminated-by=, --local \
  --columns=geo_id,geo_staat,geo_land,geo_bezirk,geo_kreis,geo_gemeindeags,geo_gemeinde,geo_plz \
  -u $USR $PWPHRASE $DB  geo.csv
LOAD DATA
 LOCAL INFILE '/tmp/data.csv'
 INTO TABLE geo
 COLUMNS TERMINATED BY '\t'
 IGNORE 1 LINES
 (geo_id,geo_staat,...)

Export der Benutzer

FN=users.txt
FN_SQL=users.sql
mysql -B -N -uroot -e "SELECT CONCAT('\'', user,'\'@\'', host, '\'') FROM user WHERE user != 'debian-sys-maint' AND user != 'root' AND user != ''" mysql > $FN
while read line; do mysql -B -N -uroot  -e "SHOW GRANTS FOR $line"; done < $FN > $FN_SQL

CSV-Export

SELECT * FROM users
INTO OUTFILE '/tmp/users.csv' 
FIELDS ENCLOSED BY '"' 
TERMINATED BY ';' 
ESCAPED BY '"' 
LINES TERMINATED BY '\r\n';

Funktionen

hex(sample_id)
cast(sample_id as CHAR)
NOW() - INTERVAL 1 HOUR