sql >> Databasteknik >  >> RDS >> Mysql

Hur man hanterar MySQL - för Oracle DBA:er

Databaser med öppen källkod håller snabbt på att bli mainstream, så migrering från proprietära motorer till öppen källkodsmotorer är en slags branschtrend nu. Det betyder också att vi DBA:er ofta har flera databasbackends att hantera.

I de senaste blogginläggen har min kollega Paul Namuag och jag täckt flera aspekter av migration från Oracle till Percona, MariaDB och MySQL. Det uppenbara målet för migreringen är att få igång din applikation mer effektivt i den nya databasmiljön, men det är viktigt att säkerställa att personalen är redo att stödja den.

Den här bloggen tar upp de grundläggande funktionerna i MySQL med hänvisning till liknande uppgifter som du skulle utföra dagligen i din Oracle-miljö. Det ger dig en djupdykning i olika ämnen för att spara tid eftersom du kan relatera till Oracle-kunskap som du redan har byggt upp genom åren.

Vi kommer också att prata om externa kommandoradsverktyg som saknas i MySQL-standardinstallationen men som behövs för att utföra dagliga operationer effektivt. Den öppna källkodsversionen kommer inte med motsvarigheten till Oracle Cloud Control till exempel, så kolla in ClusterControl om du letar efter något liknande.

I den här bloggen antar vi att du har en bättre kunskap om Oracle än MySQL och därför skulle vilja veta sambandet mellan de två. Exemplen är baserade på Linux-plattformen men du kan hitta många likheter med att hantera MySQL på Windows.

Hur ansluter jag till MySQL?

Låt oss börja vår resa med en mycket (till synes) grundläggande uppgift. Egentligen är detta en sorts uppgift som kan orsaka viss förvirring på grund av olika inloggningskoncept i Oracle och MySQL.

Motsvarigheten till sqlplus / as sysdba-anslutning är "mysql" terminalkommando med en flagga -uroot. I MySQL-världen kallas superanvändaren root. MySQL-databasanvändare (inklusive root) definieras av namnet och värddatorn från vilken den kan ansluta.

Informationen om användare och värdar varifrån den kan ansluta lagras i tabellen mysql.user. Med anslutningsförsöket kontrollerar MySQL om klientvärden, användarnamnet och lösenordet matchar raden i metadatatabellen.

Det här är lite annorlunda än i Oracle där vi bara har ett användarnamn och lösenord, men de som är bekanta med Oracle Connection Manager kanske hittar vissa likheter.

Du hittar inte fördefinierade TNS-poster som i Oracle. Vanligtvis, för en administratörsanslutning, behöver vi användare, lösenord och -h värdflagga. Standardporten är 3306 (som 1521 i Oracle) men detta kan variera på olika inställningar.

Som standard kommer många installationer att ha root-åtkomstanslutning från vilken maskin som helst ([email protected]’%’) blockerad, så du måste logga in på servern som är värd för MySQL, vanligtvis via ssh.

Skriv följande:

mysql -u root

När root-lösenordet inte är inställt räcker detta. Om lösenordet krävs bör du lägga till flaggan -p.

mysql -u root -p

Du är nu inloggad på mysql-klienten (motsvarande sqlplus) och kommer att se en prompt, vanligtvis 'mysql>'.

Är MySQL igång?

Du kan använda mysql-tjänstens startskript eller mysqladmin-kommandot för att ta reda på om det körs. Sedan kan du använda kommandot ps för att se om mysql-processer är igång. Ett annat alternativ kan vara mysqladmin, som är ett verktyg som används för att utföra administrativa operationer.

mysqladmin -u root -p status

På Debian:

/etc/init.d/mysql status

Om du använder RedHat eller Fedora kan du använda följande skript:

service mysqld status

Eller

/etc/init.d/mysqld status

Eller

systemctl status mysql.service

På MariaDB-instanser bör du leta efter MariaDB-tjänstens namn.

systemctl status mariadb

Vad finns i den här databasen?

Precis som i Oracle kan du fråga metadataobjekten för att få information om databasobjekt.

Det är vanligt att använda några genvägar här, kommandon som hjälper dig att lista objekt eller få DDL av objekten.

show databases;
use database_name;
show tables;
show table status;
show index from table_name;
show create table table_name;

I likhet med Oracle kan du beskriva tabellen:

desc table_name;

Var lagras min data?

Det finns ingen dedikerad intern lagring som ASM i MySQL. Alla datafiler placeras i de vanliga OS-monteringspunkterna. Med en standardinstallation kan du hitta dina data i:

/var/lib/mysql

Platsen baseras på variabeln datadir.

[email protected]:~# cat /etc/mysql/my.cnf | grep datadir
datadir=/var/lib/mysql

Du kommer att se en katalog för varje databas.

Beroende på version och lagringsmotor (ja det finns några här), kan databasens katalog innehålla filer med formatet *.frm, som definierar strukturen för varje tabell i databasen. För MyISAM-tabeller lagras även data (*.MYD) och index (*.MYI) i denna katalog.

InnoDB-tabeller lagras i InnoDB-tabellutrymmen. Var och en består av en eller flera filer, som liknar Oracle-tabellutrymmen. I en standardinstallation hålls alla InnoDB-data och index för alla databaser på en MySQL-server i ett tabellutrymme, bestående av en fil:/var/lib/mysql/ibdata1. I de flesta inställningar hanterar du inte tabellutrymmen som i Oracle. Den bästa praxisen är att behålla dem med autoextend på och maxstorlek obegränsad.

[email protected]:~# cat /etc/mysql/my.cnf | grep innodb-data-file-path
innodb-data-file-path = ibdata1:100M:autoextend

InnoDB har loggfiler, som motsvarar Oracle redo-loggar, vilket möjliggör automatisk kraschåterställning. Som standard finns det två loggfiler:/var/lib/mysql/ib_logfile0 och /var/lib/mysql/ib_logfile1. Ångra data hålls i tablespace-filen.

[email protected]:/var/lib/mysql# ls -rtla | grep logfile
-rw-rw----  1 mysql mysql  268435456 Dec 15 00:59 ib_logfile1
-rw-rw----  1 mysql mysql  268435456 Mar  6 11:45 ib_logfile0

Var finns metadatainformationen?

Det finns inga dba_*, user_*, all_* typer av vyer men MySQL har interna metadatavyer.

Information_schema är definierat i SQL 2003-standarden och implementeras av andra större databaser, t.ex. SQL Server, PostgreSQL.

Sedan MySQL 5.0 har informationsschemadatabasen varit tillgänglig, innehållande dataordboksinformation. Informationen lagrades faktiskt i de externa FRM-filerna. Slutligen, efter många år är .frm-filer borta i version 8.0. Metadatan är fortfarande synlig i informationsschemadatabasen men använder InnoDB-lagringsmotorn.

För att se alla faktiska vyer som finns i dataordboken i mysql-klienten, byt till informationsschemadatabasen:

use information_schema;
show tables;

Du kan hitta ytterligare information i MySQL-databasen, som innehåller information om db, händelse (MySQL-jobb), plugins, replikering, databas, användare etc.

Antalet visningar beror på version och leverantör.

Välj * från v$session

Oracles select * från v$session representeras här med kommandot SHOW PROCESSLIST som visar listan med trådar.

mysql> SHOW PROCESSLIST;
+---------+------------------+------------------+--------------------+---------+--------+--------------------+------------------+-----------+---------------+
| Id      | User             | Host             | db                 | Command | Time   | State              | Info             | Rows_sent | Rows_examined |
+---------+------------------+------------------+--------------------+---------+--------+--------------------+------------------+-----------+---------------+
|       1 | system user      |                  | NULL               | Sleep   | 469264 | wsrep aborter idle | NULL             |         0 |             0 |
|       2 | system user      |                  | NULL               | Sleep   | 469264 | NULL               | NULL             |         0 |             0 |
|       3 | system user      |                  | NULL               | Sleep   | 469257 | NULL               | NULL             |         0 |             0 |
|       4 | system user      |                  | NULL               | Sleep   | 469257 | NULL               | NULL             |         0 |             0 |
|       6 | system user      |                  | NULL               | Sleep   | 469257 | NULL               | NULL             |         0 |             0 |
|      16 | maxscale         | 10.0.3.168:5914  | NULL               | Sleep   |      5 |                    | NULL             |         4 |             4 |
|      59 | proxysql-monitor | 10.0.3.168:6650  | NULL               | Sleep   |      7 |                    | NULL             |         0 |             0 |
|      81 | proxysql-monitor | 10.0.3.78:62896  | NULL               | Sleep   |      6 |                    | NULL             |         0 |             0 |
|    1564 | proxysql-monitor | 10.0.3.78:25064  | NULL               | Sleep   |      3 |                    | NULL             |         0 |             0 |
| 1822418 | cmon             | 10.0.3.168:41202 | information_schema | Sleep   |      0 |                    | NULL             |         0 |             8 |
| 1822631 | cmon             | 10.0.3.168:43254 | information_schema | Sleep   |      4 |                    | NULL             |         1 |             1 |
| 1822646 | cmon             | 10.0.3.168:43408 | information_schema | Sleep   |      0 |                    | NULL             |       464 |           464 |
| 2773260 | backupuser       | localhost        | mysql              | Query   |      0 | init               | SHOW PROCESSLIST |         0 |             0 |
+---------+------------------+------------------+--------------------+---------+--------+--------------------+------------------+-----------+---------------+


13 rows in set (0.00 sec)

Den är baserad på information som lagras i informationsschema.processlistvyn. Vyn kräver att ha PROCESS-behörigheten. Det kan också hjälpa dig att kontrollera om du får slut på det maximala antalet processer.

Var finns en varningslogg?

Felloggen kan hittas i my.cnf eller via kommandot show variables.

mysql> show variables like 'log_error';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| log_error     | /var/lib/mysql/error.log |
+---------------+--------------------------+
1 row in set (0.00 sec)

Var finns listan över användare och deras behörigheter?

Informationen om användare lagras i mysql.user-tabellen, medan anslagen lagras på flera platser inklusive mysql.user, mysql.tables_priv,

MySQL-användaråtkomst definieras i:

mysql.columns_priv, mysql.tables_priv, mysql.db,mysql.user

Det bästa sättet att lista bidrag är att använda pt-grants, verktyget från Percona toolkit (ett måste för varje MySQL DBA).

pt-show-grants --host localhost --user root --ask-pass

Alternativt kan du använda följande fråga (skapad av Calvaldo)

SELECT
    CONCAT("`",gcl.Db,"`") AS 'Database(s) Affected',
    CONCAT("`",gcl.Table_name,"`") AS 'Table(s) Affected',
    gcl.User AS 'User-Account(s) Affected',
    IF(gcl.Host='%','ALL',gcl.Host) AS 'Remote-IP(s) Affected',
    CONCAT("GRANT ",UPPER(gcl.Column_priv)," (",GROUP_CONCAT(gcl.Column_name),") ",
                 "ON `",gcl.Db,"`.`",gcl.Table_name,"` ",
                 "TO '",gcl.User,"'@'",gcl.Host,"';") AS 'GRANT Statement (Reconstructed)'
FROM mysql.columns_priv gcl
GROUP BY CONCAT(gcl.Db,gcl.Table_name,gcl.User,gcl.Host)
/* SELECT * FROM mysql.columns_priv */

UNION

/* [Database.Table]-Specific Grants */
SELECT
    CONCAT("`",gtb.Db,"`") AS 'Database(s) Affected',
    CONCAT("`",gtb.Table_name,"`") AS 'Table(s) Affected',
    gtb.User AS 'User-Account(s) Affected',
    IF(gtb.Host='%','ALL',gtb.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        "GRANT ",UPPER(gtb.Table_priv)," ",
        "ON `",gtb.Db,"`.`",gtb.Table_name,"` ",
        "TO '",gtb.User,"'@'",gtb.Host,"';"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.tables_priv gtb
WHERE gtb.Table_priv!=''
/* SELECT * FROM mysql.tables_priv */

UNION

/* Database-Specific Grants */
SELECT
    CONCAT("`",gdb.Db,"`") AS 'Database(s) Affected',
    "ALL" AS 'Table(s) Affected',
    gdb.User AS 'User-Account(s) Affected',
    IF(gdb.Host='%','ALL',gdb.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        'GRANT ',
        CONCAT_WS(',',
            IF(gdb.Select_priv='Y','SELECT',NULL),
            IF(gdb.Insert_priv='Y','INSERT',NULL),
            IF(gdb.Update_priv='Y','UPDATE',NULL),
            IF(gdb.Delete_priv='Y','DELETE',NULL),
            IF(gdb.Create_priv='Y','CREATE',NULL),
            IF(gdb.Drop_priv='Y','DROP',NULL),
            IF(gdb.Grant_priv='Y','GRANT',NULL),
            IF(gdb.References_priv='Y','REFERENCES',NULL),
            IF(gdb.Index_priv='Y','INDEX',NULL),
            IF(gdb.Alter_priv='Y','ALTER',NULL),
            IF(gdb.Create_tmp_table_priv='Y','CREATE TEMPORARY TABLES',NULL),
            IF(gdb.Lock_tables_priv='Y','LOCK TABLES',NULL),
            IF(gdb.Create_view_priv='Y','CREATE VIEW',NULL),
            IF(gdb.Show_view_priv='Y','SHOW VIEW',NULL),
            IF(gdb.Create_routine_priv='Y','CREATE ROUTINE',NULL),
            IF(gdb.Alter_routine_priv='Y','ALTER ROUTINE',NULL),
            IF(gdb.Execute_priv='Y','EXECUTE',NULL),
            IF(gdb.Event_priv='Y','EVENT',NULL),
            IF(gdb.Trigger_priv='Y','TRIGGER',NULL)
        ),
        " ON `",gdb.Db,"`.* TO '",gdb.User,"'@'",gdb.Host,"';"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.db gdb
WHERE gdb.Db != ''
/* SELECT * FROM mysql.db */

UNION

/* User-Specific Grants */
SELECT
    "ALL" AS 'Database(s) Affected',
    "ALL" AS 'Table(s) Affected',
    gus.User AS 'User-Account(s) Affected',
    IF(gus.Host='%','ALL',gus.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        "GRANT ",
        IF((gus.Select_priv='N')&(gus.Insert_priv='N')&(gus.Update_priv='N')&(gus.Delete_priv='N')&(gus.Create_priv='N')&(gus.Drop_priv='N')&(gus.Reload_priv='N')&(gus.Shutdown_priv='N')&(gus.Process_priv='N')&(gus.File_priv='N')&(gus.References_priv='N')&(gus.Index_priv='N')&(gus.Alter_priv='N')&(gus.Show_db_priv='N')&(gus.Super_priv='N')&(gus.Create_tmp_table_priv='N')&(gus.Lock_tables_priv='N')&(gus.Execute_priv='N')&(gus.Repl_slave_priv='N')&(gus.Repl_client_priv='N')&(gus.Create_view_priv='N')&(gus.Show_view_priv='N')&(gus.Create_routine_priv='N')&(gus.Alter_routine_priv='N')&(gus.Create_user_priv='N')&(gus.Event_priv='N')&(gus.Trigger_priv='N')&(gus.Create_tablespace_priv='N')&(gus.Grant_priv='N'),
            "USAGE",
            IF((gus.Select_priv='Y')&(gus.Insert_priv='Y')&(gus.Update_priv='Y')&(gus.Delete_priv='Y')&(gus.Create_priv='Y')&(gus.Drop_priv='Y')&(gus.Reload_priv='Y')&(gus.Shutdown_priv='Y')&(gus.Process_priv='Y')&(gus.File_priv='Y')&(gus.References_priv='Y')&(gus.Index_priv='Y')&(gus.Alter_priv='Y')&(gus.Show_db_priv='Y')&(gus.Super_priv='Y')&(gus.Create_tmp_table_priv='Y')&(gus.Lock_tables_priv='Y')&(gus.Execute_priv='Y')&(gus.Repl_slave_priv='Y')&(gus.Repl_client_priv='Y')&(gus.Create_view_priv='Y')&(gus.Show_view_priv='Y')&(gus.Create_routine_priv='Y')&(gus.Alter_routine_priv='Y')&(gus.Create_user_priv='Y')&(gus.Event_priv='Y')&(gus.Trigger_priv='Y')&(gus.Create_tablespace_priv='Y')&(gus.Grant_priv='Y'),
                "ALL PRIVILEGES",
                CONCAT_WS(',',
                    IF(gus.Select_priv='Y','SELECT',NULL),
                    IF(gus.Insert_priv='Y','INSERT',NULL),
                    IF(gus.Update_priv='Y','UPDATE',NULL),
                    IF(gus.Delete_priv='Y','DELETE',NULL),
                    IF(gus.Create_priv='Y','CREATE',NULL),
                    IF(gus.Drop_priv='Y','DROP',NULL),
                    IF(gus.Reload_priv='Y','RELOAD',NULL),
                    IF(gus.Shutdown_priv='Y','SHUTDOWN',NULL),
                    IF(gus.Process_priv='Y','PROCESS',NULL),
                    IF(gus.File_priv='Y','FILE',NULL),
                    IF(gus.References_priv='Y','REFERENCES',NULL),
                    IF(gus.Index_priv='Y','INDEX',NULL),
                    IF(gus.Alter_priv='Y','ALTER',NULL),
                    IF(gus.Show_db_priv='Y','SHOW DATABASES',NULL),
                    IF(gus.Super_priv='Y','SUPER',NULL),
                    IF(gus.Create_tmp_table_priv='Y','CREATE TEMPORARY TABLES',NULL),
                    IF(gus.Lock_tables_priv='Y','LOCK TABLES',NULL),
                    IF(gus.Execute_priv='Y','EXECUTE',NULL),
                    IF(gus.Repl_slave_priv='Y','REPLICATION SLAVE',NULL),
                    IF(gus.Repl_client_priv='Y','REPLICATION CLIENT',NULL),
                    IF(gus.Create_view_priv='Y','CREATE VIEW',NULL),
                    IF(gus.Show_view_priv='Y','SHOW VIEW',NULL),
                    IF(gus.Create_routine_priv='Y','CREATE ROUTINE',NULL),
                    IF(gus.Alter_routine_priv='Y','ALTER ROUTINE',NULL),
                    IF(gus.Create_user_priv='Y','CREATE USER',NULL),
                    IF(gus.Event_priv='Y','EVENT',NULL),
                    IF(gus.Trigger_priv='Y','TRIGGER',NULL),
                    IF(gus.Create_tablespace_priv='Y','CREATE TABLESPACE',NULL)
                )
            )
        ),
        " ON *.* TO '",gus.User,"'@'",gus.Host,"' REQUIRE ",
        CASE gus.ssl_type
            WHEN 'ANY' THEN
                "SSL "
            WHEN 'X509' THEN
                "X509 "
            WHEN 'SPECIFIED' THEN
                CONCAT_WS("AND ",
                    IF((LENGTH(gus.ssl_cipher)>0),CONCAT("CIPHER '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL),
                    IF((LENGTH(gus.x509_issuer)>0),CONCAT("ISSUER '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL),
                    IF((LENGTH(gus.x509_subject)>0),CONCAT("SUBJECT '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL)
                )
            ELSE "NONE "
        END,
        "WITH ",
        IF(gus.Grant_priv='Y',"GRANT OPTION ",""),
        "MAX_QUERIES_PER_HOUR ",gus.max_questions," ",
        "MAX_CONNECTIONS_PER_HOUR ",gus.max_connections," ",
        "MAX_UPDATES_PER_HOUR ",gus.max_updates," ",
        "MAX_USER_CONNECTIONS ",gus.max_user_connections,
        ";"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.user gus;

Hur man skapar en mysql-användare

Proceduren för att skapa användare liknar Oracle. Det enklaste exemplet kan vara:

CREATE user 'username'@'hostname' identified by 'password';
GRANT privilege_name on *.* TO 'username'@'hostname';

Möjligheten att bevilja och skapa på en rad med:

GRANT privilege_name  ON *.* TO 'username'@'hostname' identified by 'password';

har tagits bort i MySQL 8.0.

Hur startar och stoppar jag MySQL?

Du kan stoppa och starta MySQL med tjänsten.

Det faktiska kommandot beror på Linux-distributionen och tjänstens namn.

Nedan kan du hitta ett exempel med tjänstens namn mysqld.

Ubuntu

/etc/init.d/mysqld start 
/etc/init.d/mysqld stop 
/etc/init.d/mysqld restart

RedHat/Centos

service mysqld start 
service mysqld stop 
service mysqld restart
systemctl start mysqld.service
systemctl stop mysqld.service
systemctl restart mysqld.service

Var finns MySQL-serverkonfigurationsdata?

Konfigurationen lagras i filen my.cnf.

Fram till version 8.0 krävde varje dynamisk inställningsändring som skulle finnas kvar efter en omstart en manuell uppdatering av my.cnf-filen. I likhet med Oracles scope=both kan du ändra värden med det beständiga alternativet.

mysql> SET PERSIST max_connections = 1000;
mysql> SET @@PERSIST.max_connections = 1000;

För äldre versioner använd:

mysql> SET GLOBAL max_connections = 1000;
$ vi /etc/mysql/my.cnf
SET GLOBAL max_connections = 1000;

Hur säkerhetskopierar jag MySQL?

Det finns två sätt att utföra en mysql-säkerhetskopia.

För mindre databaser eller mindre selektiva säkerhetskopior kan du använda kommandot mysqldump.

Databassäkerhetskopiering med mysqldump (logisk säkerhetskopia):

mysqldump -uuser -p --databases db_name --routines --events --single-transaction | gzip > db_name_backup.sql.gz

xtrabackup, mariabackup (hot binary backup)

Den föredragna metoden är att använda xtrabackup eller mariabackup, externa verktyg för att köra heta binära säkerhetskopior.

Oracle erbjuder het binär säkerhetskopiering i den betalda versionen som heter MySQL Enterprise Edition.

mariabackup --user=root --password=PASSWORD --backup --target-dir=/u01/backups/

Ström säkerhetskopiering till annan server

Starta en lyssnare på den externa servern på den föredragna porten (i detta exempel 1984)

nc -l 1984 | pigz -cd - | pv | xbstream -x -C /u01/backups

Kör säkerhetskopiering och överföring till extern värd

innobackupex --user=root --password=PASSWORD --stream=xbstream /var/tmp | pigz  | pv | nc external_host.com 1984

Kopiera användarbehörighet

Det behövs ofta för att kopiera användarbehörighet och överföra dem till de andra servrarna.

Det rekommenderade sättet att göra detta är att använda pt-show-grants.

pt-show-grants > /u01/backups

Hur återställer jag MySQL?

Logisk säkerhetskopieringsåterställning

MySQLdump skapar SQL-filen, som kan köras med källkommandot.

För att behålla loggfilen för körningen, använd kommandot tee.

mysql> tee dump.log
mysql> source mysqldump.sql

Binär säkerhetskopieringsåterställning (xtrabackup/mariabackup)

För att återställa MySQL från den binära säkerhetskopian måste du först återställa filerna och sedan använda loggfilerna.

Du kan jämföra den här processen för att återställa och återställa i Oracle.

xtrabackup --copy-back --target-dir=/var/lib/data
innobackupex --apply-log --use-memory=[values in MB or GB] /var/lib/data

Förhoppningsvis ger dessa tips en bra översikt över hur man utför grundläggande administrativa uppgifter.


  1. Problem med UTF-8-tecken; det jag ser är inte det jag har lagrat

  2. Vad är subqueries i oracle

  3. Hur man lägger till ett sidhuvud och en sidfot i ett formulär i Microsoft Access

  4. Introduktion till Väntestatistik