it-swarm.asia

Ubah DEFINER pada Banyak Tampilan

Saya mengalami masalah mencadangkan basis data saya setelah pembaruan. Saya telah mencari-cari di sistem saya mencoba mencari tahu mengapa. Satu permintaan yang saya jalankan mengembalikan hasil ini.

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

Setelah beberapa penyelidikan, tampaknya definisi untuk pandangan ini adalah akun pengembang lama yang telah dihapus dari sistem. Basis data dan pandangan dengan masalah ini jarang digunakan, dan sebagian besar disimpan untuk keperluan arsip.

Ada sekitar 40 tampilan dengan definisi yang tidak ada lagi. Apakah ada cara mudah untuk mengubah definisi ke akun yang berbeda pada semuanya sekaligus? Apakah ada cara untuk mendapatkan mysqldump dengan hanya membuang semua tampilan ke file sehingga saya bisa mengedit file itu dan membuat ulang tampilan?

27
Zoredache

Buat file teks dengan semua definisi tampilan:

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

Anda mengedit AllMyViews.sql dari sana. Lalu, Jatuhkan Tampilan

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

Setelah mengedit AllMyViews.sql, muat ulang

mysql -uusername -ppassword -A < AllMyViews.sql

Cobalah !!!

14
RolandoMySQLDBA

Anda dapat menggunakan ALTER VIEW bersamaan dengan skema informasi . Anda menyebutkan membuangnya ke file teks, jadi mungkin seperti ini:

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

Campurkan ini dengan baris perintah mysql (dengan asumsi * nix, tidak terbiasa dengan windows):

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

Sidenote: Anda tidak dapat mengubah entri information_schema secara langsung . Note2: Ini hanya berfungsi untuk satu database pada satu waktu, jika Anda pergi dari WHERE table_schema Anda harus memasukkan perintah USE antara masing-masing.

26
Derek Downey

Mengotomatiskan pada solusi Derek, ini akan mengubah DEFINER menjadi [email protected] dan atur SQL SECURITY INVOKER (pastikan Anda menginginkannya terlebih dahulu!) di semua tampilan di semua basis data:

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

PERINGATAN: pastikan Anda telah membuat cadangan mysql penuh (mis. Dengan menghentikan mysqld, dan mencadangkan semua file di/var/lib/mysql) sebelum Anda menjalankannya - untuk berjaga-jaga ... Ini berfungsi untuk saya, tapi YMMV.

anda juga harus memeriksa semua tabel/tampilan Anda dengan:

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'

seharusnya tidak lagi mengeluh tentang definisi yang tidak valid dalam tampilan.

3
Matija Nalis

Ekspor semua tampilan basis data <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

atau:

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

Edit views.sql (ubah definisi) dan buat ulang:

cat views.sql | mysql <DB>

Tentukan -u dan -p beralih jika perlu.

3
x-yuri

Saya membuat script sederhana python yang menggantikan produksi db definer dengan lokal db definer. Script ini akan memodifikasi file dump dan secara otomatis mengimpor database yang ditentukan.

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

0
Martin