it-swarm-eu.dev

Upravit DEFINER na mnoha pohledech

Mám problémy zálohování mých databází po aktualizaci. Pokoušel jsem se na svém systému a snažil se přijít na to, proč. Jeden dotaz, který jsem spustil, vrátil tento výsledek.

Got error: 1449: The user specified as a definer ('cittool'@'%') does not exist when using LOCK TABLES

Po nějakém prozkoumání se zdá, že definer pro tato zobrazení je starý účet vývojáře, který byl vyčištěn ze systému. Databáze a pohledy s tímto problémem se používají velmi zřídka a většina z nich se uchovává pro účely archivace.

K dispozici je asi 40 zhlédnutí s definerem, který již neexistuje. Existuje snadný způsob, jak změnit definer na jiný účet u všeho najednou? Existuje způsob, jak přimět mysqldump, aby jednoduše vypustil všechna zobrazení do souboru, abych mohl tento soubor upravit a znovu zobrazit?

27
Zoredache

Vytvořte textový soubor se všemi definicemi pohledu:

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

Odtud upravujete AllMyViews.sql. Poté zrušte zobrazení

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

Po úpravě je AllMyViews.sql znovu načtěte

mysql -uusername -ppassword -A < AllMyViews.sql

Pokusit se !!!

14
RolandoMySQLDBA

Můžete použít ALTER VIEW ve spojení s informační schéma . Zmínili jste se o jeho uložení do textového souboru, takže asi něco takového:

SELECT CONCAT("ALTER DEFINER=`youruser`@`Host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

Promíchejte to s příkazovým řádkem mysql (za předpokladu, že * nix, není obeznámen s Windows):

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

Sidenote: Nemůžete přímo změnit položky information_schema . Poznámka 2: Funguje to pouze pro jednu databázi najednou, pokud vynecháte WHERE table_schema, musíte mezi každý vložit příkazy USE.

26
Derek Downey

Automatizací Derekova řešení se tím DEFINER změní na [email protected] a nastavte SQL SECURITY INVOKER (ujistěte se, že chcete první!) ve všech zobrazeních ve všech databázích:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

VAROVÁNÍ: ujistěte se, že jste provedli úplnou zálohu mysql (např. Zastavením mysqld a zálohováním všech souborů v/var/lib/mysql), než jej spustíte - jen v případě ... Fungovalo to pro já, ale YMMV.

měli byste také zkontrolovat všechny své tabulky/zobrazení pomocí:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

nemělo by se již stěžovat na neplatná definice v názorech.

3
Matija Nalis

Exportovat všechna zobrazení databáze <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

nebo:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Upravit views.sql (změnit definer) a znovu je vytvořit:

cat views.sql | mysql <DB>

Určete -u a -p v případě potřeby přepne.

3
x-yuri

Vytvořil jsem jednoduchý python skript, který nahrazuje produkční db definer místním db definer. Tento skript upraví soubory výpisu a automaticky importuje zadané databáze.

GIT repo: https://github.com/mjakal/db-auto-import

0
Martin