Ошибка при массовой загрузке на MySQL, размещенную на AWS

0

У меня установлено соединение с MySQL, размещенным на AWS. В настоящее время для массовой загрузки я использую функцию DBI dbWriteTable. Недостатком является то, что вставка data.frame с 10 тыс. Наблюдений занимает 5 минут. Я решил попробовать использовать запрос LOAD DATA INFILE, чтобы сократить время, необходимое для загрузки большого массива данных. Однако я получаю сообщение об ошибке, в котором говорится, что моему текущему идентификатору пользователя запрещено выполнять такие команды.

Ниже приведен код, который я попробовал, а затем сообщение об ошибке.

library(RMariaDB)
library(DBI)

con = dbConnect(MariaDB(),
            dbname = "testing123",
            host = "********",
            user = "*****",
            password = "******", 
            port = 3306 
 )

dbWriteTable(con, "mt", mtcars)

##create a data frame that has about 6000 rows
mtcars.extended = cbind(mtcars, rep(unname(unlist(mtcars)), 20))

#use the standard dbwritetable to append the rows
dbWriteTable(con, "mt", mtcars, append = T)
###This took 5 minutes but worked

##So I decided to save mtcars.extended as a csv and try the bulk 
upload
write.table(mtcars.extended, "mtext.csv")

query = "LOAD DATA INFILE 'mtext.csv' INTO TABLE mt"

dbGetQuery(con, query)
Error in result_create(conn@ptr, statement, is_statement) : 
Error executing query: Access denied for user 'testing123'@'%' 
(using password: YES)

dbSendStatement(con, query)
 Error in result_create(conn@ptr, statement, is_statement) : 
 Error executing query: Access denied for user 'testing123'@'%' 
 (using password: YES)

Мне бы хотелось, чтобы это произошло - относительно быстрая вставка в таблицу данных "mt" без перезаписи. Но, похоже, AWS не позволяет мне делать массовые загрузки.

Благодаря Матусу я решил проблему. Единственная проблема в том, что я получаю NA при массовой загрузке.

  query = "LOAD DATA LOCAL INFILE 'mt.csv' INTO TABLE mtcars"

Изображение 174551

Теги:
amazon-web-services
amazon-s3
mariadb

1 ответ

0

Я предполагаю, что вы говорите о RDS MySQL. Эта ошибка разрешения LOAD DATA INFILE при попытке выполнить запрос LOAD DATA INFILE просто потому, что у вас нет полного разрешения root для управляемой системы RDS.

LOAD DATA LOCAL INFILE этого вы можете попытаться запустить LOAD DATA LOCAL INFILE --local-infile=1 установив для флага --local-infile=1 значение true. Это должно работать, так как вам не нужны эти разрешения для выполнения этого запроса.

  • 0
    Спасибо за ответ Matus, я новичок в SQL, не могли бы вы объяснить, почему я хотел бы установить --local-infile = 1? Вы правы насчет RDS MySQL. Также есть ли способ получить полное разрешение root (как это моя база данных) или это премиум-сервис?
  • 0
    @JordanWrong --local-infile=1 просто включает локальную загрузку данных, которая вам нужна, если вы хотите использовать вышеупомянутый запрос (если он еще не был включен). Нет, невозможно получить полные права root, поскольку RDS является управляемой службой, поэтому они не позволяют вам делать все, что вы хотите. Если вам это действительно нужно, вы можете запустить экземпляр EC2 и установить MySQL поверх него.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню